blob: c6cc0232638244e288fcdec8b49e39a820c96474 [file] [log] [blame]
Tyler Chatow37ecdcd2019-01-26 20:18:42 -08001#include "y2019/constants.h"
2
3#include <inttypes.h>
4
5#include <map>
6
7#if __has_feature(address_sanitizer)
8#include "sanitizer/lsan_interface.h"
9#endif
10
11#include "aos/logging/logging.h"
12#include "aos/mutex/mutex.h"
13#include "aos/network/team_number.h"
14#include "aos/once.h"
Theo Bafrali00e42272019-02-12 01:07:46 -080015#include "y2019/control_loops/superstructure/elevator/integral_elevator_plant.h"
16#include "y2019/control_loops/superstructure/intake/integral_intake_plant.h"
17#include "y2019/control_loops/superstructure/stilts/integral_stilts_plant.h"
18#include "y2019/control_loops/superstructure/wrist/integral_wrist_plant.h"
James Kuszmaule2c71ea2019-03-04 08:14:21 -080019#include "y2019/vision/constants.h"
Tyler Chatow37ecdcd2019-01-26 20:18:42 -080020
21namespace y2019 {
22namespace constants {
23
Theo Bafrali00e42272019-02-12 01:07:46 -080024using ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator;
25
Tyler Chatow37ecdcd2019-01-26 20:18:42 -080026const int Values::kZeroingSampleSize;
James Kuszmaul09f564a2019-02-18 17:37:09 -080027constexpr size_t Values::kNumCameras;
Tyler Chatow37ecdcd2019-01-26 20:18:42 -080028
29namespace {
30
31const uint16_t kCompTeamNumber = 971;
32const uint16_t kPracticeTeamNumber = 9971;
Alex Perry5fb5ff22019-02-09 21:53:17 -080033const uint16_t kCodingRobotTeamNumber = 7971;
Tyler Chatow37ecdcd2019-01-26 20:18:42 -080034
James Kuszmaul22c5ab32019-02-09 14:45:58 -080035constexpr double FeetToMeters(double ft) {
36 return 0.3048 * ft;
37}
38constexpr double InchToMeters(double in) {
39 return 0.0254 * in;
40}
41constexpr double DegToRad(double deg) {
42 return deg * M_PI / 180.0;
43}
44
James Kuszmaule2c71ea2019-03-04 08:14:21 -080045// Populates camera Pose information from the calibrated vision constants.
46void FillCameraPoses(
47 uint32_t teensy_processor_id,
48 ::std::array<Values::CameraCalibration, Values::kNumCameras> *cameras) {
49 ::std::array<int, 5> camera_ids =
50 vision::CameraSerialNumbers(teensy_processor_id);
51 for (size_t ii = 0; ii < camera_ids.size(); ++ii) {
52 const vision::CameraCalibration *calibration =
53 vision::GetCamera(camera_ids[ii]);
54 if (calibration != nullptr) {
55 vision::CameraGeometry geometry = calibration->geometry;
56 *cameras->at(ii).pose.mutable_pos() << geometry.location[0],
57 geometry.location[1], geometry.location[2];
58 cameras->at(ii).pose.set_theta(geometry.heading);
59 }
60 }
61}
62
Tyler Chatow37ecdcd2019-01-26 20:18:42 -080063const Values *DoGetValuesForTeam(uint16_t team) {
64 Values *const r = new Values();
Alex Perry5fb5ff22019-02-09 21:53:17 -080065 Values::PotAndAbsConstants *const elevator = &r->elevator;
Theo Bafrali00e42272019-02-12 01:07:46 -080066 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
67 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator>
68 *const elevator_params = &(elevator->subsystem_params);
Alex Perry5fb5ff22019-02-09 21:53:17 -080069 Values::PotAndAbsConstants *const stilts = &r->stilts;
Theo Bafrali00e42272019-02-12 01:07:46 -080070 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
71 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator>
72 *const stilts_params = &(stilts->subsystem_params);
Alex Perry5fb5ff22019-02-09 21:53:17 -080073 Values::PotAndAbsConstants *const wrist = &r->wrist;
Theo Bafrali00e42272019-02-12 01:07:46 -080074 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
75 ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator>
76 *const wrist_params = &(wrist->subsystem_params);
77 ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams<
78 ::frc971::zeroing::AbsoluteEncoderZeroingEstimator> *const intake =
79 &r->intake;
Alex Perry5fb5ff22019-02-09 21:53:17 -080080
Theo Bafrali00e42272019-02-12 01:07:46 -080081 // Elevator constants.
Austin Schuh7f87b472019-02-15 23:20:57 -080082 elevator_params->zeroing_voltage = 3.0;
Theo Bafrali00e42272019-02-12 01:07:46 -080083 elevator_params->operating_voltage = 12.0;
84 elevator_params->zeroing_profile_params = {0.1, 1.0};
Sabina Davis810ed4c2019-03-08 21:13:20 -080085 elevator_params->default_profile_params = {4.0, 13.0};
Theo Bafrali00e42272019-02-12 01:07:46 -080086 elevator_params->range = Values::kElevatorRange();
87 elevator_params->make_integral_loop =
88 &control_loops::superstructure::elevator::MakeIntegralElevatorLoop;
89 elevator_params->zeroing_constants.average_filter_size =
90 Values::kZeroingSampleSize;
91 elevator_params->zeroing_constants.one_revolution_distance =
Alex Perry5fb5ff22019-02-09 21:53:17 -080092 M_PI * 2.0 * constants::Values::kElevatorEncoderRatio();
Theo Bafrali00e42272019-02-12 01:07:46 -080093 elevator_params->zeroing_constants.zeroing_threshold = 0.005;
94 elevator_params->zeroing_constants.moving_buffer_size = 20;
95 elevator_params->zeroing_constants.allowable_encoder_error = 0.9;
Alex Perry5fb5ff22019-02-09 21:53:17 -080096
Theo Bafrali00e42272019-02-12 01:07:46 -080097 // Wrist constants.
98 wrist_params->zeroing_voltage = 4.0;
99 wrist_params->operating_voltage = 12.0;
100 wrist_params->zeroing_profile_params = {0.5, 2.0};
Austin Schuh7f87b472019-02-15 23:20:57 -0800101 wrist_params->default_profile_params = {10.0, 40.0};
Theo Bafrali00e42272019-02-12 01:07:46 -0800102 wrist_params->range = Values::kWristRange();
103 wrist_params->make_integral_loop =
104 &control_loops::superstructure::wrist::MakeIntegralWristLoop;
105 wrist_params->zeroing_constants.average_filter_size =
106 Values::kZeroingSampleSize;
107 wrist_params->zeroing_constants.one_revolution_distance =
Alex Perry5fb5ff22019-02-09 21:53:17 -0800108 M_PI * 2.0 * constants::Values::kWristEncoderRatio();
Theo Bafrali00e42272019-02-12 01:07:46 -0800109 wrist_params->zeroing_constants.zeroing_threshold = 0.0005;
110 wrist_params->zeroing_constants.moving_buffer_size = 20;
111 wrist_params->zeroing_constants.allowable_encoder_error = 0.9;
112
113 // Intake constants.
Austin Schuh7f87b472019-02-15 23:20:57 -0800114 intake->zeroing_voltage = 3.0;
Theo Bafrali00e42272019-02-12 01:07:46 -0800115 intake->operating_voltage = 12.0;
116 intake->zeroing_profile_params = {0.5, 3.0};
Austin Schuh7f87b472019-02-15 23:20:57 -0800117 intake->default_profile_params = {6.0, 30.0};
Theo Bafrali00e42272019-02-12 01:07:46 -0800118 intake->range = Values::kIntakeRange();
119 intake->make_integral_loop =
120 control_loops::superstructure::intake::MakeIntegralIntakeLoop;
121 intake->zeroing_constants.average_filter_size = Values::kZeroingSampleSize;
122 intake->zeroing_constants.one_revolution_distance =
123 M_PI * 2.0 * constants::Values::kIntakeEncoderRatio();
124 intake->zeroing_constants.zeroing_threshold = 0.0005;
125 intake->zeroing_constants.moving_buffer_size = 20;
126 intake->zeroing_constants.allowable_encoder_error = 0.9;
Austin Schuhc9c157a2019-02-19 13:36:22 -0800127 intake->zeroing_constants.middle_position = Values::kIntakeRange().middle();
Theo Bafrali00e42272019-02-12 01:07:46 -0800128
129 // Stilts constants.
Austin Schuh7f87b472019-02-15 23:20:57 -0800130 stilts_params->zeroing_voltage = 3.0;
Theo Bafrali00e42272019-02-12 01:07:46 -0800131 stilts_params->operating_voltage = 12.0;
Austin Schuh7f87b472019-02-15 23:20:57 -0800132 stilts_params->zeroing_profile_params = {0.1, 0.5};
Austin Schuh08bd22d2019-02-22 20:48:20 -0800133 stilts_params->default_profile_params = {0.15, 0.5};
Theo Bafrali00e42272019-02-12 01:07:46 -0800134 stilts_params->range = Values::kStiltsRange();
135 stilts_params->make_integral_loop =
136 &control_loops::superstructure::stilts::MakeIntegralStiltsLoop;
137 stilts_params->zeroing_constants.average_filter_size =
138 Values::kZeroingSampleSize;
139 stilts_params->zeroing_constants.one_revolution_distance =
140 M_PI * 2.0 * constants::Values::kStiltsEncoderRatio();
141 stilts_params->zeroing_constants.zeroing_threshold = 0.0005;
142 stilts_params->zeroing_constants.moving_buffer_size = 20;
143 stilts_params->zeroing_constants.allowable_encoder_error = 0.9;
Tyler Chatow37ecdcd2019-01-26 20:18:42 -0800144
James Kuszmaul09f564a2019-02-18 17:37:09 -0800145 r->camera_noise_parameters = {.max_viewable_distance = 10.0,
146 .heading_noise = 0.02,
147 .nominal_distance_noise = 0.06,
148 .nominal_skew_noise = 0.1,
149 .nominal_height_noise = 0.01};
150
James Kuszmaule2c71ea2019-03-04 08:14:21 -0800151 // Deliberately make FOV a bit large so that we are overly conservative in
152 // our EKF.
153 for (auto &camera : r->cameras) {
154 camera.fov = M_PI_2 * 1.1;
155 }
156
Tyler Chatow37ecdcd2019-01-26 20:18:42 -0800157 switch (team) {
158 // A set of constants for tests.
159 case 1:
Theo Bafrali00e42272019-02-12 01:07:46 -0800160 elevator_params->zeroing_constants.measured_absolute_position = 0.0;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800161 elevator->potentiometer_offset = 0.0;
162
Theo Bafrali00e42272019-02-12 01:07:46 -0800163 intake->zeroing_constants.measured_absolute_position = 0.0;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800164
Theo Bafrali00e42272019-02-12 01:07:46 -0800165 wrist_params->zeroing_constants.measured_absolute_position = 0.0;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800166 wrist->potentiometer_offset = 0.0;
Theo Bafrali00e42272019-02-12 01:07:46 -0800167
168 stilts_params->zeroing_constants.measured_absolute_position = 0.0;
169 stilts->potentiometer_offset = 0.0;
James Kuszmaul09f564a2019-02-18 17:37:09 -0800170
James Kuszmaule2c71ea2019-03-04 08:14:21 -0800171 // For the simulation, just place cameras at the center of the robot with
172 // nominal angles (back/sides + 15 degree offset front cameras).
James Kuszmaul09f564a2019-02-18 17:37:09 -0800173 r->cameras[0].pose.set_theta(M_PI);
174 r->cameras[1].pose.set_theta(0.26);
175 r->cameras[2].pose.set_theta(-0.26);
176 r->cameras[3].pose.set_theta(M_PI_2);
177 r->cameras[4].pose.set_theta(-M_PI_2);
Tyler Chatow37ecdcd2019-01-26 20:18:42 -0800178 break;
179
180 case kCompTeamNumber:
Austin Schuh4b5e3222019-02-19 16:48:50 -0800181 elevator_params->zeroing_constants.measured_absolute_position = 0.024407;
182 elevator->potentiometer_offset = -0.075017 + 0.015837 + 0.009793 - 0.012017;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800183
Austin Schuhc9c157a2019-02-19 13:36:22 -0800184 intake->zeroing_constants.measured_absolute_position = 1.860016;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800185
Austin Schuhc9c157a2019-02-19 13:36:22 -0800186 wrist_params->zeroing_constants.measured_absolute_position = 0.163840;
187 wrist->potentiometer_offset = -4.257454;
Theo Bafrali00e42272019-02-12 01:07:46 -0800188
Austin Schuhc9c157a2019-02-19 13:36:22 -0800189 stilts_params->zeroing_constants.measured_absolute_position = 0.030049;
190 stilts->potentiometer_offset = -0.015760 + 0.011604;
Tyler Chatow37ecdcd2019-01-26 20:18:42 -0800191 break;
192
193 case kPracticeTeamNumber:
Sabina Davise6fe6c52019-03-03 15:48:51 -0800194 elevator_params->zeroing_constants.measured_absolute_position = 0.147809;
195 elevator->potentiometer_offset = -0.022320 + 0.020567 - 0.022355 - 0.006497 + 0.019690;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800196
Austin Schuh862d4de2019-02-17 14:15:18 -0800197 intake->zeroing_constants.measured_absolute_position = 1.756847;
Austin Schuhed7f8632019-02-15 23:12:20 -0800198
Sabina Davisfe2e7122019-03-08 20:45:54 -0800199 wrist_params->zeroing_constants.measured_absolute_position = 0.192576;
200 wrist->potentiometer_offset = -4.200894 - 0.187134;
Austin Schuhed7f8632019-02-15 23:12:20 -0800201
Sabina Davise6fe6c52019-03-03 15:48:51 -0800202 stilts_params->zeroing_constants.measured_absolute_position = 0.043580;
203 stilts->potentiometer_offset = -0.093820 + 0.0124 - 0.008334 + 0.004507;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800204 break;
205
206 case kCodingRobotTeamNumber:
Theo Bafrali00e42272019-02-12 01:07:46 -0800207 elevator_params->zeroing_constants.measured_absolute_position = 0.0;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800208 elevator->potentiometer_offset = 0.0;
209
Theo Bafrali00e42272019-02-12 01:07:46 -0800210 intake->zeroing_constants.measured_absolute_position = 0.0;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800211
Theo Bafrali00e42272019-02-12 01:07:46 -0800212 wrist_params->zeroing_constants.measured_absolute_position = 0.0;
Alex Perry5fb5ff22019-02-09 21:53:17 -0800213 wrist->potentiometer_offset = 0.0;
Theo Bafrali00e42272019-02-12 01:07:46 -0800214
215 stilts_params->zeroing_constants.measured_absolute_position = 0.0;
216 stilts->potentiometer_offset = 0.0;
James Kuszmaul81df16a2019-03-03 17:17:34 -0800217
James Kuszmaule2c71ea2019-03-04 08:14:21 -0800218 FillCameraPoses(vision::CodeBotTeensyId(), &r->cameras);
219
Tyler Chatow37ecdcd2019-01-26 20:18:42 -0800220 break;
221
222 default:
223 LOG(FATAL, "unknown team #%" PRIu16 "\n", team);
224 }
225
226 return r;
227}
228
229const Values *DoGetValues() {
230 uint16_t team = ::aos::network::GetTeamNumber();
231 LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
232 return DoGetValuesForTeam(team);
233}
234
235} // namespace
236
237const Values &GetValues() {
238 static ::aos::Once<const Values> once(DoGetValues);
239 return *once.Get();
240}
241
242const Values &GetValuesForTeam(uint16_t team_number) {
243 static ::aos::Mutex mutex;
244 ::aos::MutexLocker locker(&mutex);
245
246 // IMPORTANT: This declaration has to stay after the mutex is locked to avoid
247 // race conditions.
248 static ::std::map<uint16_t, const Values *> values;
249
250 if (values.count(team_number) == 0) {
251 values[team_number] = DoGetValuesForTeam(team_number);
252#if __has_feature(address_sanitizer)
253 __lsan_ignore_object(values[team_number]);
254#endif
255 }
256 return *values[team_number];
257}
258
James Kuszmaul22c5ab32019-02-09 14:45:58 -0800259constexpr size_t Field::kNumTargets;
260constexpr size_t Field::kNumObstacles;
261
262Field::Field() {
263 // TODO(james): These values need to re-verified. I got them by skimming the
264 // manual and they all seem to be pretty much correct.
265 //
266 // Note: Per //frc971/control_loops/pose.h, coordinate system is:
267 // -In meters
268 // -Origin at center of our driver's station wall
269 // -Positive X-axis pointing straight out from driver's station
270 // -Positive Y-axis pointing straight left from the driver's perspective
271 // -Positive Z-axis is straight up.
272 // -The angle of the target is such that the angle is the angle you would
273 // need to be facing to see it straight-on. I.e., if the target angle is
274 // pi / 2.0, then you would be able to see it face on by facing straight
275 // left from the driver's point of view (if you were standing in the right
276 // spot).
277 constexpr double kCenterFieldX = FeetToMeters(27.0) + InchToMeters(1.125);
278
279 constexpr double kFarSideCargoBayX =
280 kCenterFieldX - InchToMeters(20.875);
281 constexpr double kMidSideCargoBayX = kFarSideCargoBayX - InchToMeters(21.75);
282 constexpr double kNearSideCargoBayX = kMidSideCargoBayX - InchToMeters(21.75);
283 constexpr double kSideCargoBayY = InchToMeters(24 + 3 + 0.875);
284 constexpr double kSideCargoBayTheta = -M_PI_2;
285
286 constexpr double kFaceCargoBayX =
287 kCenterFieldX - InchToMeters(7 * 12 + 11.75 + 9);
288 constexpr double kFaceCargoBayY = InchToMeters(10.875);
289 constexpr double kFaceCargoBayTheta = 0.0;
290
291 constexpr double kRocketX = kCenterFieldX - FeetToMeters(8);
292 constexpr double kRocketY = InchToMeters((26 * 12 + 10.5) / 2.0);
293
294 constexpr double kRocketPortX = kRocketX;
295 constexpr double kRocketPortY = kRocketY - 0.70;
296 constexpr double kRocketPortTheta = M_PI_2;
297
298 // Half of portal + guess at width * cos(61.5 deg)
299 const double kRocketHatchXOffset = InchToMeters(14.634);
300 const double kRocketHatchY = kRocketPortY + InchToMeters(9.326);
301 const double kRocketNearX = kRocketX - kRocketHatchXOffset;
302 const double kRocketFarX = kRocketX + kRocketHatchXOffset;
303 constexpr double kRocketNearTheta = DegToRad(28.5);
304 constexpr double kRocketFarTheta = M_PI - kRocketNearTheta;
305
306 constexpr double kHpSlotY = InchToMeters((26 * 12 + 10.5) / 2.0 - 25.9);
307 constexpr double kHpSlotTheta = M_PI;
308
309 constexpr double kNormalZ = 0.80;
310 constexpr double kPortZ = 0.99;
311
312 const Pose far_side_cargo_bay({kFarSideCargoBayX, kSideCargoBayY, kNormalZ},
313 kSideCargoBayTheta);
314 const Pose mid_side_cargo_bay({kMidSideCargoBayX, kSideCargoBayY, kNormalZ},
315 kSideCargoBayTheta);
316 const Pose near_side_cargo_bay({kNearSideCargoBayX, kSideCargoBayY, kNormalZ},
317 kSideCargoBayTheta);
318
319 const Pose face_cargo_bay({kFaceCargoBayX, kFaceCargoBayY, kNormalZ},
320 kFaceCargoBayTheta);
321
322 const Pose rocket_port({kRocketPortX, kRocketPortY, kPortZ},
323 kRocketPortTheta);
324
325 const Pose rocket_near({kRocketNearX, kRocketHatchY, kNormalZ},
326 kRocketNearTheta);
327 const Pose rocket_far({kRocketFarX, kRocketHatchY, kNormalZ},
328 kRocketFarTheta);
329
330 const Pose hp_slot({0.0, kHpSlotY, kNormalZ}, kHpSlotTheta);
331
332 const ::std::array<Pose, 8> quarter_field_targets{
333 {far_side_cargo_bay, mid_side_cargo_bay, near_side_cargo_bay,
334 face_cargo_bay, rocket_port, rocket_near, rocket_far, hp_slot}};
335
336 // Mirror across center field mid-line (short field axis):
337 ::std::array<Pose, 16> half_field_targets;
338 ::std::copy(quarter_field_targets.begin(), quarter_field_targets.end(),
339 half_field_targets.begin());
340 for (int ii = 0; ii < 8; ++ii) {
341 const int jj = ii + 8;
342 half_field_targets[jj] = quarter_field_targets[ii];
343 half_field_targets[jj].mutable_pos()->x() =
344 2.0 * kCenterFieldX - half_field_targets[jj].rel_pos().x();
345 half_field_targets[jj].set_theta(
346 aos::math::NormalizeAngle(M_PI - half_field_targets[jj].rel_theta()));
347 }
348
349 ::std::array<Pose, 32> target_poses_;
350
351 // Mirror across x-axis (long field axis):
352 ::std::copy(half_field_targets.begin(), half_field_targets.end(),
353 target_poses_.begin());
354 for (int ii = 0; ii < 16; ++ii) {
355 const int jj = ii + 16;
356 target_poses_[jj] = half_field_targets[ii];
357 target_poses_[jj].mutable_pos()->y() *= -1;
358 target_poses_[jj].set_theta(-target_poses_[jj].rel_theta());
359 }
360 for (int ii = 0; ii < 32; ++ii) {
361 targets_[ii] = {target_poses_[ii]};
362 }
363
364 // Define rocket obstacles as just being a single line that should block any
365 // cameras trying to see through the rocket up and down the field.
366 // This line is parallel to the driver's station wall and extends behind
367 // the portal.
368 Obstacle rocket_obstacle({{kRocketPortX, kRocketY, 0.0}, 0.0},
369 {{kRocketPortX, kRocketPortY + 0.01, 0.0}, 0.0});
370 // First, we mirror rocket obstacles across x-axis:
371 Obstacle rocket_obstacle2({{kRocketPortX, -kRocketY, 0.0}, 0.0},
372 {{kRocketPortX, -kRocketPortY - 0.01, 0.0}, 0.0});
373
374 // Define an obstacle for the Hab that extends striaght out a few feet from
375 // the driver's station wall.
376 // TODO(james): Does this actually block our view?
377 const double kHabL3X = FeetToMeters(4.0);
378 Obstacle hab_obstacle({}, {{kHabL3X, 0.0, 0.0}, 0.0});
379 ::std::array<Obstacle, 3> half_obstacles{
380 {rocket_obstacle, rocket_obstacle2, hab_obstacle}};
381 ::std::copy(half_obstacles.begin(), half_obstacles.end(), obstacles_.begin());
382
383 // Next, we mirror across the mid-line (short axis) to duplicate the
384 // rockets and hab to opposite side of the field.
385 for (int ii = 0; ii < 3; ++ii) {
386 const int jj = ii + 3;
387 obstacles_[jj] = half_obstacles[ii];
388 obstacles_[jj].mutable_pose1()->mutable_pos()->x() =
389 2.0 * kCenterFieldX - obstacles_[jj].mutable_pose1()->rel_pos().x();
390 obstacles_[jj].mutable_pose2()->mutable_pos()->x() =
391 2.0 * kCenterFieldX - obstacles_[jj].mutable_pose2()->rel_pos().x();
392 }
393
394 // Finally, define a rectangular cargo ship.
395 const double kCargoCornerX = kFaceCargoBayX + 0.1;
396 const double kCargoCornerY = kSideCargoBayY - 0.1;
397 ::std::array<Pose, 4> cargo_corners{
398 {{{kCargoCornerX, kCargoCornerY, 0.0}, 0.0},
399 {{kCargoCornerX, -kCargoCornerY, 0.0}, 0.0},
400 {{2.0 * kCenterFieldX - kCargoCornerX, -kCargoCornerY, 0.0}, 0.0},
401 {{2.0 * kCenterFieldX - kCargoCornerX, kCargoCornerY, 0.0}, 0.0}}};
402 for (int ii = 6; ii < 10; ++ii) {
403 obstacles_[ii] = Obstacle(cargo_corners[ii % cargo_corners.size()],
404 cargo_corners[(ii + 1) % cargo_corners.size()]);
405 }
406}
407
Tyler Chatow37ecdcd2019-01-26 20:18:42 -0800408} // namespace constants
409} // namespace y2019