blob: bd6019f9da7a1cf468f2ea478fe600209a91acf0 [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;
Austin Schuh010eb812014-10-25 18:06:49 -070031const uint16_t kRoboRioTeamNumber = 254;
Brian Silvermane5db0c62014-03-13 15:53:18 -070032
Brian Silverman1a6590d2013-11-04 14:46:46 -080033const double kCompDrivetrainEncoderRatio =
Brian Silvermanf970f2c2014-03-22 19:34:30 -070034 (18.0 / 50.0) /*output reduction*/ * (56.0 / 30.0) /*encoder gears*/;
35const double kCompLowGearRatio = 18.0 / 60.0 * 18.0 / 50.0;
36const double kCompHighGearRatio = 28.0 / 50.0 * 18.0 / 50.0;
Brian Silverman431500a2013-10-28 19:50:15 -070037
Brian Silvermanf970f2c2014-03-22 19:34:30 -070038const double kPracticeDrivetrainEncoderRatio = kCompDrivetrainEncoderRatio;
39const double kPracticeLowGearRatio = kCompLowGearRatio;
40const double kPracticeHighGearRatio = kCompHighGearRatio;
Brian Silverman1a6590d2013-11-04 14:46:46 -080041
Brian Silvermane5db0c62014-03-13 15:53:18 -070042const ShifterHallEffect kCompRightDriveShifter{555, 657, 660, 560, 0.2, 0.7};
43const ShifterHallEffect kCompLeftDriveShifter{555, 660, 644, 552, 0.2, 0.7};
Brian Silverman6eb51f12013-11-02 14:39:01 -070044
Austin Schuh010eb812014-10-25 18:06:49 -070045const ShifterHallEffect kPracticeRightDriveShifter{2.95, 3.95, 3.95, 2.95, 0.2, 0.7};
46const ShifterHallEffect kPracticeLeftDriveShifter{2.95, 4.2, 3.95, 3.0, 0.2, 0.7};
Brian Silvermane5db0c62014-03-13 15:53:18 -070047
Brian Silvermanad9e0002014-04-13 14:55:57 -070048const double kRobotWidth = 25.0 / 100.0 * 2.54;
49
Austin Schuh06cbbf12014-02-22 02:07:31 -080050const double shooter_zeroing_speed = 0.05;
Austin Schuh6b428602014-02-22 21:02:00 -080051const double shooter_unload_speed = 0.08;
Brian Silverman6eb51f12013-11-02 14:39:01 -070052
Brian Silvermanedcfd2d2014-04-03 13:04:16 -070053// Smaller (more negative) = opening.
54const double kCompTopClawOffset = -0.120;
55
Ben Fredricksona9dcfa42014-02-23 02:05:59 +000056const Values *DoGetValuesForTeam(uint16_t team) {
Brian Silverman431500a2013-10-28 19:50:15 -070057 switch (team) {
Brian Silverman0d2b7cb2014-02-18 20:25:57 -080058 case 1: // for tests
59 return new Values{
60 kCompDrivetrainEncoderRatio,
61 kCompLowGearRatio,
62 kCompHighGearRatio,
63 kCompLeftDriveShifter,
64 kCompRightDriveShifter,
Austin Schuh11726212014-03-02 14:01:02 -080065 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -070066 0.5,
Austin Schuha25a0412014-03-09 00:50:04 -080067 control_loops::MakeVelocityDrivetrainLoop,
68 control_loops::MakeDrivetrainLoop,
Brian Silverman0d2b7cb2014-02-18 20:25:57 -080069 // ShooterLimits
Brian Silvermanc92a4a82014-08-19 12:58:28 -040070 {-0.00127, 0.298196, -0.0017, 0.305054, 0.0149098,
71 {-0.001778, 0.000762, 0, 0},
72 {-0.001778, 0.008906, 0, 0},
73 {0.006096, 0.026416, 0, 0},
Austin Schuh6b428602014-02-22 21:02:00 -080074 shooter_zeroing_speed,
75 shooter_unload_speed
Brian Silverman0d2b7cb2014-02-18 20:25:57 -080076 },
77 {0.5,
78 0.1,
79 0.1,
80 0.0,
81 1.57,
Brian Silverman11c6f7f2014-04-30 17:38:21 -070082 0.05,
83 1.5,
Austin Schuh27b8fb12014-02-22 15:10:05 -080084 {0.0, 2.05, 0.02, 2.02, {-0.1, 0.05, -0.1, 0.05}, {1.0, 1.1, 1.0, 1.1}, {2.0, 2.1, 2.0, 2.1}},
85 {0.0, 2.05, 0.02, 2.02, {-0.1, 0.05, -0.1, 0.05}, {1.0, 1.1, 1.0, 1.1}, {2.0, 2.1, 2.0, 2.1}},
Brian Silverman0d2b7cb2014-02-18 20:25:57 -080086 0.01, // claw_unimportant_epsilon
87 0.9, // start_fine_tune_pos
88 4.0,
James Kuszmaul9ead1de2014-02-28 21:24:39 -080089 },
Austin Schuh809c2562014-03-02 11:50:19 -080090 {0.07, 0.15}, // shooter_action
Ben Fredrickson890c3fe2014-03-02 00:15:16 +000091 0.02, // drivetrain done delta
92 5.0 // drivetrain max speed
Brian Silverman0d2b7cb2014-02-18 20:25:57 -080093 };
94 break;
Brian Silverman431500a2013-10-28 19:50:15 -070095 case kCompTeamNumber:
Brian Silverman756f9ff2014-01-17 23:40:23 -080096 return new Values{
Austin Schuh288c8c32014-02-16 17:20:17 -080097 kCompDrivetrainEncoderRatio,
98 kCompLowGearRatio,
99 kCompHighGearRatio,
100 kCompLeftDriveShifter,
101 kCompRightDriveShifter,
Brian Silvermanedcfd2d2014-04-03 13:04:16 -0700102 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -0700103 kRobotWidth,
Austin Schuha25a0412014-03-09 00:50:04 -0800104 control_loops::MakeVelocityDrivetrainLoop,
105 control_loops::MakeDrivetrainLoop,
Brian Silverman5911b402014-02-16 19:40:50 -0800106 // ShooterLimits
Brian Silvermane5db0c62014-03-13 15:53:18 -0700107 {-0.001041, 0.296019, -0.001488, 0.302717, 0.0149098,
108 {-0.002, 0.000446, -0.002, 0.000446},
109 {-0.002, 0.009078, -0.002, 0.009078},
110 {0.003870, 0.026194, 0.003869, 0.026343},
Austin Schuh6b428602014-02-22 21:02:00 -0800111 shooter_zeroing_speed,
112 shooter_unload_speed
Austin Schuh60c56662014-02-17 14:37:19 -0800113 },
Brian Silvermane5db0c62014-03-13 15:53:18 -0700114 {0.800000,
115 0.400000,
116 0.000000,
117 -1.220821,
118 1.822142,
119 -0.849484,
120 1.42309,
Brian Silvermanedcfd2d2014-04-03 13:04:16 -0700121 // 0.0371
122 {-3.3284, 2.0917, -3.1661, 1.95,
Brian Silverman2eede452014-04-26 07:36:19 -0500123 {-3.4, -3.02 + kCompTopClawOffset, -3.4, -2.9876 + kCompTopClawOffset},
Brian Silvermanedcfd2d2014-04-03 13:04:16 -0700124 {-0.1433 + kCompTopClawOffset, 0.0670 + kCompTopClawOffset, -0.1460 + kCompTopClawOffset, 0.0648 + kCompTopClawOffset},
125 {1.9952 + kCompTopClawOffset, 2.2, 1.9898 + kCompTopClawOffset, 2.2}},
Brian Silvermane5db0c62014-03-13 15:53:18 -0700126 {-2.453460, 3.082960, -2.453460, 3.082960,
127 {-2.6, -2.185752, -2.6, -2.184843},
128 {-0.280434, -0.049087, -0.277707, -0.047724},
129 {2.892065, 3.2, 2.888429, 3.2}},
130 0.040000, // claw_unimportant_epsilon
131 -0.400000, // start_fine_tune_pos
132 4.000000,
James Kuszmaul9ead1de2014-02-28 21:24:39 -0800133 },
134 //TODO(james): Get realer numbers for shooter_action.
Austin Schuh809c2562014-03-02 11:50:19 -0800135 {0.07, 0.15}, // shooter_action
Ben Fredrickson890c3fe2014-03-02 00:15:16 +0000136 0.02, // drivetrain done delta
137 5.0 // drivetrain max speed
Brian Silverman756f9ff2014-01-17 23:40:23 -0800138 };
Brian Silverman431500a2013-10-28 19:50:15 -0700139 break;
140 case kPracticeTeamNumber:
Austin Schuh010eb812014-10-25 18:06:49 -0700141 case kRoboRioTeamNumber:
Brian Silverman756f9ff2014-01-17 23:40:23 -0800142 return new Values{
Austin Schuh288c8c32014-02-16 17:20:17 -0800143 kPracticeDrivetrainEncoderRatio,
144 kPracticeLowGearRatio,
145 kPracticeHighGearRatio,
146 kPracticeLeftDriveShifter,
147 kPracticeRightDriveShifter,
148 false,
Brian Silvermanad9e0002014-04-13 14:55:57 -0700149 kRobotWidth,
Austin Schuha25a0412014-03-09 00:50:04 -0800150 control_loops::MakeVelocityDrivetrainLoop,
151 control_loops::MakeDrivetrainLoop,
Brian Silverman5911b402014-02-16 19:40:50 -0800152 // ShooterLimits
Austin Schuh06cbbf12014-02-22 02:07:31 -0800153 {-0.001042, 0.294084, -0.001935, 0.303460, 0.0138401,
154 {-0.002, 0.000446, -0.002, 0.000446},
155 {-0.002, 0.009078, -0.002, 0.009078},
156 {0.003869, 0.026194, 0.003869, 0.026194},
Austin Schuh6b428602014-02-22 21:02:00 -0800157 shooter_zeroing_speed,
158 shooter_unload_speed
Austin Schuh60c56662014-02-17 14:37:19 -0800159 },
Austin Schuh78d55462014-02-23 01:39:30 -0800160 {0.400000 * 2.0,
161 0.200000 * 2.0,
162 0.000000 * 2.0,
163 -0.762218 * 2.0,
Brian Silverman06374312014-04-12 16:09:28 -0700164 1.767146,
Austin Schuh78d55462014-02-23 01:39:30 -0800165 -0.849484,
166 1.42308,
Brian Silvermane5db0c62014-03-13 15:53:18 -0700167 {-3.364758, 2.086668, -3.166136, 1.95,
168 {-1.7 * 2.0, -1.544662 * 2.0, -1.7 * 2.0, -1.547616 * 2.0},
169 {-0.130218 * 2.0, -0.019771 * 2.0, -0.132036 * 2.0, -0.018862 * 2.0},
Austin Schuh010eb812014-10-25 18:06:49 -0700170 {1.871684, 2.2, 1.86532, 2.2}},
Brian Silvermane5db0c62014-03-13 15:53:18 -0700171 {-2.451642, 3.107504, -2.273474, 2.750,
Austin Schuh010eb812014-10-25 18:06:49 -0700172 {-2.6, -2.176662, -2.6, -2.176662},
173 {-0.269072, -0.036816, -0.272254, -0.039542},
174 {2.894792, 3.2, 2.887974, 3.2}},
175 0.040000, // claw_unimportant_epsilon
176 -0.400000, // start_fine_tune_pos
Austin Schuh54e2e6c2014-02-21 22:58:53 -0800177 4.000000,
James Kuszmaul9ead1de2014-02-28 21:24:39 -0800178 },
179 //TODO(james): Get realer numbers for shooter_action.
Austin Schuh809c2562014-03-02 11:50:19 -0800180 {0.07, 0.15}, // shooter_action
Ben Fredrickson890c3fe2014-03-02 00:15:16 +0000181 0.02, // drivetrain done delta
182 5.0 // drivetrain max speed
Brian Silverman756f9ff2014-01-17 23:40:23 -0800183 };
Brian Silverman431500a2013-10-28 19:50:15 -0700184 break;
185 default:
186 LOG(FATAL, "unknown team #%" PRIu16 "\n", team);
187 }
188}
189
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000190const Values *DoGetValues() {
191 uint16_t team = ::aos::network::GetTeamNumber();
192 LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
193 return DoGetValuesForTeam(team);
194}
195
Brian Silverman431500a2013-10-28 19:50:15 -0700196} // namespace
197
198const Values &GetValues() {
199 static ::aos::Once<const Values> once(DoGetValues);
200 return *once.Get();
201}
202
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000203const Values &GetValuesForTeam(uint16_t team_number) {
Brian Silverman0a151c92014-05-02 15:28:44 -0700204 static ::aos::Mutex mutex;
205 ::aos::MutexLocker locker(&mutex);
206
207 // IMPORTANT: This declaration has to stay after the mutex is locked to avoid
208 // race conditions.
209 static ::std::map<uint16_t, const Values *> values;
210
211 if (values.count(team_number) == 0) {
212 values[team_number] = DoGetValuesForTeam(team_number);
213#if __has_feature(address_sanitizer)
214 __lsan_ignore_object(values[team_number]);
215#endif
216 }
217 return *values[team_number];
Ben Fredricksona9dcfa42014-02-23 02:05:59 +0000218}
219
Brian Silverman431500a2013-10-28 19:50:15 -0700220} // namespace constants
221} // namespace frc971