blob: 40f4e8838d07f4350fa2fd0572488689732e3d7d [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;
Daniel Pettib046c532013-10-29 03:40:40 +000077const int kBot3DrivetrainGearboxPinion = 15;
Brian Silverman656789c2013-09-21 23:53:35 -070078
brians343bc112013-02-10 01:53:46 +000079struct Values {
Austin Schuhfa033692013-02-24 01:00:55 -080080 // Wrist hall effect positive and negative edges.
James Kuszmaule06e2512013-03-02 15:04:53 -080081 double wrist_hall_effect_start_angle;
82 double wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -080083
84 // Upper and lower extreme limits of travel for the wrist.
James Kuszmaule06e2512013-03-02 15:04:53 -080085 double wrist_upper_limit;
86 double wrist_lower_limit;
87
Austin Schuhfa033692013-02-24 01:00:55 -080088 // Physical limits. These are here for testing.
James Kuszmaule06e2512013-03-02 15:04:53 -080089 double wrist_upper_physical_limit;
90 double wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -080091
92 // Zeroing speed.
James Kuszmaule06e2512013-03-02 15:04:53 -080093 double wrist_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -070094 // Zeroing off speed.
95 double wrist_zeroing_off_speed;
Austin Schuhfa033692013-02-24 01:00:55 -080096
James Kuszmaul4a4622b2013-03-02 16:28:29 -080097 // AngleAdjust hall effect positive and negative edges.
Austin Schuhe20e93c2013-03-09 19:54:16 -080098 const double *angle_adjust_hall_effect_start_angle;
99 const double *angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800100
101 // Upper and lower extreme limits of travel for the angle adjust.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800102 double angle_adjust_upper_limit;
103 double angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800104 // Physical limits. These are here for testing.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800105 double angle_adjust_upper_physical_limit;
106 double angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800107
108 // Zeroing speed.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800109 double angle_adjust_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -0700110 // Zeroing off speed.
111 double angle_adjust_zeroing_off_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800112
Brian Silverman3cb1d802013-08-30 15:41:49 -0700113 // Deadband voltage.
114 double angle_adjust_deadband;
115
Brian Silverman656789c2013-09-21 23:53:35 -0700116 int drivetrain_gearbox_pinion;
117
brians343bc112013-02-10 01:53:46 +0000118 // what camera_center returns
119 int camera_center;
brians343bc112013-02-10 01:53:46 +0000120};
Austin Schuhfa033692013-02-24 01:00:55 -0800121
brians343bc112013-02-10 01:53:46 +0000122Values *values = NULL;
123// Attempts to retrieve a new Values instance and stores it in values if
124// necessary.
125// Returns a valid Values instance or NULL.
126const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800127 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000128 if (values == NULL) {
Brian Silverman8efe23e2013-07-07 23:31:37 -0700129 LOG(INFO, "creating a Constants for team %" PRIu16 "\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800130 ::aos::robot_state->team_id);
131 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000132 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800133 values = new Values{kCompWristHallEffectStartAngle,
134 kCompWristHallEffectStopAngle,
135 kCompWristUpperLimit,
136 kCompWristLowerLimit,
137 kCompWristUpperPhysicalLimit,
138 kCompWristLowerPhysicalLimit,
139 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700140 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800141 kCompAngleAdjustHallEffectStartAngle,
142 kCompAngleAdjustHallEffectStopAngle,
143 kCompAngleAdjustUpperLimit,
144 kCompAngleAdjustLowerLimit,
145 kCompAngleAdjustUpperPhysicalLimit,
146 kCompAngleAdjustLowerPhysicalLimit,
147 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700148 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700149 kCompAngleAdjustDeadband,
Brian Silverman656789c2013-09-21 23:53:35 -0700150 kCompDrivetrainGearboxPinion,
Austin Schuhfa033692013-02-24 01:00:55 -0800151 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000152 break;
153 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800154 values = new Values{kPracticeWristHallEffectStartAngle,
155 kPracticeWristHallEffectStopAngle,
156 kPracticeWristUpperLimit,
157 kPracticeWristLowerLimit,
158 kPracticeWristUpperPhysicalLimit,
159 kPracticeWristLowerPhysicalLimit,
160 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700161 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800162 kPracticeAngleAdjustHallEffectStartAngle,
163 kPracticeAngleAdjustHallEffectStopAngle,
164 kPracticeAngleAdjustUpperLimit,
165 kPracticeAngleAdjustLowerLimit,
166 kPracticeAngleAdjustUpperPhysicalLimit,
167 kPracticeAngleAdjustLowerPhysicalLimit,
168 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700169 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700170 kPracticeAngleAdjustDeadband,
Brian Silverman656789c2013-09-21 23:53:35 -0700171 kPracticeDrivetrainGearboxPinion,
Austin Schuhfa033692013-02-24 01:00:55 -0800172 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000173 break;
174 default:
Brian Silverman8efe23e2013-07-07 23:31:37 -0700175 LOG(ERROR, "unknown team #%" PRIu16 "\n",
brians343bc112013-02-10 01:53:46 +0000176 aos::robot_state->team_id);
177 return NULL;
178 }
179 }
180 return values;
181}
182
183} // namespace
184
James Kuszmaule06e2512013-03-02 15:04:53 -0800185bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000186 const Values *const values = GetValues();
187 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800188 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000189 return true;
190}
James Kuszmaule06e2512013-03-02 15:04:53 -0800191bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800192 const Values *const values = GetValues();
193 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800194 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800195 return true;
196}
James Kuszmaule06e2512013-03-02 15:04:53 -0800197bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800198 const Values *const values = GetValues();
199 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800200 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800201 return true;
202}
203
James Kuszmaule06e2512013-03-02 15:04:53 -0800204bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800205 const Values *const values = GetValues();
206 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800207 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800208 return true;
209}
210
James Kuszmaule06e2512013-03-02 15:04:53 -0800211bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800212 const Values *const values = GetValues();
213 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800214 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800215 return true;
216}
217
James Kuszmaule06e2512013-03-02 15:04:53 -0800218bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800219 const Values *const values = GetValues();
220 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800221 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800222 return true;
223}
224
James Kuszmaule06e2512013-03-02 15:04:53 -0800225bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800226 const Values *const values = GetValues();
227 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800228 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800229 return true;
230}
231
Austin Schuhdd3bc412013-03-16 17:02:40 -0700232bool wrist_zeroing_off_speed(double *speed) {
233 const Values *const values = GetValues();
234 if (values == NULL) return false;
235 *speed = values->wrist_zeroing_off_speed;
236 return true;
237}
238
Austin Schuhe20e93c2013-03-09 19:54:16 -0800239bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800240 const Values *const values = GetValues();
241 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800242 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
243 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800244 return true;
245}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800246bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800247 const Values *const values = GetValues();
248 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800249 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
250 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800251 return true;
252}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800253bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800254 const Values *const values = GetValues();
255 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800256 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800257 return true;
258}
259
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800260bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800261 const Values *const values = GetValues();
262 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800263 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800264 return true;
265}
266
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800267bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800268 const Values *const values = GetValues();
269 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800270 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800271 return true;
272}
273
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800274bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800275 const Values *const values = GetValues();
276 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800277 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800278 return true;
279}
280
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800281bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800282 const Values *const values = GetValues();
283 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800284 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800285 return true;
286}
287
Austin Schuhdd3bc412013-03-16 17:02:40 -0700288bool angle_adjust_zeroing_off_speed(double *speed) {
289 const Values *const values = GetValues();
290 if (values == NULL) return false;
291 *speed = values->angle_adjust_zeroing_off_speed;
292 return true;
293}
294
Brian Silverman3cb1d802013-08-30 15:41:49 -0700295bool angle_adjust_deadband(double *voltage) {
296 const Values *const values = GetValues();
297 if (values == NULL) return false;
298 *voltage = values->angle_adjust_deadband;
299 return true;
300}
301
Brian Silverman656789c2013-09-21 23:53:35 -0700302bool drivetrain_gearbox_pinion(int *pinion) {
303 const Values *const values = GetValues();
304 if (values == NULL) return false;
305 *pinion = values->drivetrain_gearbox_pinion;
306 return true;
307}
308
brians343bc112013-02-10 01:53:46 +0000309bool camera_center(int *center) {
310 const Values *const values = GetValues();
311 if (values == NULL) return false;
312 *center = values->camera_center;
313 return true;
314}
brians343bc112013-02-10 01:53:46 +0000315
316} // namespace constants
317} // namespace frc971