blob: c7a307e28d83aef3fd0dc312cf9f4f69c5bb5244 [file] [log] [blame]
Comran Morshed5323ecb2015-12-26 20:50:55 +00001package frc971.control_loops;
Brian Silverman17f503e2015-08-02 18:17:18 -07002
John Park33858a32018-09-28 23:05:48 -07003import "aos/controls/control_loops.q";
Austin Schuhedbb64f2016-03-19 01:18:09 -07004import "frc971/control_loops/control_loops.q";
Austin Schuh093535c2016-03-05 23:21:00 -08005
Brian Silverman51091a02015-12-26 15:56:58 -08006// For logging information about what the code is doing with the shifters.
Brian Silverman17f503e2015-08-02 18:17:18 -07007struct GearLogging {
Brian Silverman51091a02015-12-26 15:56:58 -08008 // Which controller is being used.
Brian Silverman17f503e2015-08-02 18:17:18 -07009 int8_t controller_index;
Comran Morshed0bf200a2016-02-19 15:19:32 +000010
11 // Whether each loop for the drivetrain sides is the high-gear one.
Brian Silverman17f503e2015-08-02 18:17:18 -070012 bool left_loop_high;
13 bool right_loop_high;
Comran Morshed0bf200a2016-02-19 15:19:32 +000014
15 // The states of each drivetrain shifter.
Brian Silverman17f503e2015-08-02 18:17:18 -070016 int8_t left_state;
17 int8_t right_state;
18};
19
Brian Silverman51091a02015-12-26 15:56:58 -080020// For logging information about the state of the shifters.
Brian Silverman17f503e2015-08-02 18:17:18 -070021struct CIMLogging {
Comran Morshed0bf200a2016-02-19 15:19:32 +000022 // Whether the code thinks each drivetrain side is currently in gear.
Brian Silverman17f503e2015-08-02 18:17:18 -070023 bool left_in_gear;
24 bool right_in_gear;
Comran Morshed0bf200a2016-02-19 15:19:32 +000025
26 // The angular velocities (in rad/s, positive forward) the code thinks motors
27 // on each side of the drivetrain are moving at.
Brian Silverman17f503e2015-08-02 18:17:18 -070028 double left_motor_speed;
29 double right_motor_speed;
Comran Morshed0bf200a2016-02-19 15:19:32 +000030
31 // The velocity estimates for each drivetrain side of the robot (in m/s,
32 // positive forward) that can be used for shifting.
Brian Silverman17f503e2015-08-02 18:17:18 -070033 double left_velocity;
34 double right_velocity;
35};
36
Alex Perrycc3ee4c2019-02-09 21:20:41 -080037// For logging information about the state of the trajectory planning.
38struct TrajectoryLogging {
39 // state of planning the trajectory.
40 // 0: not currently planning
41 // 1: received a multispline to plan
42 // 2: Built the spline and planning.
43 // 3: Finished the plan and ready to excecute.
44 int8_t planning_state;
45
46 // State of the spline execution.
47 bool is_executing;
James Kuszmaul29e417d2019-04-13 10:03:35 -070048 // Whether we have finished the spline specified by current_spline_idx.
49 bool is_executed;
Alex Perrycc3ee4c2019-02-09 21:20:41 -080050
Austin Schuh6bcc2302019-03-23 22:28:06 -070051 // The handle of the goal spline. 0 means stop requested.
52 int32_t goal_spline_handle;
53 // Handle of the executing spline. -1 means none requested. If there was no
54 // spline executing when a spline finished optimizing, it will become the
55 // current spline even if we aren't ready to start yet.
Alex Perrycc3ee4c2019-02-09 21:20:41 -080056 int32_t current_spline_idx;
Austin Schuh6bcc2302019-03-23 22:28:06 -070057 // Handle of the spline that is being optimized and staged.
58 int32_t planning_spline_idx;
Alex Perrycc3ee4c2019-02-09 21:20:41 -080059
60 // Expected position and velocity on the spline
61 float x;
62 float y;
63 float theta;
64 float left_velocity;
65 float right_velocity;
James Kuszmaul5a543412019-04-13 15:49:42 -070066 float distance_remaining;
Alex Perrycc3ee4c2019-02-09 21:20:41 -080067};
68
James Kuszmauld0856d62019-03-02 22:57:10 -080069// For logging state of the line follower.
70struct LineFollowLogging {
71 // Whether we are currently freezing target choice.
72 bool frozen;
73 // Whether we currently have a target.
74 bool have_target;
75 // Absolute position of the current goal.
76 float x;
77 float y;
78 float theta;
James Kuszmaul38e79642019-03-09 15:48:27 -080079 // Current lateral offset from line pointing straight out of the target.
80 float offset;
81 // Current distance from the plane of the target, in meters.
82 float distance_to_target;
83 // Current goal heading.
84 float goal_theta;
85 // Current relative heading.
86 float rel_theta;
James Kuszmauld0856d62019-03-02 22:57:10 -080087};
88
Austin Schuhbd0a40f2019-06-30 14:56:31 -070089// Published on ".frc971.control_loops.drivetrain_queue"
Brian Silverman17f503e2015-08-02 18:17:18 -070090queue_group DrivetrainQueue {
91 implements aos.control_loops.ControlLoop;
92
93 message Goal {
Brian Silverman51091a02015-12-26 15:56:58 -080094 // Position of the steering wheel (positive = turning left when going
95 // forwards).
Alex Perryfc83d3b2019-02-03 15:41:58 -080096 float wheel;
97 float wheel_velocity;
98 float wheel_torque;
Comran Morshed0bf200a2016-02-19 15:19:32 +000099
Brian Silverman51091a02015-12-26 15:56:58 -0800100 // Position of the throttle (positive forwards).
Alex Perryfc83d3b2019-02-03 15:41:58 -0800101 float throttle;
102 float throttle_velocity;
103 float throttle_torque;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000104
Brian Silverman51091a02015-12-26 15:56:58 -0800105 // True to shift into high, false to shift into low.
Brian Silverman17f503e2015-08-02 18:17:18 -0700106 bool highgear;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000107
Brian Silverman51091a02015-12-26 15:56:58 -0800108 // True to activate quickturn.
Brian Silverman17f503e2015-08-02 18:17:18 -0700109 bool quickturn;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000110
Austin Schuh78379ea2019-01-04 20:39:45 -0800111 // Type of controller in charge of the drivetrain.
112 // 0: polydrive
113 // 1: motion profiled position drive (statespace)
James Kuszmaule39cbcf2019-02-27 20:48:34 -0800114 // 2: spline follower
115 // 3: line follower (for guiding into a target)
Austin Schuh78379ea2019-01-04 20:39:45 -0800116 uint8_t controller_type;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000117
118 // Position goals for each drivetrain side (in meters) when the
119 // closed-loop controller is active.
Brian Silverman17f503e2015-08-02 18:17:18 -0700120 double left_goal;
Brian Silverman17f503e2015-08-02 18:17:18 -0700121 double right_goal;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000122
Alex Perryfc83d3b2019-02-03 15:41:58 -0800123 float max_ss_voltage;
Austin Schuh0aae9242018-03-14 19:49:44 -0700124
Austin Schuh093535c2016-03-05 23:21:00 -0800125 // Motion profile parameters.
126 // The control loop will profile if these are all non-zero.
Austin Schuhedbb64f2016-03-19 01:18:09 -0700127 .frc971.ProfileParameters linear;
128 .frc971.ProfileParameters angular;
Alex Perry731b4602019-02-02 22:13:01 -0800129
130 // Parameters for a spline to follow. This just contains info on a spline to
131 // compute. Each time this is sent, spline drivetrain will compute a new
132 // spline.
133 .frc971.MultiSpline spline;
134
135 // Which spline to follow.
Alex Perrycc3ee4c2019-02-09 21:20:41 -0800136 int32_t spline_handle;
Brian Silverman17f503e2015-08-02 18:17:18 -0700137 };
138
139 message Position {
Comran Morshed0bf200a2016-02-19 15:19:32 +0000140 // Relative position of each drivetrain side (in meters).
Brian Silverman17f503e2015-08-02 18:17:18 -0700141 double left_encoder;
142 double right_encoder;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000143
144 // The speed in m/s of each drivetrain side from the most recent encoder
145 // pulse, or 0 if there was no edge within the last 5ms.
Brian Silverman51091a02015-12-26 15:56:58 -0800146 double left_speed;
Brian Silverman51091a02015-12-26 15:56:58 -0800147 double right_speed;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000148
149 // Position of each drivetrain shifter, scaled from 0.0 to 1.0 where smaller
150 // is towards low gear.
Brian Silverman17f503e2015-08-02 18:17:18 -0700151 double left_shifter_position;
152 double right_shifter_position;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000153
154 // Raw analog voltages of each shifter hall effect for logging purposes.
Austin Schuha0c1e152015-11-08 14:10:13 -0800155 double low_left_hall;
156 double high_left_hall;
157 double low_right_hall;
158 double high_right_hall;
Brian Silverman17f503e2015-08-02 18:17:18 -0700159 };
160
161 message Output {
Comran Morshed0bf200a2016-02-19 15:19:32 +0000162 // Voltage to send to motor(s) on either side of the drivetrain.
Brian Silverman17f503e2015-08-02 18:17:18 -0700163 double left_voltage;
164 double right_voltage;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000165
166 // Whether to set each shifter piston to high gear.
Brian Silverman17f503e2015-08-02 18:17:18 -0700167 bool left_high;
168 bool right_high;
169 };
170
171 message Status {
Brian Silverman51091a02015-12-26 15:56:58 -0800172 // Estimated speed of the center of the robot in m/s (positive forwards).
Brian Silverman17f503e2015-08-02 18:17:18 -0700173 double robot_speed;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000174
175 // Estimated relative position of each drivetrain side (in meters).
Austin Schuh093535c2016-03-05 23:21:00 -0800176 double estimated_left_position;
177 double estimated_right_position;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000178
179 // Estimated velocity of each drivetrain side (in m/s).
Austin Schuh093535c2016-03-05 23:21:00 -0800180 double estimated_left_velocity;
181 double estimated_right_velocity;
Brian Silverman17f503e2015-08-02 18:17:18 -0700182
Comran Morshed0bf200a2016-02-19 15:19:32 +0000183 // The voltage we wanted to send to each drivetrain side last cycle.
Brian Silverman17f503e2015-08-02 18:17:18 -0700184 double uncapped_left_voltage;
185 double uncapped_right_voltage;
Comran Morshed0bf200a2016-02-19 15:19:32 +0000186
Austin Schuh093535c2016-03-05 23:21:00 -0800187 // The voltage error for the left and right sides.
188 double left_voltage_error;
189 double right_voltage_error;
190
191 // The profiled goal states.
192 double profiled_left_position_goal;
193 double profiled_right_position_goal;
194 double profiled_left_velocity_goal;
195 double profiled_right_velocity_goal;
196
197 // The KF offset
198 double estimated_angular_velocity_error;
199 // The KF estimated heading.
200 double estimated_heading;
Austin Schuh3a378462019-01-04 21:48:04 -0800201
202 // xytheta of the robot.
203 double x;
204 double y;
205 double theta;
Austin Schuh093535c2016-03-05 23:21:00 -0800206
Brian Silverman51091a02015-12-26 15:56:58 -0800207 // True if the output voltage was capped last cycle.
Brian Silverman17f503e2015-08-02 18:17:18 -0700208 bool output_was_capped;
Austin Schuh5900d142016-04-03 21:35:12 -0700209
210 // The angle of the robot relative to the ground.
211 double ground_angle;
Kyle Stachowicz2f3c20f2017-07-13 16:04:05 -0700212
213 // Information about shifting logic and curent gear, for logging purposes
214 GearLogging gear_logging;
215 CIMLogging cim_logging;
Alex Perrycc3ee4c2019-02-09 21:20:41 -0800216 TrajectoryLogging trajectory_logging;
James Kuszmauld0856d62019-03-02 22:57:10 -0800217 LineFollowLogging line_follow_logging;
Brian Silverman17f503e2015-08-02 18:17:18 -0700218 };
219
220 queue Goal goal;
221 queue Position position;
222 queue Output output;
223 queue Status status;
224};