blob: 0f63ed24bc9523e1c03c36883ca188b427074940 [file] [log] [blame]
Brian Silverman431500a2013-10-28 19:50:15 -07001#include "frc971/constants.h"
2
3#include <math.h>
4#include <stdint.h>
5#include <inttypes.h>
6
Brian Silverman0a151c92014-05-02 15:28:44 -07007#include <map>
8
9#if __has_feature(address_sanitizer)
10#include "sanitizer/lsan_interface.h"
11#endif
12
Brian Silverman431500a2013-10-28 19:50:15 -070013#include "aos/common/logging/logging.h"
14#include "aos/common/once.h"
15#include "aos/common/network/team_number.h"
Brian Silverman0a151c92014-05-02 15:28:44 -070016#include "aos/common/mutex.h"
Brian Silverman431500a2013-10-28 19:50:15 -070017
Brian Silverman2c590c32013-11-04 18:08:54 -080018#include "frc971/control_loops/drivetrain/polydrivetrain_dog_motor_plant.h"
Brian Silverman2c590c32013-11-04 18:08:54 -080019#include "frc971/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
Brian Silverman2c590c32013-11-04 18:08:54 -080020
Brian Silverman431500a2013-10-28 19:50:15 -070021#ifndef M_PI
22#define M_PI 3.14159265358979323846
23#endif
24
25namespace frc971 {
26namespace constants {
27namespace {
28
Brian Silvermane5db0c62014-03-13 15:53:18 -070029const uint16_t kCompTeamNumber = 971;
Brian Silvermana20703b2014-03-20 14:29:37 -070030const uint16_t kPracticeTeamNumber = 9971;
Comran Morshed79bd3db2015-02-07 14:51:13 +000031
32// ///// Drivetrain Constants
Brian Silvermane5db0c62014-03-13 15:53:18 -070033
Daniel Pettia7827412015-02-13 20:55:57 -080034// These three constants were set by Daniel on 2/13/15.
35const double kDrivetrainEncoderRatio = 20.0 / 64.0;
36const double kLowGearRatio = kDrivetrainEncoderRatio * 20.0 / 50.0;
37const double kHighGearRatio = kLowGearRatio;
Brian Silverman1a6590d2013-11-04 14:46:46 -080038
Brian Silvermane5db0c62014-03-13 15:53:18 -070039const ShifterHallEffect kCompRightDriveShifter{555, 657, 660, 560, 0.2, 0.7};
40const ShifterHallEffect kCompLeftDriveShifter{555, 660, 644, 552, 0.2, 0.7};
Brian Silverman6eb51f12013-11-02 14:39:01 -070041
Austin Schuh010eb812014-10-25 18:06:49 -070042const ShifterHallEffect kPracticeRightDriveShifter{2.95, 3.95, 3.95, 2.95, 0.2, 0.7};
43const ShifterHallEffect kPracticeLeftDriveShifter{2.95, 4.2, 3.95, 3.0, 0.2, 0.7};
Brian Silvermane5db0c62014-03-13 15:53:18 -070044
Daniel Pettia7827412015-02-13 20:55:57 -080045// Set by Daniel on 2/13/15.
46// Distance from the center of the left wheel to the center of the right wheel.
47const double kRobotWidth = 37.806 /*inches*/ * 0.0254;
Brian Silverman6eb51f12013-11-02 14:39:01 -070048
Comran Morshed79bd3db2015-02-07 14:51:13 +000049// ///// Superstructure Constants
50
Comran Morshed79bd3db2015-02-07 14:51:13 +000051// Elevator gearbox pulley output constants.
52const int kElevatorGearboxOutputPulleyTeeth = 32; // 32 teeth
53const double kElevatorGearboxOutputPitch = 0.005; // 5 mm/tooth
Daniel Pettia7827412015-02-13 20:55:57 -080054const double kElevatorGearboxOutputRadianDistance =
55 kElevatorGearboxOutputPulleyTeeth * kElevatorGearboxOutputPitch /
56 (2.0 * M_PI);
Comran Morshed79bd3db2015-02-07 14:51:13 +000057
Austin Schuh703b8d42015-02-01 14:56:34 -080058const double kMaxAllowedLeftRightArmDifference = 0.01; // radians
59const double kMaxAllowedLeftRightElevatorDifference = 0.01; // meters
60
Daniel Pettia7827412015-02-13 20:55:57 -080061// Gearing ratios of the pots and encoders for the elevator and arm.
62// Ratio is output shaft rotations per encoder/pot rotation
63// Checked by Daniel on 2/13/15.
64const double kArmEncoderRatio = 18.0 / 48.0 * 16.0 / 72.0;
65const double kArmPotRatio = 48.0 / 48.0 * 16.0 / 72.0;
66const double kElevatorEncoderRatio = 14.0 / 84.0;
67const double kElevatorPotRatio = 1.0;
68const double kClawEncoderRatio = 18.0 / 72.0;
69const double kClawPotRatio = 18.0 / 72.0;
70
Comran Morshed79bd3db2015-02-07 14:51:13 +000071// Number of radians between each index pulse on the arm.
Daniel Pettia7827412015-02-13 20:55:57 -080072const double kArmEncoderIndexDifference = 2.0 * M_PI * kArmEncoderRatio;
73// Number of meters between each index pulse on the elevator.
Comran Morshed79bd3db2015-02-07 14:51:13 +000074const double kElevatorEncoderIndexDifference =
Daniel Pettia7827412015-02-13 20:55:57 -080075 kElevatorEncoderRatio *
76 2.0 * M_PI * // radians
77 kElevatorGearboxOutputRadianDistance;
78// Number of radians between index pulses on the claw.
Comran Morshed79bd3db2015-02-07 14:51:13 +000079const double kClawEncoderIndexDifference = 2.0 * M_PI * kClawEncoderRatio;
80
81const int kZeroingSampleSize = 20;
Brian Silvermanedcfd2d2014-04-03 13:04:16 -070082
Ben Fredricksona9dcfa42014-02-23 02:05:59 +000083const Values *DoGetValuesForTeam(uint16_t team) {
Brian Silverman431500a2013-10-28 19:50:15 -070084 switch (team) {
Brian Silverman0d2b7cb2014-02-18 20:25:57 -080085 case 1: // for tests
86 return new Values{
Daniel Pettia7827412015-02-13 20:55:57 -080087 kDrivetrainEncoderRatio,
88 kArmEncoderRatio,
89 kArmPotRatio,
90 kElevatorEncoderRatio,
91 kElevatorPotRatio,
92 kElevatorGearboxOutputRadianDistance,
93 kClawEncoderRatio,
94 kClawPotRatio,
95 kLowGearRatio,
96 kHighGearRatio,
Brian Silverman0d2b7cb2014-02-18 20:25:57 -080097 kCompLeftDriveShifter,
98 kCompRightDriveShifter,
Austin Schuh11726212014-03-02 14:01:02 -080099 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -0700100 0.5,
Austin Schuha25a0412014-03-09 00:50:04 -0800101 control_loops::MakeVelocityDrivetrainLoop,
102 control_loops::MakeDrivetrainLoop,
Comran Morshed79bd3db2015-02-07 14:51:13 +0000103 0.02, // drivetrain done delta
104 5.0, // drivetrain max speed
105
Comran Morshed79bd3db2015-02-07 14:51:13 +0000106 // Motion ranges: hard_lower_limit, hard_upper_limit,
107 // soft_lower_limit, soft_upper_limit
108 // TODO(sensors): Get actual bounds before turning on robot.
109 {
110 // Claw values, in radians.
111 // 0 is level with the ground.
112 // Positive moves in the direction of positive encoder values.
113 {0.0000000000, 1.5700000000,
Daniel Pettia7827412015-02-13 20:55:57 -0800114 0.1000000000, 1.2000000000},
115
116 // Zeroing constants for wrist.
117 // TODO(sensors): Get actual offsets for these.
118 {kZeroingSampleSize, kClawEncoderIndexDifference, 0.0},
James Kuszmaul9ead1de2014-02-28 21:24:39 -0800119 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000120
121 {
122 // Elevator values, in meters.
Austin Schuh703b8d42015-02-01 14:56:34 -0800123 // TODO(austin): Fix this. Positive is up.
Comran Morshed79bd3db2015-02-07 14:51:13 +0000124 // 0 is at the top of the elevator frame.
125 // Positive is down towards the drivebase.
126 {0.0000000000, 0.6790000000,
127 0.2000000000, 0.6000000000},
128
129 // Arm values, in radians.
130 // 0 is sticking straight out horizontally over the intake/front.
131 // Positive is rotating up and into the robot (towards the back).
Austin Schuh703b8d42015-02-01 14:56:34 -0800132 {-1.570000000, 1.5700000000,
Daniel Pettia7827412015-02-13 20:55:57 -0800133 -1.200000000, 1.2000000000},
134
135 // Elevator zeroing constants: left, right.
136 // TODO(sensors): Get actual offsets for these.
137 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.0},
138 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.0},
139 // Arm zeroing constants: left, right.
140 {kZeroingSampleSize, kArmEncoderIndexDifference, 0.0},
141 {kZeroingSampleSize, kArmEncoderIndexDifference, 0.0},
Austin Schuh703b8d42015-02-01 14:56:34 -0800142 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000143 // End "sensor" values.
Austin Schuh703b8d42015-02-01 14:56:34 -0800144
145 kMaxAllowedLeftRightArmDifference,
146 kMaxAllowedLeftRightElevatorDifference,
Brian Silverman0d2b7cb2014-02-18 20:25:57 -0800147 };
148 break;
Brian Silverman431500a2013-10-28 19:50:15 -0700149 case kCompTeamNumber:
Brian Silverman756f9ff2014-01-17 23:40:23 -0800150 return new Values{
Daniel Pettia7827412015-02-13 20:55:57 -0800151 kDrivetrainEncoderRatio,
152 kArmEncoderRatio,
153 kArmPotRatio,
154 kElevatorEncoderRatio,
155 kElevatorPotRatio,
156 kElevatorGearboxOutputRadianDistance,
157 kClawEncoderRatio,
158 kClawPotRatio,
159 kLowGearRatio,
160 kHighGearRatio,
Austin Schuh288c8c32014-02-16 17:20:17 -0800161 kCompLeftDriveShifter,
162 kCompRightDriveShifter,
Brian Silvermanedcfd2d2014-04-03 13:04:16 -0700163 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -0700164 kRobotWidth,
Austin Schuha25a0412014-03-09 00:50:04 -0800165 control_loops::MakeVelocityDrivetrainLoop,
166 control_loops::MakeDrivetrainLoop,
Comran Morshed79bd3db2015-02-07 14:51:13 +0000167 0.02, // drivetrain done delta
168 5.0, // drivetrain max speed
169
Comran Morshed79bd3db2015-02-07 14:51:13 +0000170 // Motion ranges: hard_lower_limit, hard_upper_limit,
171 // soft_lower_limit, soft_upper_limit
172 // TODO(sensors): Get actual bounds before turning on robot.
173 {
174 // Claw values, in radians.
175 // 0 is level with the ground.
176 // Positive moves in the direction of positive encoder values.
177 {0.0000000000, 1.5700000000,
Daniel Pettia7827412015-02-13 20:55:57 -0800178 0.1000000000, 1.2000000000},
179
180 // Zeroing constants for wrist.
181 // TODO(sensors): Get actual offsets for these.
182 {kZeroingSampleSize, kClawEncoderIndexDifference, 0.0},
183
James Kuszmaul9ead1de2014-02-28 21:24:39 -0800184 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000185
186 {
187 // Elevator values, in meters.
188 // 0 is at the top of the elevator frame.
189 // Positive is down towards the drivebase.
190 {0.0000000000, 0.6790000000,
191 0.2000000000, 0.6000000000},
192
193 // Arm values, in radians.
194 // 0 is sticking straight out horizontally over the intake/front.
195 // Positive is rotating up and into the robot (towards the back).
Austin Schuh703b8d42015-02-01 14:56:34 -0800196 {-1.570000000, 1.5700000000,
Daniel Pettia7827412015-02-13 20:55:57 -0800197 -1.200000000, 1.2000000000},
198
199 // Elevator zeroing constants: left, right.
200 // TODO(sensors): Get actual offsets for these.
201 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.0},
202 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.0},
203 // Arm zeroing constants: left, right.
204 {kZeroingSampleSize, kArmEncoderIndexDifference, 0.0},
205 {kZeroingSampleSize, kArmEncoderIndexDifference, 0.0},
Austin Schuh703b8d42015-02-01 14:56:34 -0800206 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000207 // End "sensor" values.
Austin Schuh703b8d42015-02-01 14:56:34 -0800208
209 kMaxAllowedLeftRightArmDifference,
210 kMaxAllowedLeftRightElevatorDifference,
Brian Silverman756f9ff2014-01-17 23:40:23 -0800211 };
Brian Silverman431500a2013-10-28 19:50:15 -0700212 break;
213 case kPracticeTeamNumber:
Brian Silverman756f9ff2014-01-17 23:40:23 -0800214 return new Values{
Daniel Pettia7827412015-02-13 20:55:57 -0800215 kDrivetrainEncoderRatio,
216 kArmEncoderRatio,
217 kArmPotRatio,
218 kElevatorEncoderRatio,
219 kElevatorPotRatio,
220 kElevatorGearboxOutputRadianDistance,
221 kClawEncoderRatio,
222 kClawPotRatio,
223 kLowGearRatio,
224 kHighGearRatio,
Austin Schuh288c8c32014-02-16 17:20:17 -0800225 kPracticeLeftDriveShifter,
226 kPracticeRightDriveShifter,
227 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -0700228 kRobotWidth,
Austin Schuha25a0412014-03-09 00:50:04 -0800229 control_loops::MakeVelocityDrivetrainLoop,
230 control_loops::MakeDrivetrainLoop,
Comran Morshed79bd3db2015-02-07 14:51:13 +0000231 0.02, // drivetrain done delta
232 5.0, // drivetrain max speed
233
Comran Morshed79bd3db2015-02-07 14:51:13 +0000234 // Motion ranges: hard_lower_limit, hard_upper_limit,
235 // soft_lower_limit, soft_upper_limit
236 // TODO(sensors): Get actual bounds before turning on robot.
237 {
238 // Claw values, in radians.
239 // 0 is level with the ground.
240 // Positive moves in the direction of positive encoder values.
241 {0.0000000000, 1.5700000000,
Daniel Pettia7827412015-02-13 20:55:57 -0800242 0.1000000000, 1.2000000000},
243
244 // Zeroing constants for wrist.
245 // TODO(sensors): Get actual offsets for these.
246 {kZeroingSampleSize, kClawEncoderIndexDifference, 0.0},
James Kuszmaul9ead1de2014-02-28 21:24:39 -0800247 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000248
249 {
250 // Elevator values, in meters.
251 // 0 is at the top of the elevator frame.
252 // Positive is down towards the drivebase.
253 {0.0000000000, 0.6790000000,
254 0.2000000000, 0.6000000000},
255
256 // Arm values, in radians.
257 // 0 is sticking straight out horizontally over the intake/front.
258 // Positive is rotating up and into the robot (towards the back).
Austin Schuh703b8d42015-02-01 14:56:34 -0800259 {-1.570000000, 1.5700000000,
Daniel Pettia7827412015-02-13 20:55:57 -0800260 -1.200000000, 1.2000000000},
261
262 // Elevator zeroing constants: left, right.
263 // TODO(sensors): Get actual offsets for these.
264 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.0},
265 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.0},
266 // Arm zeroing constants: left, right.
267 {kZeroingSampleSize, kArmEncoderIndexDifference, 0.0},
268 {kZeroingSampleSize, kArmEncoderIndexDifference, 0.0},
Austin Schuh703b8d42015-02-01 14:56:34 -0800269 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000270 // TODO(sensors): End "sensor" values.
Austin Schuh703b8d42015-02-01 14:56:34 -0800271
272 kMaxAllowedLeftRightArmDifference,
273 kMaxAllowedLeftRightElevatorDifference,
Brian Silverman756f9ff2014-01-17 23:40:23 -0800274 };
Brian Silverman431500a2013-10-28 19:50:15 -0700275 break;
276 default:
277 LOG(FATAL, "unknown team #%" PRIu16 "\n", team);
278 }
279}
280
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000281const Values *DoGetValues() {
282 uint16_t team = ::aos::network::GetTeamNumber();
283 LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
284 return DoGetValuesForTeam(team);
285}
286
Brian Silverman431500a2013-10-28 19:50:15 -0700287} // namespace
288
289const Values &GetValues() {
290 static ::aos::Once<const Values> once(DoGetValues);
291 return *once.Get();
292}
293
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000294const Values &GetValuesForTeam(uint16_t team_number) {
Brian Silverman0a151c92014-05-02 15:28:44 -0700295 static ::aos::Mutex mutex;
296 ::aos::MutexLocker locker(&mutex);
297
298 // IMPORTANT: This declaration has to stay after the mutex is locked to avoid
299 // race conditions.
300 static ::std::map<uint16_t, const Values *> values;
301
302 if (values.count(team_number) == 0) {
303 values[team_number] = DoGetValuesForTeam(team_number);
304#if __has_feature(address_sanitizer)
305 __lsan_ignore_object(values[team_number]);
306#endif
307 }
308 return *values[team_number];
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000309}
310
Brian Silverman431500a2013-10-28 19:50:15 -0700311} // namespace constants
312} // namespace frc971