blob: 3016db5ef347c975fdb351628bc89b74f7be5e85 [file] [log] [blame]
brians343bc112013-02-10 01:53:46 +00001#include "frc971/constants.h"
2
3#include <stddef.h>
Austin Schuh464ee1a2013-03-01 22:37:39 -08004#include <math.h>
brians343bc112013-02-10 01:53:46 +00005
Brian Silverman20fdbef2013-03-09 13:42:03 -08006#include "aos/common/inttypes.h"
brians343bc112013-02-10 01:53:46 +00007#include "aos/common/messages/RobotState.q.h"
Brian Silverman3204dd82013-03-12 18:42:01 -07008#include "aos/common/logging/logging.h"
brians343bc112013-02-10 01:53:46 +00009
Brian Silverman20fdbef2013-03-09 13:42:03 -080010#ifndef M_PI
11#define M_PI 3.14159265358979323846
12#endif
13
brians343bc112013-02-10 01:53:46 +000014namespace frc971 {
15namespace constants {
16
17namespace {
18
Brian Silverman18f6d872013-03-16 13:55:46 -070019// It has about 0.029043 of gearbox slop.
Brian Silverman6da70212013-09-29 16:52:10 -070020// For purposes of moving the end up/down by a certain amount, the wrist is 18
21// inches long.
Brian Silverman87e708d2013-04-08 14:30:22 -070022const double kCompWristHallEffectStartAngle = 1.285;
Brian Silverman22519822013-10-17 20:22:14 -070023const double kPracticeWristHallEffectStartAngle = 1.175;
Austin Schuhfa033692013-02-24 01:00:55 -080024
James Kuszmaule06e2512013-03-02 15:04:53 -080025const double kCompWristHallEffectStopAngle = 100 * M_PI / 180.0;
26const double kPracticeWristHallEffectStopAngle = 100 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080027
Brian Silverman18f6d872013-03-16 13:55:46 -070028const double kPracticeWristUpperPhysicalLimit = 1.677562;
29const double kCompWristUpperPhysicalLimit = 1.677562;
Austin Schuhfa033692013-02-24 01:00:55 -080030
Brian Silverman18f6d872013-03-16 13:55:46 -070031const double kPracticeWristLowerPhysicalLimit = -0.746128;
32const double kCompWristLowerPhysicalLimit = -0.746128;
Austin Schuhfa033692013-02-24 01:00:55 -080033
Brian Silverman18f6d872013-03-16 13:55:46 -070034const double kPracticeWristUpperLimit = 1.615385;
35const double kCompWristUpperLimit = 1.615385;
Austin Schuhfa033692013-02-24 01:00:55 -080036
Brian Silverman18f6d872013-03-16 13:55:46 -070037const double kPracticeWristLowerLimit = -0.746128;
38const double kCompWristLowerLimit = -0.746128;
Austin Schuhfa033692013-02-24 01:00:55 -080039
Brian Silverman5cd007f2013-04-05 13:51:37 -070040const double kWristZeroingSpeed = 0.125;
Brian Silvermanbcaf3842013-03-16 23:49:35 -070041const double kWristZeroingOffSpeed = 0.35;
Austin Schuhfa033692013-02-24 01:00:55 -080042
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080043const int kAngleAdjustHallEffect = 2;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080044
Brian Silverman41c95932013-08-31 11:44:07 -070045// Angle measured from CAD with the top of the angle adjust at the top of the
46// wire guide is 0.773652098 radians.
47
48const double kCompAngleAdjustHallEffectStartAngle[2] = {0.301170496, 1.5};
Brian Silverman304b2bf2013-04-04 17:54:41 -070049const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.305172594, 1.5};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080050
Austin Schuhb5191b92013-03-10 18:22:24 -070051const double kCompAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
52const double kPracticeAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080053
Brian Silverman77f41752013-03-16 13:56:32 -070054const double kPracticeAngleAdjustUpperPhysicalLimit = 0.904737;
55const double kCompAngleAdjustUpperPhysicalLimit = 0.904737;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080056
Brian Silverman41c95932013-08-31 11:44:07 -070057const double kPracticeAngleAdjustLowerPhysicalLimit = 0.270;
Brian Silverman171ada42013-03-21 15:17:10 -070058const double kCompAngleAdjustLowerPhysicalLimit = 0.302;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080059
Brian Silverman77f41752013-03-16 13:56:32 -070060const double kPracticeAngleAdjustUpperLimit = 0.87;
61const double kCompAngleAdjustUpperLimit = 0.87;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080062
Brian Silverman41c95932013-08-31 11:44:07 -070063const double kPracticeAngleAdjustLowerLimit = 0.31;
64const double kCompAngleAdjustLowerLimit = 0.28;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080065
Austin Schuh9644e1c2013-03-12 00:40:36 -070066const double kAngleAdjustZeroingSpeed = -0.2;
Austin Schuhdd3bc412013-03-16 17:02:40 -070067const double kAngleAdjustZeroingOffSpeed = -0.5;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080068
Brian Silverman41c95932013-08-31 11:44:07 -070069const double kPracticeAngleAdjustDeadband = 0.4;
Brian Silverman9c98ff72013-09-11 14:09:56 -070070const double kCompAngleAdjustDeadband = 0.65;
Brian Silverman3cb1d802013-08-30 15:41:49 -070071
brians343bc112013-02-10 01:53:46 +000072const int kCompCameraCenter = -2;
73const int kPracticeCameraCenter = -5;
74
Brian Silverman656789c2013-09-21 23:53:35 -070075const int kCompDrivetrainGearboxPinion = 19;
76const int kPracticeDrivetrainGearboxPinion = 17;
77
brians343bc112013-02-10 01:53:46 +000078struct Values {
Austin Schuhfa033692013-02-24 01:00:55 -080079 // Wrist hall effect positive and negative edges.
James Kuszmaule06e2512013-03-02 15:04:53 -080080 double wrist_hall_effect_start_angle;
81 double wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -080082
83 // Upper and lower extreme limits of travel for the wrist.
James Kuszmaule06e2512013-03-02 15:04:53 -080084 double wrist_upper_limit;
85 double wrist_lower_limit;
86
Austin Schuhfa033692013-02-24 01:00:55 -080087 // Physical limits. These are here for testing.
James Kuszmaule06e2512013-03-02 15:04:53 -080088 double wrist_upper_physical_limit;
89 double wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -080090
91 // Zeroing speed.
James Kuszmaule06e2512013-03-02 15:04:53 -080092 double wrist_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -070093 // Zeroing off speed.
94 double wrist_zeroing_off_speed;
Austin Schuhfa033692013-02-24 01:00:55 -080095
James Kuszmaul4a4622b2013-03-02 16:28:29 -080096 // AngleAdjust hall effect positive and negative edges.
Austin Schuhe20e93c2013-03-09 19:54:16 -080097 const double *angle_adjust_hall_effect_start_angle;
98 const double *angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080099
100 // Upper and lower extreme limits of travel for the angle adjust.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800101 double angle_adjust_upper_limit;
102 double angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800103 // Physical limits. These are here for testing.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800104 double angle_adjust_upper_physical_limit;
105 double angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800106
107 // Zeroing speed.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800108 double angle_adjust_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -0700109 // Zeroing off speed.
110 double angle_adjust_zeroing_off_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800111
Brian Silverman3cb1d802013-08-30 15:41:49 -0700112 // Deadband voltage.
113 double angle_adjust_deadband;
114
Brian Silverman656789c2013-09-21 23:53:35 -0700115 int drivetrain_gearbox_pinion;
116
brians343bc112013-02-10 01:53:46 +0000117 // what camera_center returns
118 int camera_center;
brians343bc112013-02-10 01:53:46 +0000119};
Austin Schuhfa033692013-02-24 01:00:55 -0800120
brians343bc112013-02-10 01:53:46 +0000121Values *values = NULL;
122// Attempts to retrieve a new Values instance and stores it in values if
123// necessary.
124// Returns a valid Values instance or NULL.
125const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800126 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000127 if (values == NULL) {
Brian Silverman8efe23e2013-07-07 23:31:37 -0700128 LOG(INFO, "creating a Constants for team %" PRIu16 "\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800129 ::aos::robot_state->team_id);
130 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000131 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800132 values = new Values{kCompWristHallEffectStartAngle,
133 kCompWristHallEffectStopAngle,
134 kCompWristUpperLimit,
135 kCompWristLowerLimit,
136 kCompWristUpperPhysicalLimit,
137 kCompWristLowerPhysicalLimit,
138 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700139 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800140 kCompAngleAdjustHallEffectStartAngle,
141 kCompAngleAdjustHallEffectStopAngle,
142 kCompAngleAdjustUpperLimit,
143 kCompAngleAdjustLowerLimit,
144 kCompAngleAdjustUpperPhysicalLimit,
145 kCompAngleAdjustLowerPhysicalLimit,
146 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700147 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700148 kCompAngleAdjustDeadband,
Brian Silverman656789c2013-09-21 23:53:35 -0700149 kCompDrivetrainGearboxPinion,
Austin Schuhfa033692013-02-24 01:00:55 -0800150 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000151 break;
152 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800153 values = new Values{kPracticeWristHallEffectStartAngle,
154 kPracticeWristHallEffectStopAngle,
155 kPracticeWristUpperLimit,
156 kPracticeWristLowerLimit,
157 kPracticeWristUpperPhysicalLimit,
158 kPracticeWristLowerPhysicalLimit,
159 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700160 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800161 kPracticeAngleAdjustHallEffectStartAngle,
162 kPracticeAngleAdjustHallEffectStopAngle,
163 kPracticeAngleAdjustUpperLimit,
164 kPracticeAngleAdjustLowerLimit,
165 kPracticeAngleAdjustUpperPhysicalLimit,
166 kPracticeAngleAdjustLowerPhysicalLimit,
167 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700168 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700169 kPracticeAngleAdjustDeadband,
Brian Silverman656789c2013-09-21 23:53:35 -0700170 kPracticeDrivetrainGearboxPinion,
Austin Schuhfa033692013-02-24 01:00:55 -0800171 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000172 break;
173 default:
Brian Silverman8efe23e2013-07-07 23:31:37 -0700174 LOG(ERROR, "unknown team #%" PRIu16 "\n",
brians343bc112013-02-10 01:53:46 +0000175 aos::robot_state->team_id);
176 return NULL;
177 }
178 }
179 return values;
180}
181
182} // namespace
183
James Kuszmaule06e2512013-03-02 15:04:53 -0800184bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000185 const Values *const values = GetValues();
186 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800187 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000188 return true;
189}
James Kuszmaule06e2512013-03-02 15:04:53 -0800190bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800191 const Values *const values = GetValues();
192 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800193 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800194 return true;
195}
James Kuszmaule06e2512013-03-02 15:04:53 -0800196bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800197 const Values *const values = GetValues();
198 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800199 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800200 return true;
201}
202
James Kuszmaule06e2512013-03-02 15:04:53 -0800203bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800204 const Values *const values = GetValues();
205 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800206 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800207 return true;
208}
209
James Kuszmaule06e2512013-03-02 15:04:53 -0800210bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800211 const Values *const values = GetValues();
212 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800213 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800214 return true;
215}
216
James Kuszmaule06e2512013-03-02 15:04:53 -0800217bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800218 const Values *const values = GetValues();
219 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800220 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800221 return true;
222}
223
James Kuszmaule06e2512013-03-02 15:04:53 -0800224bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800225 const Values *const values = GetValues();
226 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800227 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800228 return true;
229}
230
Austin Schuhdd3bc412013-03-16 17:02:40 -0700231bool wrist_zeroing_off_speed(double *speed) {
232 const Values *const values = GetValues();
233 if (values == NULL) return false;
234 *speed = values->wrist_zeroing_off_speed;
235 return true;
236}
237
Austin Schuhe20e93c2013-03-09 19:54:16 -0800238bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800239 const Values *const values = GetValues();
240 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800241 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
242 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800243 return true;
244}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800245bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800246 const Values *const values = GetValues();
247 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800248 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
249 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800250 return true;
251}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800252bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800253 const Values *const values = GetValues();
254 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800255 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800256 return true;
257}
258
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800259bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800260 const Values *const values = GetValues();
261 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800262 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800263 return true;
264}
265
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800266bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800267 const Values *const values = GetValues();
268 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800269 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800270 return true;
271}
272
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800273bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800274 const Values *const values = GetValues();
275 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800276 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800277 return true;
278}
279
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800280bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800281 const Values *const values = GetValues();
282 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800283 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800284 return true;
285}
286
Austin Schuhdd3bc412013-03-16 17:02:40 -0700287bool angle_adjust_zeroing_off_speed(double *speed) {
288 const Values *const values = GetValues();
289 if (values == NULL) return false;
290 *speed = values->angle_adjust_zeroing_off_speed;
291 return true;
292}
293
Brian Silverman3cb1d802013-08-30 15:41:49 -0700294bool angle_adjust_deadband(double *voltage) {
295 const Values *const values = GetValues();
296 if (values == NULL) return false;
297 *voltage = values->angle_adjust_deadband;
298 return true;
299}
300
Brian Silverman656789c2013-09-21 23:53:35 -0700301bool drivetrain_gearbox_pinion(int *pinion) {
302 const Values *const values = GetValues();
303 if (values == NULL) return false;
304 *pinion = values->drivetrain_gearbox_pinion;
305 return true;
306}
307
brians343bc112013-02-10 01:53:46 +0000308bool camera_center(int *center) {
309 const Values *const values = GetValues();
310 if (values == NULL) return false;
311 *center = values->camera_center;
312 return true;
313}
brians343bc112013-02-10 01:53:46 +0000314
315} // namespace constants
316} // namespace frc971