blob: ce348e7377ddab7e6fb55dfb6019f16343ec2791 [file] [log] [blame]
James Kuszmaulf7c8a092022-02-12 16:46:09 -08001// Provides a plot for debugging drivetrain-related issues.
2import {AosPlotter} from 'org_frc971/aos/network/www/aos_plotter';
3import {ImuMessageHandler} from 'org_frc971/frc971/wpilib/imu_plot_utils';
4import * as proxy from 'org_frc971/aos/network/www/proxy';
5import {BLUE, BROWN, CYAN, GREEN, PINK, RED, WHITE} from 'org_frc971/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', 'frc971.controls.LocalizerStatus');
24 const imu = aosPlotter.addRawMessageSource(
25 '/drivetrain', 'frc971.IMUValuesBatch',
26 new ImuMessageHandler(conn.getSchema('frc971.IMUValuesBatch')));
27
28 // Drivetrain Status estimated relative position
29 const positionPlot = aosPlotter.addPlot(element);
30 positionPlot.plot.getAxisLabels().setTitle("Estimated Relative Position " +
31 "of the Drivetrain");
32 positionPlot.plot.getAxisLabels().setXLabel(TIME);
33 positionPlot.plot.getAxisLabels().setYLabel("Relative Position (m)");
34 const leftPosition =
35 positionPlot.addMessageLine(status, ["estimated_left_position"]);
36 leftPosition.setColor(RED);
37 const rightPosition =
38 positionPlot.addMessageLine(status, ["estimated_right_position"]);
39 rightPosition.setColor(GREEN);
40 positionPlot
41 .addMessageLine(localizer, ['model_based', 'model_state', 'left_encoder'])
42 .setColor(BROWN)
43 .setPointSize(0.0);
44 positionPlot
45 .addMessageLine(localizer, ['model_based', 'model_state', 'right_encoder'])
46 .setColor(CYAN)
47 .setPointSize(0.0);
48 positionPlot.addMessageLine(position, ['left_encoder'])
49 .setColor(BROWN)
50 .setDrawLine(false);
51 positionPlot.addMessageLine(position, ['right_encoder'])
52 .setColor(CYAN)
53 .setDrawLine(false);
54
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, ['model_based', 'model_state', 'left_velocity']);
76 ekfLeftVelocity.setColor(RED);
77 ekfLeftVelocity.setPointSize(0.0);
78 const ekfRightVelocity = velocityPlot.addMessageLine(
79 localizer, ['model_based', 'model_state', 'right_velocity']);
80 ekfRightVelocity.setColor(GREEN);
81 ekfRightVelocity.setPointSize(0.0);
82
83 velocityPlot
84 .addMessageLine(
85 localizer, ['model_based', 'oldest_model_state', 'left_velocity'])
86 .setColor(RED)
87 .setDrawLine(false);
88
89 velocityPlot
90 .addMessageLine(
91 localizer, ['model_based', 'oldest_model_state', 'right_velocity'])
92 .setColor(GREEN)
93 .setDrawLine(false);
94
95 const splineVelocityOffset =
96 velocityPlot
97 .addMessageLine(status, ['localizer', 'longitudinal_velocity_offset'])
98 .setColor(BROWN)
99 .setPointSize(0.0);
100
101 const splineLateralVelocity =
102 velocityPlot.addMessageLine(status, ['localizer', 'lateral_velocity'])
103 .setColor(PINK)
104 .setPointSize(0.0);
105
106 // Drivetrain Voltage
107 const voltagePlot = aosPlotter.addPlot(element);
108 voltagePlot.plot.getAxisLabels().setTitle('Voltage Plots');
109 voltagePlot.plot.getAxisLabels().setXLabel(TIME);
110 voltagePlot.plot.getAxisLabels().setYLabel('Voltage (V)')
111
112 voltagePlot.addMessageLine(localizer, ['model_based', 'model_state', 'left_voltage_error'])
113 .setColor(RED)
114 .setDrawLine(false);
115 voltagePlot.addMessageLine(localizer, ['model_based', 'model_state', 'right_voltage_error'])
116 .setColor(GREEN)
117 .setDrawLine(false);
118 voltagePlot.addMessageLine(output, ['left_voltage'])
119 .setColor(RED)
120 .setPointSize(0);
121 voltagePlot.addMessageLine(output, ['right_voltage'])
122 .setColor(GREEN)
123 .setPointSize(0);
124
125 // Heading
126 const yawPlot = aosPlotter.addPlot(element);
127 yawPlot.plot.getAxisLabels().setTitle('Robot Yaw');
128 yawPlot.plot.getAxisLabels().setXLabel(TIME);
129 yawPlot.plot.getAxisLabels().setYLabel('Yaw (rad)');
130
131 yawPlot.addMessageLine(status, ['localizer', 'theta']).setColor(GREEN);
132
133 yawPlot.addMessageLine(status, ['down_estimator', 'yaw']).setColor(BLUE);
134
135 yawPlot.addMessageLine(localizer, ['model_based', 'theta']).setColor(RED);
136
137 // Pitch/Roll
138 const orientationPlot = aosPlotter.addPlot(element);
139 orientationPlot.plot.getAxisLabels().setTitle('Orientation');
140 orientationPlot.plot.getAxisLabels().setXLabel(TIME);
141 orientationPlot.plot.getAxisLabels().setYLabel('Angle (rad)');
142
143 orientationPlot.addMessageLine(localizer, ['model_based', 'down_estimator', 'lateral_pitch'])
144 .setColor(RED)
145 .setLabel('roll');
146 orientationPlot
147 .addMessageLine(localizer, ['model_based', 'down_estimator', 'longitudinal_pitch'])
148 .setColor(GREEN)
149 .setLabel('pitch');
150
151 const stillPlot = aosPlotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT / 3]);
152 stillPlot.plot.getAxisLabels().setTitle('Still Plot');
153 stillPlot.plot.getAxisLabels().setXLabel(TIME);
154 stillPlot.plot.getAxisLabels().setYLabel('bool, g\'s');
155 stillPlot.plot.setDefaultYRange([-0.1, 1.1]);
156
157 stillPlot.addMessageLine(localizer, ['model_based', 'down_estimator', 'gravity_magnitude'])
158 .setColor(WHITE)
159 .setDrawLine(false);
160 stillPlot.addMessageLine(localizer, ['model_based', 'using_model'])
161 .setColor(PINK)
162 .setDrawLine(false);
163
164 // Accelerometer/Gravity
165 const accelPlot = aosPlotter.addPlot(element);
166 accelPlot.plot.getAxisLabels().setTitle('Absoluate Velocities')
167 accelPlot.plot.getAxisLabels().setYLabel('Velocity (m/s)');
168 accelPlot.plot.getAxisLabels().setXLabel('Monotonic Time (sec)');
169
170 accelPlot.addMessageLine(localizer, ['no_wheel_status', 'velocity_x'])
171 .setColor(PINK);
172 accelPlot.addMessageLine(localizer, ['no_wheel_status', 'velocity_y'])
173 .setColor(GREEN);
174 accelPlot.addMessageLine(localizer, ['no_wheel_status', 'velocity_z'])
175 .setColor(BLUE);
176
177 accelPlot.addMessageLine(localizer, ['model_based', 'accel_state', 'velocity_x'])
178 .setColor(RED)
179 .setDrawLine(false);
180 accelPlot.addMessageLine(localizer, ['model_based', 'accel_state', 'velocity_y'])
181 .setColor(GREEN)
182 .setDrawLine(false);
183
184 accelPlot.addMessageLine(localizer, ['model_based', 'oldest_accel_state', 'velocity_x'])
185 .setColor(RED)
186 .setPointSize(0);
187 accelPlot.addMessageLine(localizer, ['model_based', 'oldest_accel_state', 'velocity_y'])
188 .setColor(GREEN)
189 .setPointSize(0);
190
191 // Absolute X Position
192 const xPositionPlot = aosPlotter.addPlot(element);
193 xPositionPlot.plot.getAxisLabels().setTitle('X Position');
194 xPositionPlot.plot.getAxisLabels().setXLabel(TIME);
195 xPositionPlot.plot.getAxisLabels().setYLabel('X Position (m)');
196
197 xPositionPlot.addMessageLine(status, ['x']).setColor(RED);
198 xPositionPlot.addMessageLine(status, ['down_estimator', 'position_x'])
199 .setColor(BLUE);
200 xPositionPlot.addMessageLine(localizer, ['no_wheel_status', 'x']).setColor(GREEN);
201 xPositionPlot.addMessageLine(localizer, ['model_based', 'x']).setColor(CYAN);
202
203 xPositionPlot.plot.setDefaultYRange([0.0, 0.5]);
204
205 // Absolute Y Position
206 const yPositionPlot = aosPlotter.addPlot(element);
207 yPositionPlot.plot.getAxisLabels().setTitle('Y Position');
208 yPositionPlot.plot.getAxisLabels().setXLabel(TIME);
209 yPositionPlot.plot.getAxisLabels().setYLabel('Y Position (m)');
210
211 const localizerY = yPositionPlot.addMessageLine(status, ['y']);
212 localizerY.setColor(RED);
213 yPositionPlot.addMessageLine(status, ['down_estimator', 'position_y'])
214 .setColor(BLUE);
215 yPositionPlot.addMessageLine(localizer, ['no_wheel_status', 'y']).setColor(GREEN);
216 yPositionPlot.addMessageLine(localizer, ['model_based', 'y']).setColor(CYAN);
217
218 // Gyro
219 const gyroPlot = aosPlotter.addPlot(element);
220 gyroPlot.plot.getAxisLabels().setTitle('Gyro Readings');
221 gyroPlot.plot.getAxisLabels().setYLabel('Angular Velocity (rad / sec)');
222 gyroPlot.plot.getAxisLabels().setXLabel('Monotonic Reading Time (sec)');
223
224 const gyroX = gyroPlot.addMessageLine(imu, ['gyro_x']);
225 gyroX.setColor(RED);
226 const gyroY = gyroPlot.addMessageLine(imu, ['gyro_y']);
227 gyroY.setColor(GREEN);
228 const gyroZ = gyroPlot.addMessageLine(imu, ['gyro_z']);
229 gyroZ.setColor(BLUE);
230
231 const impliedAccelPlot =
232 aosPlotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT]);
233 impliedAccelPlot.plot.getAxisLabels().setTitle('Implied Accelerations');
234 impliedAccelPlot.plot.getAxisLabels().setXLabel(TIME);
235
236 impliedAccelPlot.addMessageLine(localizer, ['model_based', 'implied_accel_z'])
237 .setColor(BLUE);
238 impliedAccelPlot.addMessageLine(localizer, ['model_based', 'implied_accel_y'])
239 .setColor(GREEN);
240 impliedAccelPlot.addMessageLine(localizer, ['model_based', 'implied_accel_x'])
241 .setColor(RED);
242
243 const costPlot =
244 aosPlotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT]);
245 costPlot.plot.getAxisLabels().setTitle('Costs');
246 costPlot.plot.getAxisLabels().setXLabel(TIME);
247
248 costPlot.addMessageLine(localizer, ['model_based', 'residual'])
249 .setColor(RED)
250 .setPointSize(0);
251
252 costPlot.addMessageLine(localizer, ['model_based', 'filtered_residual'])
253 .setColor(BLUE)
254 .setPointSize(0);
255
256 costPlot.addMessageLine(localizer, ['model_based', 'velocity_residual'])
257 .setColor(GREEN)
258 .setPointSize(0);
259
260 costPlot.addMessageLine(localizer, ['model_based', 'theta_rate_residual'])
261 .setColor(BROWN)
262 .setPointSize(0);
263
264 costPlot.addMessageLine(localizer, ['model_based', 'accel_residual'])
265 .setColor(CYAN)
266 .setPointSize(0);
267}