blob: 0f103f3369eca17d8672e08c5dea9ff827af1a8e [file] [log] [blame]
James Kuszmaul9be2e1c2024-07-06 13:43:24 -07001// Provides a plot for debugging robot state-related issues.
2import {AosPlotter, MessageHandler} from '../../aos/network/www/aos_plotter';
3import {BLUE, BROWN, CYAN, GREEN, PINK, RED, WHITE} from '../../aos/network/www/colors';
4import * as proxy from '../../aos/network/www/proxy';
5
6import Connection = proxy.Connection;
7
8const TIME = AosPlotter.TIME;
9const DEFAULT_WIDTH = AosPlotter.DEFAULT_WIDTH * 2;
10const DEFAULT_HEIGHT = AosPlotter.DEFAULT_HEIGHT * 1;
11
12function plotModule(
13 name: string, plotter: AosPlotter, element: Element, position: MessageHandler, positionName: string[],
14 status: MessageHandler, statusName: string[], output: MessageHandler, outputName: string[]): void {
15 {
16 const positionPlot =
17 plotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT]);
18 positionPlot.plot.getAxisLabels().setTitle(name + ' Position');
19 positionPlot.plot.getAxisLabels().setXLabel(TIME);
20 positionPlot.plot.getAxisLabels().setYLabel('Position [rad,m]');
21 positionPlot.addMessageLine(position, positionName .concat( ['encoder']))
22 .setColor(RED);
23 positionPlot.addMessageLine(position, positionName .concat( ['absolute_encoder']))
24 .setColor(GREEN);
25 positionPlot
26 .addMessageLine(status, statusName .concat( [ 'estimator_state', 'position']))
27 .setColor(BROWN);
28 positionPlot.addMessageLine(status, statusName .concat( [ 'position']))
29 .setColor(WHITE);
30 }
31 {
32 const statesPlot =
33 plotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT / 2]);
34 statesPlot.plot.getAxisLabels().setTitle(name + ' State');
35 statesPlot.plot.getAxisLabels().setXLabel(TIME);
36 statesPlot.plot.getAxisLabels().setYLabel('[bool,ZeroingError]');
37 statesPlot.addMessageLine(status, statusName .concat( [ 'estopped'])).setColor(RED);
38 statesPlot.addMessageLine(
39 status, statusName.concat(['zeroed'])).setColor(GREEN);
40 statesPlot
41 .addMessageLine(status, statusName .concat( [ 'estimator_state', 'errors[]']))
42 .setColor(BLUE)
43 .setDrawLine(false);
44 }
45 {
46 const positionConvergencePlot =
47 plotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT]);
48 positionConvergencePlot.plot.getAxisLabels().setTitle(name + ' Position Goals');
49 positionConvergencePlot.plot.getAxisLabels().setXLabel(TIME);
50 positionConvergencePlot.plot.getAxisLabels().setYLabel('[rad,m]');
51 positionConvergencePlot.addMessageLine(status, statusName .concat( [ 'position']))
52 .setColor(RED);
53 positionConvergencePlot.addMessageLine(status, statusName .concat( [ 'goal_position']))
54 .setColor(GREEN);
55 positionConvergencePlot
56 .addMessageLine(status, statusName .concat( [ 'unprofiled_goal_position']))
57 .setColor(BROWN);
58 }
59 {
60 const velocityConvergencePlot =
61 plotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT]);
62 velocityConvergencePlot.plot.getAxisLabels().setTitle(name + ' Velocity Goals');
63 velocityConvergencePlot.plot.getAxisLabels().setXLabel(TIME);
64 velocityConvergencePlot.plot.getAxisLabels().setYLabel('[rad,m]');
65 velocityConvergencePlot.addMessageLine(status, statusName .concat( [ 'velocity']))
66 .setColor(RED);
67 velocityConvergencePlot.addMessageLine(status, statusName .concat( [ 'calculated_velocity']))
68 .setColor(RED).setDrawLine(false);
69 velocityConvergencePlot.addMessageLine(status, statusName .concat( [ 'goal_velocity']))
70 .setColor(GREEN);
71 velocityConvergencePlot
72 .addMessageLine(status, statusName .concat( [ 'unprofiled_goal_velocity']))
73 .setColor(BROWN);
74 }
75 {
76 const outputPlot =
77 plotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT]);
78 outputPlot.plot.getAxisLabels().setTitle(name + ' Outputs');
79 outputPlot.plot.getAxisLabels().setXLabel(TIME);
80 outputPlot.plot.getAxisLabels().setYLabel('[volts]');
81 outputPlot.addMessageLine(output, outputName)
82 .setColor(RED);
83 outputPlot.addMessageLine(status, statusName .concat( [ 'voltage_error']))
84 .setColor(GREEN);
85 outputPlot.addMessageLine(status, statusName .concat( [ 'position_power']))
86 .setColor(BLUE);
87 outputPlot.addMessageLine(status, statusName .concat( [ 'velocity_power']))
88 .setColor(BROWN);
89 outputPlot.addMessageLine(status, statusName .concat( [ 'feedforwards_power']))
90 .setColor(WHITE);
91 }
92}
93
94export function plotSwerve(conn: Connection, element: Element): void {
95 const aosPlotter = new AosPlotter(conn);
96 const robotState = aosPlotter.addMessageSource('/aos', 'aos.RobotState');
97
98 {
99 const robotStatePlot =
100 aosPlotter.addPlot(element, [DEFAULT_WIDTH, DEFAULT_HEIGHT]);
101 robotStatePlot.plot.getAxisLabels().setTitle('Robot State Plot');
102 robotStatePlot.plot.getAxisLabels().setXLabel(TIME);
103 robotStatePlot.plot.getAxisLabels().setYLabel('[bool]');
104 robotStatePlot.addMessageLine(robotState, ['outputs_enabled'])
105 .setColor(RED);
106 }
107
108 const goal = aosPlotter.addMessageSource(
109 '/drivetrain', 'frc971.control_loops.swerve.Goal');
110 const output = aosPlotter.addMessageSource(
111 '/drivetrain', 'frc971.control_loops.swerve.Output');
112 const status = aosPlotter.addMessageSource(
113 '/drivetrain', 'frc971.control_loops.swerve.Status');
114 const position = aosPlotter.addMessageSource(
115 '/drivetrain', 'frc971.control_loops.swerve.Position');
116
117 plotModule(
118 'Front Left', aosPlotter, element, position, ['front_left', 'rotation_position'], status, ['front_left_status', 'rotation'],
119 output, ['front_left_output', 'rotation_current']);
120 plotModule(
121 'Front Right', aosPlotter, element, position, ['front_right', 'rotation_position'], status, ['front_right_status', 'rotation'],
122 output, ['front_right_output', 'rotation_current']);
123 plotModule(
124 'Back Left', aosPlotter, element, position, ['back_left', 'rotation_position'], status, ['back_left_status', 'rotation'],
125 output, ['back_left_output', 'rotation_current']);
126 // TODO(james): Chrome runs out of WebGL canvasses when attempting to plot the final module....
127// plotModule(
128// 'Back Right', aosPlotter, element, position, ['back_right', 'rotation_position'], status, ['back_right_status', 'rotation'],
129// output, ['back_right_output', 'rotation_current']);
130}