blob: 4e64a681c2fca1b5288ee397a678daf53564dde6 [file] [log] [blame]
James Kuszmaul313e9ce2024-02-11 17:47:33 -08001// Provides a plot for debugging drivetrain-related issues.
2import {AosPlotter} from '../../aos/network/www/aos_plotter';
3import {ImuMessageHandler} from '../../frc971/wpilib/imu_plot_utils';
4import * as proxy from '../../aos/network/www/proxy';
5import {BLUE, BROWN, CYAN, GREEN, PINK, RED, WHITE} from '../../aos/network/www/colors';
6
7import Connection = proxy.Connection;
8
9const TIME = AosPlotter.TIME;
10const DEFAULT_WIDTH = AosPlotter.DEFAULT_WIDTH;
11const DEFAULT_HEIGHT = AosPlotter.DEFAULT_HEIGHT;
12
13export function plotLocalizer(conn: Connection, element: Element): void {
14 const aosPlotter = new AosPlotter(conn);
15
16 const position = aosPlotter.addMessageSource("/drivetrain",
17 "frc971.control_loops.drivetrain.Position");
18 const status = aosPlotter.addMessageSource(
19 '/drivetrain', 'frc971.control_loops.drivetrain.Status');
20 const output = aosPlotter.addMessageSource(
21 '/drivetrain', 'frc971.control_loops.drivetrain.Output');
22 const localizer = aosPlotter.addMessageSource(
23 '/localizer', 'y2024.localizer.Status');
James Kuszmaul2f72b2c2024-03-17 17:14:48 -070024 const rio_inputs = aosPlotter.addMessageSource(
25 '/drivetrain', 'frc971.control_loops.drivetrain.RioLocalizerInputs');
James Kuszmaul313e9ce2024-02-11 17:47:33 -080026 const imu = aosPlotter.addRawMessageSource(
27 '/localizer', 'frc971.IMUValuesBatch',
28 new ImuMessageHandler(conn.getSchema('frc971.IMUValuesBatch')));
29
30 // Drivetrain Status estimated relative position
31 const positionPlot = aosPlotter.addPlot(element);
32 positionPlot.plot.getAxisLabels().setTitle("Estimated Relative Position " +
33 "of the Drivetrain");
34 positionPlot.plot.getAxisLabels().setXLabel(TIME);
35 positionPlot.plot.getAxisLabels().setYLabel("Relative Position (m)");
36 const leftPosition =
37 positionPlot.addMessageLine(status, ["estimated_left_position"]);
38 leftPosition.setColor(RED);
39 const rightPosition =
40 positionPlot.addMessageLine(status, ["estimated_right_position"]);
41 rightPosition.setColor(GREEN);
42 positionPlot.addMessageLine(position, ['left_encoder'])
43 .setColor(BROWN)
44 .setDrawLine(false);
45 positionPlot.addMessageLine(position, ['right_encoder'])
46 .setColor(CYAN)
47 .setDrawLine(false);
James Kuszmaul2f72b2c2024-03-17 17:14:48 -070048 positionPlot.addMessageLine(rio_inputs, ['left_encoder'])
49 .setColor(BROWN)
50 .setDrawLine(false);
51 positionPlot.addMessageLine(rio_inputs, ['right_encoder'])
52 .setColor(CYAN)
53 .setDrawLine(false);
James Kuszmaul313e9ce2024-02-11 17:47:33 -080054
55
56 // Drivetrain Velocities
57 const velocityPlot = aosPlotter.addPlot(element);
58 velocityPlot.plot.getAxisLabels().setTitle('Velocity Plots');
59 velocityPlot.plot.getAxisLabels().setXLabel(TIME);
60 velocityPlot.plot.getAxisLabels().setYLabel('Wheel Velocity (m/s)');
61
62 const leftVelocity =
63 velocityPlot.addMessageLine(status, ['estimated_left_velocity']);
64 leftVelocity.setColor(RED);
65 const rightVelocity =
66 velocityPlot.addMessageLine(status, ['estimated_right_velocity']);
67 rightVelocity.setColor(GREEN);
68
69 const leftSpeed = velocityPlot.addMessageLine(position, ["left_speed"]);
70 leftSpeed.setColor(BLUE);
71 const rightSpeed = velocityPlot.addMessageLine(position, ["right_speed"]);
72 rightSpeed.setColor(BROWN);
73
74 const ekfLeftVelocity = velocityPlot.addMessageLine(
75 localizer, ['state', 'left_velocity']);
76 ekfLeftVelocity.setColor(RED);
77 ekfLeftVelocity.setPointSize(0.0);
78 const ekfRightVelocity = velocityPlot.addMessageLine(
79 localizer, ['state', 'right_velocity']);
80 ekfRightVelocity.setColor(GREEN);
81 ekfRightVelocity.setPointSize(0.0);
82
83 // Lateral velocity
84 const lateralPlot = aosPlotter.addPlot(element);
85 lateralPlot.plot.getAxisLabels().setTitle('Lateral Velocity');
86 lateralPlot.plot.getAxisLabels().setXLabel(TIME);
87 lateralPlot.plot.getAxisLabels().setYLabel('Velocity (m/s)');
88
89 lateralPlot.addMessageLine(localizer, ['state', 'lateral_velocity']).setColor(CYAN);
90
91 // Drivetrain Voltage
92 const voltagePlot = aosPlotter.addPlot(element);
93 voltagePlot.plot.getAxisLabels().setTitle('Voltage Plots');
94 voltagePlot.plot.getAxisLabels().setXLabel(TIME);
95 voltagePlot.plot.getAxisLabels().setYLabel('Voltage (V)')
96
97 voltagePlot.addMessageLine(localizer, ['state', 'left_voltage_error'])
98 .setColor(RED)
99 .setDrawLine(false);
100 voltagePlot.addMessageLine(localizer, ['state', 'right_voltage_error'])
101 .setColor(GREEN)
102 .setDrawLine(false);
103 voltagePlot.addMessageLine(output, ['left_voltage'])
104 .setColor(RED)
105 .setPointSize(0);
106 voltagePlot.addMessageLine(output, ['right_voltage'])
107 .setColor(GREEN)
108 .setPointSize(0);
James Kuszmaul2f72b2c2024-03-17 17:14:48 -0700109 voltagePlot.addMessageLine(rio_inputs, ['left_voltage'])
110 .setColor(RED)
111 .setDrawLine(false);
112 voltagePlot.addMessageLine(rio_inputs, ['right_voltage'])
113 .setColor(GREEN)
114 .setDrawLine(false);
James Kuszmaul313e9ce2024-02-11 17:47:33 -0800115
116 // Heading
117 const yawPlot = aosPlotter.addPlot(element);
118 yawPlot.plot.getAxisLabels().setTitle('Robot Yaw');
119 yawPlot.plot.getAxisLabels().setXLabel(TIME);
120 yawPlot.plot.getAxisLabels().setYLabel('Yaw (rad)');
121
122 yawPlot.addMessageLine(status, ['localizer', 'theta']).setColor(GREEN);
123
124 yawPlot.addMessageLine(localizer, ['down_estimator', 'yaw']).setColor(BLUE);
125
126 yawPlot.addMessageLine(localizer, ['state', 'theta']).setColor(RED);
127
128 // Pitch/Roll
129 const orientationPlot = aosPlotter.addPlot(element);
130 orientationPlot.plot.getAxisLabels().setTitle('Orientation');
131 orientationPlot.plot.getAxisLabels().setXLabel(TIME);
132 orientationPlot.plot.getAxisLabels().setYLabel('Angle (rad)');
133
134 orientationPlot.addMessageLine(localizer, ['down_estimator', 'lateral_pitch'])
135 .setColor(RED)
136 .setLabel('roll');
137 orientationPlot
138 .addMessageLine(localizer, ['down_estimator', 'longitudinal_pitch'])
139 .setColor(GREEN)
140 .setLabel('pitch');
141
142 const stillPlot = aosPlotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT / 3]);
143 stillPlot.plot.getAxisLabels().setTitle('Still Plot');
144 stillPlot.plot.getAxisLabels().setXLabel(TIME);
145 stillPlot.plot.getAxisLabels().setYLabel('bool, g\'s');
146 stillPlot.plot.setDefaultYRange([-0.1, 1.1]);
147
148 stillPlot.addMessageLine(localizer, ['down_estimator', 'gravity_magnitude'])
149 .setColor(WHITE)
150 .setDrawLine(false);
151
152 // Absolute X Position
153 const xPositionPlot = aosPlotter.addPlot(element);
154 xPositionPlot.plot.getAxisLabels().setTitle('X Position');
155 xPositionPlot.plot.getAxisLabels().setXLabel(TIME);
156 xPositionPlot.plot.getAxisLabels().setYLabel('X Position (m)');
157
158 xPositionPlot.addMessageLine(status, ['x']).setColor(RED);
159 xPositionPlot.addMessageLine(localizer, ['down_estimator', 'position_x'])
160 .setColor(BLUE);
161 xPositionPlot.addMessageLine(localizer, ['state', 'x']).setColor(CYAN);
162
163 // Absolute Y Position
164 const yPositionPlot = aosPlotter.addPlot(element);
165 yPositionPlot.plot.getAxisLabels().setTitle('Y Position');
166 yPositionPlot.plot.getAxisLabels().setXLabel(TIME);
167 yPositionPlot.plot.getAxisLabels().setYLabel('Y Position (m)');
168
169 const localizerY = yPositionPlot.addMessageLine(status, ['y']);
170 localizerY.setColor(RED);
171 yPositionPlot.addMessageLine(localizer, ['down_estimator', 'position_y'])
172 .setColor(BLUE);
173 yPositionPlot.addMessageLine(localizer, ['state', 'y']).setColor(CYAN);
174
175 // Gyro
176 const gyroPlot = aosPlotter.addPlot(element);
177 gyroPlot.plot.getAxisLabels().setTitle('Gyro Readings');
178 gyroPlot.plot.getAxisLabels().setYLabel('Angular Velocity (rad / sec)');
179 gyroPlot.plot.getAxisLabels().setXLabel('Monotonic Reading Time (sec)');
180
181 const gyroX = gyroPlot.addMessageLine(imu, ['gyro_x']);
182 gyroX.setColor(RED);
183 const gyroY = gyroPlot.addMessageLine(imu, ['gyro_y']);
184 gyroY.setColor(GREEN);
185 const gyroZ = gyroPlot.addMessageLine(imu, ['gyro_z']);
186 gyroZ.setColor(BLUE);
187
188
189 const timingPlot =
190 aosPlotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT]);
191 timingPlot.plot.getAxisLabels().setTitle('Fault Counting');
192 timingPlot.plot.getAxisLabels().setXLabel(TIME);
193
194 timingPlot
195 .addMessageLine(
196 localizer, ['imu', 'imu_failures', 'imu_to_pico_checksum_mismatch'])
197 .setColor(BLUE)
198 .setDrawLine(false);
199
200 timingPlot
201 .addMessageLine(
202 localizer, ['imu', 'imu_failures', 'pico_to_pi_checksum_mismatch'])
203 .setColor(RED)
204 .setDrawLine(false);
205
206 timingPlot
207 .addMessageLine(
208 localizer, ['imu', 'imu_failures', 'other_zeroing_faults'])
209 .setColor(CYAN)
210 .setDrawLine(false);
211
212 timingPlot
213 .addMessageLine(
214 localizer, ['imu', 'imu_failures', 'missed_messages'])
215 .setColor(PINK)
216 .setDrawLine(false);
217}