blob: b724d1552fec4889ecb8d2096045bba995324062 [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
Daniel Pettiee4fa802015-02-17 10:39:27 -080042const ShifterHallEffect kPracticeRightDriveShifter{2.95, 3.95, 3.95,
43 2.95, 0.2, 0.7};
44const ShifterHallEffect kPracticeLeftDriveShifter{2.95, 4.2, 3.95,
45 3.0, 0.2, 0.7};
Brian Silvermane5db0c62014-03-13 15:53:18 -070046
Daniel Pettia7827412015-02-13 20:55:57 -080047// Set by Daniel on 2/13/15.
48// Distance from the center of the left wheel to the center of the right wheel.
49const double kRobotWidth = 37.806 /*inches*/ * 0.0254;
Brian Silverman6eb51f12013-11-02 14:39:01 -070050
Comran Morshed79bd3db2015-02-07 14:51:13 +000051// ///// Superstructure Constants
52
Comran Morshed79bd3db2015-02-07 14:51:13 +000053// Elevator gearbox pulley output constants.
54const int kElevatorGearboxOutputPulleyTeeth = 32; // 32 teeth
55const double kElevatorGearboxOutputPitch = 0.005; // 5 mm/tooth
Daniel Pettia7827412015-02-13 20:55:57 -080056const double kElevatorGearboxOutputRadianDistance =
57 kElevatorGearboxOutputPulleyTeeth * kElevatorGearboxOutputPitch /
58 (2.0 * M_PI);
Comran Morshed79bd3db2015-02-07 14:51:13 +000059
Daniel Pettie1bb13e2015-02-17 13:59:15 -080060const double kArmZeroingHeight = 0.2;
Daniel Pettiee4fa802015-02-17 10:39:27 -080061const double kElevatorNormalHeight = 0.1;
Daniel Pettie1bb13e2015-02-17 13:59:15 -080062
Daniel Pettiee4fa802015-02-17 10:39:27 -080063const double kMaxAllowedLeftRightArmDifference = 0.04; // radians
Austin Schuh703b8d42015-02-01 14:56:34 -080064const double kMaxAllowedLeftRightElevatorDifference = 0.01; // meters
65
Daniel Pettia7827412015-02-13 20:55:57 -080066// Gearing ratios of the pots and encoders for the elevator and arm.
67// Ratio is output shaft rotations per encoder/pot rotation
68// Checked by Daniel on 2/13/15.
69const double kArmEncoderRatio = 18.0 / 48.0 * 16.0 / 72.0;
70const double kArmPotRatio = 48.0 / 48.0 * 16.0 / 72.0;
71const double kElevatorEncoderRatio = 14.0 / 84.0;
72const double kElevatorPotRatio = 1.0;
73const double kClawEncoderRatio = 18.0 / 72.0;
74const double kClawPotRatio = 18.0 / 72.0;
75
Comran Morshed79bd3db2015-02-07 14:51:13 +000076// Number of radians between each index pulse on the arm.
Daniel Pettiee4fa802015-02-17 10:39:27 -080077const double kArmEncoderIndexDifference = 2.0 * M_PI * kArmEncoderRatio;
Daniel Pettia7827412015-02-13 20:55:57 -080078// Number of meters between each index pulse on the elevator.
Comran Morshed79bd3db2015-02-07 14:51:13 +000079const double kElevatorEncoderIndexDifference =
Daniel Pettiee4fa802015-02-17 10:39:27 -080080 kElevatorEncoderRatio * 2.0 * M_PI * // radians
Daniel Pettia7827412015-02-13 20:55:57 -080081 kElevatorGearboxOutputRadianDistance;
82// Number of radians between index pulses on the claw.
Comran Morshed79bd3db2015-02-07 14:51:13 +000083const double kClawEncoderIndexDifference = 2.0 * M_PI * kClawEncoderRatio;
84
85const int kZeroingSampleSize = 20;
Brian Silvermanedcfd2d2014-04-03 13:04:16 -070086
Daniel Petti9cf68c82015-02-14 14:57:17 -080087// TODO(danielp): All these values might need to change.
88const double kClawPistonSwitchTime = 0.4;
89const double kClawZeroingRange = 0.3;
90
Ben Fredricksona9dcfa42014-02-23 02:05:59 +000091const Values *DoGetValuesForTeam(uint16_t team) {
Brian Silverman431500a2013-10-28 19:50:15 -070092 switch (team) {
Brian Silverman0d2b7cb2014-02-18 20:25:57 -080093 case 1: // for tests
94 return new Values{
Daniel Pettia7827412015-02-13 20:55:57 -080095 kDrivetrainEncoderRatio,
96 kArmEncoderRatio,
97 kArmPotRatio,
98 kElevatorEncoderRatio,
99 kElevatorPotRatio,
100 kElevatorGearboxOutputRadianDistance,
101 kClawEncoderRatio,
102 kClawPotRatio,
103 kLowGearRatio,
104 kHighGearRatio,
Brian Silverman0d2b7cb2014-02-18 20:25:57 -0800105 kCompLeftDriveShifter,
106 kCompRightDriveShifter,
Austin Schuh11726212014-03-02 14:01:02 -0800107 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -0700108 0.5,
Austin Schuha25a0412014-03-09 00:50:04 -0800109 control_loops::MakeVelocityDrivetrainLoop,
110 control_loops::MakeDrivetrainLoop,
Comran Morshed79bd3db2015-02-07 14:51:13 +0000111 0.02, // drivetrain done delta
112 5.0, // drivetrain max speed
113
Comran Morshed79bd3db2015-02-07 14:51:13 +0000114 // Motion ranges: hard_lower_limit, hard_upper_limit,
115 // soft_lower_limit, soft_upper_limit
Daniel Pettiee4fa802015-02-17 10:39:27 -0800116 {// Claw values, in radians.
117 // 0 is level with the ground.
118 // Positive moves in the direction of positive encoder values.
Brian Silverman24e37ad2015-02-18 01:58:08 -0500119 {-0.05, M_PI / 2.0 + 0.1, 0.0, M_PI / 2.0},
Daniel Pettia7827412015-02-13 20:55:57 -0800120
Daniel Pettiee4fa802015-02-17 10:39:27 -0800121 // Zeroing constants for wrist.
Brian Silverman24e37ad2015-02-18 01:58:08 -0500122 {kZeroingSampleSize, kClawEncoderIndexDifference,
123 0.9},
Daniel Petti9cf68c82015-02-14 14:57:17 -0800124
Brian Silverman24e37ad2015-02-18 01:58:08 -0500125 6.308141,
Daniel Pettiee4fa802015-02-17 10:39:27 -0800126 kClawPistonSwitchTime,
127 kClawZeroingRange},
Comran Morshed79bd3db2015-02-07 14:51:13 +0000128
Daniel Pettiee4fa802015-02-17 10:39:27 -0800129 {// Elevator values, in meters.
Brian Silverman24e37ad2015-02-18 01:58:08 -0500130 // 0 is the portion of the elevator carriage that Spencer removed
131 // lining up with the bolt.
132 // Positive is up.
133 {-0.005, 0.679000, 0.010000, 0.650000},
Comran Morshed79bd3db2015-02-07 14:51:13 +0000134
Daniel Pettiee4fa802015-02-17 10:39:27 -0800135 // Arm values, in radians.
136 // 0 is sticking straight out horizontally over the intake/front.
137 // Positive is rotating up and into the robot (towards the back).
Brian Silverman24e37ad2015-02-18 01:58:08 -0500138 {-M_PI / 2 - 0.05, M_PI / 2 + 0.05, -M_PI / 2, M_PI / 2},
Daniel Pettia7827412015-02-13 20:55:57 -0800139
Daniel Pettiee4fa802015-02-17 10:39:27 -0800140 // Elevator zeroing constants: left, right.
Daniel Pettiee4fa802015-02-17 10:39:27 -0800141 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.0},
142 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.0},
143 // Arm zeroing constants: left, right.
144 {kZeroingSampleSize, kArmEncoderIndexDifference, 0.0},
145 {kZeroingSampleSize, kArmEncoderIndexDifference, 0.0},
Brian Silverman24e37ad2015-02-18 01:58:08 -0500146 0.7,
147 -0.08,
148 -3.5 - 0.01 - -0.02,
149 3.5 - 0.17 - -0.15,
Daniel Pettie1bb13e2015-02-17 13:59:15 -0800150
Daniel Pettiee4fa802015-02-17 10:39:27 -0800151 kArmZeroingHeight,
152 kElevatorNormalHeight,
Austin Schuh703b8d42015-02-01 14:56:34 -0800153 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000154 // End "sensor" values.
Austin Schuh703b8d42015-02-01 14:56:34 -0800155
156 kMaxAllowedLeftRightArmDifference,
157 kMaxAllowedLeftRightElevatorDifference,
Brian Silverman0d2b7cb2014-02-18 20:25:57 -0800158 };
159 break;
Brian Silverman431500a2013-10-28 19:50:15 -0700160 case kCompTeamNumber:
Brian Silverman756f9ff2014-01-17 23:40:23 -0800161 return new Values{
Daniel Pettia7827412015-02-13 20:55:57 -0800162 kDrivetrainEncoderRatio,
163 kArmEncoderRatio,
164 kArmPotRatio,
165 kElevatorEncoderRatio,
166 kElevatorPotRatio,
167 kElevatorGearboxOutputRadianDistance,
168 kClawEncoderRatio,
169 kClawPotRatio,
170 kLowGearRatio,
171 kHighGearRatio,
Austin Schuh288c8c32014-02-16 17:20:17 -0800172 kCompLeftDriveShifter,
173 kCompRightDriveShifter,
Brian Silvermanedcfd2d2014-04-03 13:04:16 -0700174 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -0700175 kRobotWidth,
Austin Schuha25a0412014-03-09 00:50:04 -0800176 control_loops::MakeVelocityDrivetrainLoop,
177 control_loops::MakeDrivetrainLoop,
Comran Morshed79bd3db2015-02-07 14:51:13 +0000178 0.02, // drivetrain done delta
179 5.0, // drivetrain max speed
180
Comran Morshed79bd3db2015-02-07 14:51:13 +0000181 // Motion ranges: hard_lower_limit, hard_upper_limit,
182 // soft_lower_limit, soft_upper_limit
183 // TODO(sensors): Get actual bounds before turning on robot.
Austin Schuh0b406bb2015-02-17 02:28:48 -0800184 {// Claw values, in radians.
185 // 0 is level with the ground.
186 // Positive moves in the direction of positive encoder values.
187 {-0.05, M_PI / 2.0 + 0.1, 0.0, M_PI / 2.0},
Daniel Pettia7827412015-02-13 20:55:57 -0800188
Austin Schuh0b406bb2015-02-17 02:28:48 -0800189 // Zeroing constants for wrist.
190 {kZeroingSampleSize, kClawEncoderIndexDifference,
191 0.9104180000000001},
Daniel Petti9cf68c82015-02-14 14:57:17 -0800192
Austin Schuh0b406bb2015-02-17 02:28:48 -0800193 6.308141,
194 kClawPistonSwitchTime,
195 kClawZeroingRange},
Comran Morshed79bd3db2015-02-07 14:51:13 +0000196
Austin Schuh0b406bb2015-02-17 02:28:48 -0800197 {// Elevator values, in meters.
198 // 0 is the portion of the elevator carriage that Spencer removed
199 // lining up with the bolt.
200 // Positive is up.
201 {-0.00500, 0.679000, 0.010000, 0.650000},
Comran Morshed79bd3db2015-02-07 14:51:13 +0000202
Austin Schuh0b406bb2015-02-17 02:28:48 -0800203 // Arm values, in radians.
204 // 0 is sticking straight out horizontally over the intake/front.
205 // Positive is rotating up and into the robot (towards the back).
206 {-M_PI / 2 - 0.05, M_PI / 2 + 0.05, -M_PI / 2, M_PI / 2},
Daniel Pettia7827412015-02-13 20:55:57 -0800207
Austin Schuh0b406bb2015-02-17 02:28:48 -0800208 // Elevator zeroing constants: left, right.
209 // TODO(sensors): Get actual offsets for these.
210 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.058672},
211 {kZeroingSampleSize, kElevatorEncoderIndexDifference, 0.078646},
212 // Arm zeroing constants: left, right.
213 {kZeroingSampleSize, kArmEncoderIndexDifference, -0.324437},
214 {kZeroingSampleSize, kArmEncoderIndexDifference, -0.064683},
215 0.722230,
216 -0.081354,
217 -3.509611 - 0.007415 - -0.019081,
218 3.506927 - 0.170017 - -0.147970,
Daniel Pettiee4fa802015-02-17 10:39:27 -0800219
220 kArmZeroingHeight,
221 kElevatorNormalHeight,
Austin Schuh703b8d42015-02-01 14:56:34 -0800222 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000223 // End "sensor" values.
Austin Schuh703b8d42015-02-01 14:56:34 -0800224
225 kMaxAllowedLeftRightArmDifference,
226 kMaxAllowedLeftRightElevatorDifference,
Brian Silverman756f9ff2014-01-17 23:40:23 -0800227 };
Brian Silverman431500a2013-10-28 19:50:15 -0700228 break;
229 case kPracticeTeamNumber:
Brian Silverman756f9ff2014-01-17 23:40:23 -0800230 return new Values{
Daniel Pettia7827412015-02-13 20:55:57 -0800231 kDrivetrainEncoderRatio,
232 kArmEncoderRatio,
233 kArmPotRatio,
234 kElevatorEncoderRatio,
235 kElevatorPotRatio,
236 kElevatorGearboxOutputRadianDistance,
237 kClawEncoderRatio,
238 kClawPotRatio,
239 kLowGearRatio,
240 kHighGearRatio,
Austin Schuh288c8c32014-02-16 17:20:17 -0800241 kPracticeLeftDriveShifter,
242 kPracticeRightDriveShifter,
243 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -0700244 kRobotWidth,
Austin Schuha25a0412014-03-09 00:50:04 -0800245 control_loops::MakeVelocityDrivetrainLoop,
246 control_loops::MakeDrivetrainLoop,
Comran Morshed79bd3db2015-02-07 14:51:13 +0000247 0.02, // drivetrain done delta
248 5.0, // drivetrain max speed
249
Comran Morshed79bd3db2015-02-07 14:51:13 +0000250 // Motion ranges: hard_lower_limit, hard_upper_limit,
251 // soft_lower_limit, soft_upper_limit
252 // TODO(sensors): Get actual bounds before turning on robot.
Austin Schuhbfb8b242015-02-16 15:45:22 -0800253 {// Claw values, in radians.
254 // 0 is level with the ground.
255 // Positive moves in the direction of positive encoder values.
256 {-0.05, M_PI / 2.0 + 0.1, 0.0, M_PI / 2.0},
Daniel Pettia7827412015-02-13 20:55:57 -0800257
Austin Schuhbfb8b242015-02-16 15:45:22 -0800258 // Zeroing constants for wrist.
259 // TODO(sensors): Get actual offsets for these.
Austin Schuh8a436e82015-02-16 23:31:28 -0800260 {kZeroingSampleSize, kClawEncoderIndexDifference, 0.973311},
Austin Schuhbfb8b242015-02-16 15:45:22 -0800261 6.1663463999999992,
Daniel Petti9cf68c82015-02-14 14:57:17 -0800262
263 kClawPistonSwitchTime,
Daniel Pettiee4fa802015-02-17 10:39:27 -0800264 kClawZeroingRange},
Comran Morshed79bd3db2015-02-07 14:51:13 +0000265
Austin Schuhbfb8b242015-02-16 15:45:22 -0800266 {// Elevator values, in meters.
267 // 0 is at the top of the elevator frame.
268 // Positive is down towards the drivebase.
269 {-0.00500, 0.679000, 0.010000, 0.650000},
Comran Morshed79bd3db2015-02-07 14:51:13 +0000270
Austin Schuhbfb8b242015-02-16 15:45:22 -0800271 // Arm values, in radians.
272 // 0 is sticking straight out horizontally over the intake/front.
273 // Positive is rotating up and into the robot (towards the back).
274 {-M_PI / 2 - 0.05, M_PI / 2 + 0.05, -M_PI / 2, M_PI / 2},
Daniel Pettia7827412015-02-13 20:55:57 -0800275
Austin Schuhbfb8b242015-02-16 15:45:22 -0800276 // Elevator zeroing constants: left, right.
277 // TODO(sensors): Get actual offsets for these.
Daniel Pettiee4fa802015-02-17 10:39:27 -0800278 {kZeroingSampleSize, kElevatorEncoderIndexDifference,
279 0.016041 + 0.001290},
280 {kZeroingSampleSize, kElevatorEncoderIndexDifference,
281 0.011367 + 0.003216},
Austin Schuhbfb8b242015-02-16 15:45:22 -0800282 // Arm zeroing constants: left, right.
283 {kZeroingSampleSize, kArmEncoderIndexDifference, -0.312677},
284 {kZeroingSampleSize, kArmEncoderIndexDifference, -0.40855},
285 0.72069366666666679 - 0.026008,
286 -0.078959636363636357 - 0.024646,
287 -3.4952331578947375 + 0.011776,
288 3.5263507647058816 - 0.018921 + 0.006545,
Daniel Pettie1bb13e2015-02-17 13:59:15 -0800289
290 kArmZeroingHeight,
Daniel Pettiee4fa802015-02-17 10:39:27 -0800291 kElevatorNormalHeight,
Austin Schuh703b8d42015-02-01 14:56:34 -0800292 },
Comran Morshed79bd3db2015-02-07 14:51:13 +0000293 // TODO(sensors): End "sensor" values.
Austin Schuh703b8d42015-02-01 14:56:34 -0800294
295 kMaxAllowedLeftRightArmDifference,
296 kMaxAllowedLeftRightElevatorDifference,
Brian Silverman756f9ff2014-01-17 23:40:23 -0800297 };
Brian Silverman431500a2013-10-28 19:50:15 -0700298 break;
299 default:
300 LOG(FATAL, "unknown team #%" PRIu16 "\n", team);
301 }
302}
303
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000304const Values *DoGetValues() {
305 uint16_t team = ::aos::network::GetTeamNumber();
306 LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
307 return DoGetValuesForTeam(team);
308}
309
Brian Silverman431500a2013-10-28 19:50:15 -0700310} // namespace
311
312const Values &GetValues() {
313 static ::aos::Once<const Values> once(DoGetValues);
314 return *once.Get();
315}
316
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000317const Values &GetValuesForTeam(uint16_t team_number) {
Brian Silverman0a151c92014-05-02 15:28:44 -0700318 static ::aos::Mutex mutex;
319 ::aos::MutexLocker locker(&mutex);
320
321 // IMPORTANT: This declaration has to stay after the mutex is locked to avoid
322 // race conditions.
323 static ::std::map<uint16_t, const Values *> values;
324
325 if (values.count(team_number) == 0) {
326 values[team_number] = DoGetValuesForTeam(team_number);
327#if __has_feature(address_sanitizer)
328 __lsan_ignore_object(values[team_number]);
329#endif
330 }
331 return *values[team_number];
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000332}
333
Brian Silverman431500a2013-10-28 19:50:15 -0700334} // namespace constants
335} // namespace frc971