blob: 4a5edd82b555be7b802f11bcb11e94bb0bfc92ee [file] [log] [blame]
Campbell Crowley75026292017-02-04 21:46:19 -08001package y2017.control_loops;
2
3import "aos/common/controls/control_loops.q";
Austin Schuh3634ed32017-02-05 16:28:49 -08004import "frc971/control_loops/profiled_subsystem.q";
5// TODO(austin): Add this back in when the queue compiler supports diamond
6// inheritance.
7//import "frc971/control_loops/control_loops.q";
Campbell Crowley75026292017-02-04 21:46:19 -08008
9struct IntakeGoal {
Brian Silverman052e69d2017-02-12 16:19:55 -080010 // Zero for the intake is when the front tube is tangent with the front of the
11 // frame. Positive is out.
Campbell Crowley75026292017-02-04 21:46:19 -080012
13 // Goal distance of the intake.
14 double distance;
15
16 // Caps on velocity/acceleration for profiling. 0 for the default.
17 .frc971.ProfileParameters profile_params;
18
19 // Voltage to send to the rollers. Positive is sucking in.
Austin Schuh0991edb2017-02-05 17:16:44 -080020 double voltage_rollers;
Campbell Crowley75026292017-02-04 21:46:19 -080021};
22
Brian Silverman052e69d2017-02-12 16:19:55 -080023struct IndexerGoal {
24 // Indexer angular velocity goals in radians/second.
Campbell Crowley75026292017-02-04 21:46:19 -080025 double angular_velocity;
26};
27
28struct TurretGoal {
Campbell Crowley065a0812017-02-04 22:27:17 -080029 // An angle of zero means the turrent faces toward the front of the
Campbell Crowley75026292017-02-04 21:46:19 -080030 // robot where the intake is located. The angle increases when the turret
Campbell Crowley065a0812017-02-04 22:27:17 -080031 // turns clockwise (towards right from the front), and decreases when
32 // the turrent turns counter-clockwise (towards left from the front).
Campbell Crowley75026292017-02-04 21:46:19 -080033 // These are from a top view above the robot.
Campbell Crowley065a0812017-02-04 22:27:17 -080034 double angle;
Campbell Crowley75026292017-02-04 21:46:19 -080035
36 // Caps on velocity/acceleration for profiling. 0 for the default.
37 .frc971.ProfileParameters profile_params;
38};
39
40struct HoodGoal {
Brian Silverman052e69d2017-02-12 16:19:55 -080041 // Angle the hood is currently at. An angle of zero is at the lower hard
42 // stop, angle increases as hood rises.
Austin Schuh0991edb2017-02-05 17:16:44 -080043 double angle;
Campbell Crowley75026292017-02-04 21:46:19 -080044
45 // Caps on velocity/acceleration for profiling. 0 for the default.
46 .frc971.ProfileParameters profile_params;
47};
48
49struct ShooterGoal {
Brian Silverman052e69d2017-02-12 16:19:55 -080050 // Angular velocity goals in radians/second. Positive is shooting out of the
51 // robot.
Campbell Crowley75026292017-02-04 21:46:19 -080052 double angular_velocity;
53};
54
Brian Silverman052e69d2017-02-12 16:19:55 -080055struct IndexerStatus {
56 // The current average velocity in radians/second. Positive is moving balls up
57 // towards the shooter. This is the angular velocity of the inner piece.
Campbell Crowley75026292017-02-04 21:46:19 -080058 double avg_angular_velocity;
59
60 // The current instantaneous filtered velocity in radians/second.
61 double angular_velocity;
62
Brian Silverman052e69d2017-02-12 16:19:55 -080063 // True if the indexer is ready. It is better to compare the velocities
Campbell Crowley75026292017-02-04 21:46:19 -080064 // directly so there isn't confusion on if the goal is up to date.
65 bool ready;
66
67 // If true, we have aborted.
68 bool estopped;
69};
70
Campbell Crowley75026292017-02-04 21:46:19 -080071struct ShooterStatus {
72 // The current average velocity in radians/second.
73 double avg_angular_velocity;
74
75 // The current instantaneous filtered velocity in radians/second.
76 double angular_velocity;
77
78 // True if the shooter is ready. It is better to compare the velocities
79 // directly so there isn't confusion on if the goal is up to date.
80 bool ready;
81
82 // If true, we have aborted.
83 bool estopped;
Tyler Chatow2737d2a2017-02-08 21:20:51 -080084
85 // The estimated voltage error from the kalman filter in volts.
86 double voltage_error;
87
88 // The current velocity measured as delta x / delta t in radians/sec.
89 double instantaneous_velocity;
90
91 // The error between our measurement and expected measurement in radians.
92 double position_error;
Campbell Crowley75026292017-02-04 21:46:19 -080093};
94
95queue_group SuperstructureQueue {
96 implements aos.control_loops.ControlLoop;
97
98 message Goal {
99 IntakeGoal intake;
Brian Silverman052e69d2017-02-12 16:19:55 -0800100 IndexerGoal indexer;
Campbell Crowley75026292017-02-04 21:46:19 -0800101 TurretGoal turret;
102 HoodGoal hood;
103 ShooterGoal shooter;
104 };
105
106 message Status {
107 // Are all the subsystems zeroed?
108 bool zeroed;
109
110 // If true, we have aborted. This is the or of all subsystem estops.
111 bool estopped;
112
113 // Each subsystems status.
Adam Snaider79900c22017-02-08 20:23:15 -0800114 .frc971.control_loops.AbsoluteProfiledJointStatus intake;
115 .frc971.control_loops.AbsoluteProfiledJointStatus turret;
Austin Schuh3634ed32017-02-05 16:28:49 -0800116 .frc971.control_loops.ProfiledJointStatus hood;
Brian Silverman052e69d2017-02-12 16:19:55 -0800117 IndexerStatus indexer;
Campbell Crowley75026292017-02-04 21:46:19 -0800118 ShooterStatus shooter;
119 };
120
121 message Position {
Austin Schuh0991edb2017-02-05 17:16:44 -0800122 // TODO(austin): The turret and intake really should be absolute. Switch
123 // them over when that class is ready.
124
Campbell Crowley75026292017-02-04 21:46:19 -0800125 // Position of the intake, zero when the intake is in, positive when it is
126 // out.
Adam Snaider79900c22017-02-08 20:23:15 -0800127 .frc971.PotAndAbsolutePosition intake;
Campbell Crowley75026292017-02-04 21:46:19 -0800128
Brian Silverman052e69d2017-02-12 16:19:55 -0800129 // Indexer angle in radians.
130 double theta_indexer;
Campbell Crowley75026292017-02-04 21:46:19 -0800131
Campbell Crowley065a0812017-02-04 22:27:17 -0800132 // The sensor readings for the turret. The units and sign are defined the
Campbell Crowley75026292017-02-04 21:46:19 -0800133 // same as what's in the Goal message.
Adam Snaider79900c22017-02-08 20:23:15 -0800134 .frc971.PotAndAbsolutePosition turret;
Campbell Crowley75026292017-02-04 21:46:19 -0800135
Austin Schuh0991edb2017-02-05 17:16:44 -0800136 // The sensor readings for the hood. The units and sign are defined the
137 // same as what's in the Goal message.
138 .frc971.PotAndIndexPosition hood;
Campbell Crowley75026292017-02-04 21:46:19 -0800139
140 // Shooter wheel angle in radians.
141 double theta_shooter;
142 };
143
144 message Output {
145 // Voltages for some of the subsystems.
Austin Schuh0991edb2017-02-05 17:16:44 -0800146 double voltage_intake;
Brian Silverman052e69d2017-02-12 16:19:55 -0800147 double voltage_indexer;
Austin Schuh0991edb2017-02-05 17:16:44 -0800148 double voltage_shooter;
Campbell Crowley75026292017-02-04 21:46:19 -0800149
150 // Rollers on the intake.
Austin Schuh0991edb2017-02-05 17:16:44 -0800151 double voltage_intake_rollers;
Brian Silverman052e69d2017-02-12 16:19:55 -0800152 // Roller on the indexer
153 double voltage_indexer_rollers;
Campbell Crowley75026292017-02-04 21:46:19 -0800154
Austin Schuh0991edb2017-02-05 17:16:44 -0800155 double voltage_turret;
156 double voltage_hood;
Campbell Crowley75026292017-02-04 21:46:19 -0800157 };
158
159 queue Goal goal;
160 queue Position position;
161 queue Output output;
162 queue Status status;
163};
164
165queue_group SuperstructureQueue superstructure_queue;