blob: 8fbb87585c7fff9f95d9e08a34482772971364fa [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 Silverman87e708d2013-04-08 14:30:22 -070020const double kCompWristHallEffectStartAngle = 1.285;
Brian Silvermanc3486fe2013-09-21 23:52:42 -070021const double kPracticeWristHallEffectStartAngle = 1.182;
Austin Schuhfa033692013-02-24 01:00:55 -080022
James Kuszmaule06e2512013-03-02 15:04:53 -080023const double kCompWristHallEffectStopAngle = 100 * M_PI / 180.0;
24const double kPracticeWristHallEffectStopAngle = 100 * M_PI / 180.0;
Austin Schuhfa033692013-02-24 01:00:55 -080025
Brian Silverman18f6d872013-03-16 13:55:46 -070026const double kPracticeWristUpperPhysicalLimit = 1.677562;
27const double kCompWristUpperPhysicalLimit = 1.677562;
Austin Schuhfa033692013-02-24 01:00:55 -080028
Brian Silverman18f6d872013-03-16 13:55:46 -070029const double kPracticeWristLowerPhysicalLimit = -0.746128;
30const double kCompWristLowerPhysicalLimit = -0.746128;
Austin Schuhfa033692013-02-24 01:00:55 -080031
Brian Silverman18f6d872013-03-16 13:55:46 -070032const double kPracticeWristUpperLimit = 1.615385;
33const double kCompWristUpperLimit = 1.615385;
Austin Schuhfa033692013-02-24 01:00:55 -080034
Brian Silverman18f6d872013-03-16 13:55:46 -070035const double kPracticeWristLowerLimit = -0.746128;
36const double kCompWristLowerLimit = -0.746128;
Austin Schuhfa033692013-02-24 01:00:55 -080037
Brian Silverman5cd007f2013-04-05 13:51:37 -070038const double kWristZeroingSpeed = 0.125;
Brian Silvermanbcaf3842013-03-16 23:49:35 -070039const double kWristZeroingOffSpeed = 0.35;
Austin Schuhfa033692013-02-24 01:00:55 -080040
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080041const int kAngleAdjustHallEffect = 2;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080042
Brian Silverman41c95932013-08-31 11:44:07 -070043// Angle measured from CAD with the top of the angle adjust at the top of the
44// wire guide is 0.773652098 radians.
45
46const double kCompAngleAdjustHallEffectStartAngle[2] = {0.301170496, 1.5};
Brian Silverman304b2bf2013-04-04 17:54:41 -070047const double kPracticeAngleAdjustHallEffectStartAngle[2] = {0.305172594, 1.5};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080048
Austin Schuhb5191b92013-03-10 18:22:24 -070049const double kCompAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
50const double kPracticeAngleAdjustHallEffectStopAngle[2] = {0.1, 1.0};
James Kuszmaul4a4622b2013-03-02 16:28:29 -080051
Brian Silverman77f41752013-03-16 13:56:32 -070052const double kPracticeAngleAdjustUpperPhysicalLimit = 0.904737;
53const double kCompAngleAdjustUpperPhysicalLimit = 0.904737;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080054
Brian Silverman41c95932013-08-31 11:44:07 -070055const double kPracticeAngleAdjustLowerPhysicalLimit = 0.270;
Brian Silverman171ada42013-03-21 15:17:10 -070056const double kCompAngleAdjustLowerPhysicalLimit = 0.302;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080057
Brian Silverman77f41752013-03-16 13:56:32 -070058const double kPracticeAngleAdjustUpperLimit = 0.87;
59const double kCompAngleAdjustUpperLimit = 0.87;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080060
Brian Silverman41c95932013-08-31 11:44:07 -070061const double kPracticeAngleAdjustLowerLimit = 0.31;
62const double kCompAngleAdjustLowerLimit = 0.28;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080063
Austin Schuh9644e1c2013-03-12 00:40:36 -070064const double kAngleAdjustZeroingSpeed = -0.2;
Austin Schuhdd3bc412013-03-16 17:02:40 -070065const double kAngleAdjustZeroingOffSpeed = -0.5;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080066
Brian Silverman41c95932013-08-31 11:44:07 -070067const double kPracticeAngleAdjustDeadband = 0.4;
Brian Silverman9c98ff72013-09-11 14:09:56 -070068const double kCompAngleAdjustDeadband = 0.65;
Brian Silverman3cb1d802013-08-30 15:41:49 -070069
brians343bc112013-02-10 01:53:46 +000070const int kCompCameraCenter = -2;
71const int kPracticeCameraCenter = -5;
72
Brian Silverman656789c2013-09-21 23:53:35 -070073const int kCompDrivetrainGearboxPinion = 19;
74const int kPracticeDrivetrainGearboxPinion = 17;
75
brians343bc112013-02-10 01:53:46 +000076struct Values {
Austin Schuhfa033692013-02-24 01:00:55 -080077 // Wrist hall effect positive and negative edges.
James Kuszmaule06e2512013-03-02 15:04:53 -080078 double wrist_hall_effect_start_angle;
79 double wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -080080
81 // Upper and lower extreme limits of travel for the wrist.
James Kuszmaule06e2512013-03-02 15:04:53 -080082 double wrist_upper_limit;
83 double wrist_lower_limit;
84
Austin Schuhfa033692013-02-24 01:00:55 -080085 // Physical limits. These are here for testing.
James Kuszmaule06e2512013-03-02 15:04:53 -080086 double wrist_upper_physical_limit;
87 double wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -080088
89 // Zeroing speed.
James Kuszmaule06e2512013-03-02 15:04:53 -080090 double wrist_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -070091 // Zeroing off speed.
92 double wrist_zeroing_off_speed;
Austin Schuhfa033692013-02-24 01:00:55 -080093
James Kuszmaul4a4622b2013-03-02 16:28:29 -080094 // AngleAdjust hall effect positive and negative edges.
Austin Schuhe20e93c2013-03-09 19:54:16 -080095 const double *angle_adjust_hall_effect_start_angle;
96 const double *angle_adjust_hall_effect_stop_angle;
James Kuszmaul4a4622b2013-03-02 16:28:29 -080097
98 // Upper and lower extreme limits of travel for the angle adjust.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -080099 double angle_adjust_upper_limit;
100 double angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800101 // Physical limits. These are here for testing.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800102 double angle_adjust_upper_physical_limit;
103 double angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800104
105 // Zeroing speed.
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800106 double angle_adjust_zeroing_speed;
Austin Schuhdd3bc412013-03-16 17:02:40 -0700107 // Zeroing off speed.
108 double angle_adjust_zeroing_off_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800109
Brian Silverman3cb1d802013-08-30 15:41:49 -0700110 // Deadband voltage.
111 double angle_adjust_deadband;
112
Brian Silverman656789c2013-09-21 23:53:35 -0700113 int drivetrain_gearbox_pinion;
114
brians343bc112013-02-10 01:53:46 +0000115 // what camera_center returns
116 int camera_center;
brians343bc112013-02-10 01:53:46 +0000117};
Austin Schuhfa033692013-02-24 01:00:55 -0800118
brians343bc112013-02-10 01:53:46 +0000119Values *values = NULL;
120// Attempts to retrieve a new Values instance and stores it in values if
121// necessary.
122// Returns a valid Values instance or NULL.
123const Values *GetValues() {
Austin Schuhfa033692013-02-24 01:00:55 -0800124 // TODO(brians): Make this use the new Once construct.
brians343bc112013-02-10 01:53:46 +0000125 if (values == NULL) {
Brian Silverman8efe23e2013-07-07 23:31:37 -0700126 LOG(INFO, "creating a Constants for team %" PRIu16 "\n",
Austin Schuhfa033692013-02-24 01:00:55 -0800127 ::aos::robot_state->team_id);
128 switch (::aos::robot_state->team_id) {
brians343bc112013-02-10 01:53:46 +0000129 case kCompTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800130 values = new Values{kCompWristHallEffectStartAngle,
131 kCompWristHallEffectStopAngle,
132 kCompWristUpperLimit,
133 kCompWristLowerLimit,
134 kCompWristUpperPhysicalLimit,
135 kCompWristLowerPhysicalLimit,
136 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700137 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800138 kCompAngleAdjustHallEffectStartAngle,
139 kCompAngleAdjustHallEffectStopAngle,
140 kCompAngleAdjustUpperLimit,
141 kCompAngleAdjustLowerLimit,
142 kCompAngleAdjustUpperPhysicalLimit,
143 kCompAngleAdjustLowerPhysicalLimit,
144 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700145 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700146 kCompAngleAdjustDeadband,
Brian Silverman656789c2013-09-21 23:53:35 -0700147 kCompDrivetrainGearboxPinion,
Austin Schuhfa033692013-02-24 01:00:55 -0800148 kCompCameraCenter};
brians343bc112013-02-10 01:53:46 +0000149 break;
150 case kPracticeTeamNumber:
James Kuszmaule06e2512013-03-02 15:04:53 -0800151 values = new Values{kPracticeWristHallEffectStartAngle,
152 kPracticeWristHallEffectStopAngle,
153 kPracticeWristUpperLimit,
154 kPracticeWristLowerLimit,
155 kPracticeWristUpperPhysicalLimit,
156 kPracticeWristLowerPhysicalLimit,
157 kWristZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700158 kWristZeroingOffSpeed,
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800159 kPracticeAngleAdjustHallEffectStartAngle,
160 kPracticeAngleAdjustHallEffectStopAngle,
161 kPracticeAngleAdjustUpperLimit,
162 kPracticeAngleAdjustLowerLimit,
163 kPracticeAngleAdjustUpperPhysicalLimit,
164 kPracticeAngleAdjustLowerPhysicalLimit,
165 kAngleAdjustZeroingSpeed,
Austin Schuhdd3bc412013-03-16 17:02:40 -0700166 kAngleAdjustZeroingOffSpeed,
Brian Silverman3cb1d802013-08-30 15:41:49 -0700167 kPracticeAngleAdjustDeadband,
Brian Silverman656789c2013-09-21 23:53:35 -0700168 kPracticeDrivetrainGearboxPinion,
Austin Schuhfa033692013-02-24 01:00:55 -0800169 kPracticeCameraCenter};
brians343bc112013-02-10 01:53:46 +0000170 break;
171 default:
Brian Silverman8efe23e2013-07-07 23:31:37 -0700172 LOG(ERROR, "unknown team #%" PRIu16 "\n",
brians343bc112013-02-10 01:53:46 +0000173 aos::robot_state->team_id);
174 return NULL;
175 }
176 }
177 return values;
178}
179
180} // namespace
181
James Kuszmaule06e2512013-03-02 15:04:53 -0800182bool wrist_hall_effect_start_angle(double *angle) {
brians343bc112013-02-10 01:53:46 +0000183 const Values *const values = GetValues();
184 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800185 *angle = values->wrist_hall_effect_start_angle;
brians343bc112013-02-10 01:53:46 +0000186 return true;
187}
James Kuszmaule06e2512013-03-02 15:04:53 -0800188bool wrist_hall_effect_stop_angle(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800189 const Values *const values = GetValues();
190 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800191 *angle = values->wrist_hall_effect_stop_angle;
Austin Schuhfa033692013-02-24 01:00:55 -0800192 return true;
193}
James Kuszmaule06e2512013-03-02 15:04:53 -0800194bool wrist_upper_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800195 const Values *const values = GetValues();
196 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800197 *angle = values->wrist_upper_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800198 return true;
199}
200
James Kuszmaule06e2512013-03-02 15:04:53 -0800201bool wrist_lower_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800202 const Values *const values = GetValues();
203 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800204 *angle = values->wrist_lower_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800205 return true;
206}
207
James Kuszmaule06e2512013-03-02 15:04:53 -0800208bool wrist_upper_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800209 const Values *const values = GetValues();
210 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800211 *angle = values->wrist_upper_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800212 return true;
213}
214
James Kuszmaule06e2512013-03-02 15:04:53 -0800215bool wrist_lower_physical_limit(double *angle) {
Austin Schuhfa033692013-02-24 01:00:55 -0800216 const Values *const values = GetValues();
217 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800218 *angle = values->wrist_lower_physical_limit;
Austin Schuhfa033692013-02-24 01:00:55 -0800219 return true;
220}
221
James Kuszmaule06e2512013-03-02 15:04:53 -0800222bool wrist_zeroing_speed(double *speed) {
Austin Schuhfa033692013-02-24 01:00:55 -0800223 const Values *const values = GetValues();
224 if (values == NULL) return false;
James Kuszmaule06e2512013-03-02 15:04:53 -0800225 *speed = values->wrist_zeroing_speed;
Austin Schuhfa033692013-02-24 01:00:55 -0800226 return true;
227}
228
Austin Schuhdd3bc412013-03-16 17:02:40 -0700229bool wrist_zeroing_off_speed(double *speed) {
230 const Values *const values = GetValues();
231 if (values == NULL) return false;
232 *speed = values->wrist_zeroing_off_speed;
233 return true;
234}
235
Austin Schuhe20e93c2013-03-09 19:54:16 -0800236bool angle_adjust_hall_effect_start_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800237 const Values *const values = GetValues();
238 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800239 angle[0] = values->angle_adjust_hall_effect_start_angle[0];
240 angle[1] = values->angle_adjust_hall_effect_start_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800241 return true;
242}
Austin Schuhe20e93c2013-03-09 19:54:16 -0800243bool angle_adjust_hall_effect_stop_angle(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800244 const Values *const values = GetValues();
245 if (values == NULL) return false;
Austin Schuhe20e93c2013-03-09 19:54:16 -0800246 angle[0] = values->angle_adjust_hall_effect_stop_angle[0];
247 angle[1] = values->angle_adjust_hall_effect_stop_angle[1];
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800248 return true;
249}
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800250bool angle_adjust_upper_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800251 const Values *const values = GetValues();
252 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800253 *angle = values->angle_adjust_upper_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800254 return true;
255}
256
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800257bool angle_adjust_lower_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800258 const Values *const values = GetValues();
259 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800260 *angle = values->angle_adjust_lower_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800261 return true;
262}
263
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800264bool angle_adjust_upper_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800265 const Values *const values = GetValues();
266 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800267 *angle = values->angle_adjust_upper_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800268 return true;
269}
270
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800271bool angle_adjust_lower_physical_limit(double *angle) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800272 const Values *const values = GetValues();
273 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800274 *angle = values->angle_adjust_lower_physical_limit;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800275 return true;
276}
277
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800278bool angle_adjust_zeroing_speed(double *speed) {
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800279 const Values *const values = GetValues();
280 if (values == NULL) return false;
James Kuszmaul16bcb5f2013-03-03 14:50:07 -0800281 *speed = values->angle_adjust_zeroing_speed;
James Kuszmaul4a4622b2013-03-02 16:28:29 -0800282 return true;
283}
284
Austin Schuhdd3bc412013-03-16 17:02:40 -0700285bool angle_adjust_zeroing_off_speed(double *speed) {
286 const Values *const values = GetValues();
287 if (values == NULL) return false;
288 *speed = values->angle_adjust_zeroing_off_speed;
289 return true;
290}
291
Brian Silverman3cb1d802013-08-30 15:41:49 -0700292bool angle_adjust_deadband(double *voltage) {
293 const Values *const values = GetValues();
294 if (values == NULL) return false;
295 *voltage = values->angle_adjust_deadband;
296 return true;
297}
298
Brian Silverman656789c2013-09-21 23:53:35 -0700299bool drivetrain_gearbox_pinion(int *pinion) {
300 const Values *const values = GetValues();
301 if (values == NULL) return false;
302 *pinion = values->drivetrain_gearbox_pinion;
303 return true;
304}
305
brians343bc112013-02-10 01:53:46 +0000306bool camera_center(int *center) {
307 const Values *const values = GetValues();
308 if (values == NULL) return false;
309 *center = values->camera_center;
310 return true;
311}
brians343bc112013-02-10 01:53:46 +0000312
313} // namespace constants
314} // namespace frc971