Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 1 | #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 Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 15 | #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" |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 19 | |
| 20 | namespace y2019 { |
| 21 | namespace constants { |
| 22 | |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 23 | using ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator; |
| 24 | |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 25 | const int Values::kZeroingSampleSize; |
| 26 | |
| 27 | namespace { |
| 28 | |
| 29 | const uint16_t kCompTeamNumber = 971; |
| 30 | const uint16_t kPracticeTeamNumber = 9971; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 31 | const uint16_t kCodingRobotTeamNumber = 7971; |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 32 | |
James Kuszmaul | 22c5ab3 | 2019-02-09 14:45:58 -0800 | [diff] [blame] | 33 | constexpr double FeetToMeters(double ft) { |
| 34 | return 0.3048 * ft; |
| 35 | } |
| 36 | constexpr double InchToMeters(double in) { |
| 37 | return 0.0254 * in; |
| 38 | } |
| 39 | constexpr double DegToRad(double deg) { |
| 40 | return deg * M_PI / 180.0; |
| 41 | } |
| 42 | |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 43 | const Values *DoGetValuesForTeam(uint16_t team) { |
| 44 | Values *const r = new Values(); |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 45 | Values::PotAndAbsConstants *const elevator = &r->elevator; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 46 | ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams< |
| 47 | ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator> |
| 48 | *const elevator_params = &(elevator->subsystem_params); |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 49 | Values::PotAndAbsConstants *const stilts = &r->stilts; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 50 | ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams< |
| 51 | ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator> |
| 52 | *const stilts_params = &(stilts->subsystem_params); |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 53 | Values::PotAndAbsConstants *const wrist = &r->wrist; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 54 | ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams< |
| 55 | ::frc971::zeroing::PotAndAbsoluteEncoderZeroingEstimator> |
| 56 | *const wrist_params = &(wrist->subsystem_params); |
| 57 | ::frc971::control_loops::StaticZeroingSingleDOFProfiledSubsystemParams< |
| 58 | ::frc971::zeroing::AbsoluteEncoderZeroingEstimator> *const intake = |
| 59 | &r->intake; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 60 | |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 61 | // Elevator constants. |
Austin Schuh | 7f87b47 | 2019-02-15 23:20:57 -0800 | [diff] [blame] | 62 | elevator_params->zeroing_voltage = 3.0; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 63 | elevator_params->operating_voltage = 12.0; |
| 64 | elevator_params->zeroing_profile_params = {0.1, 1.0}; |
Austin Schuh | 7f87b47 | 2019-02-15 23:20:57 -0800 | [diff] [blame] | 65 | elevator_params->default_profile_params = {4.0, 16.0}; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 66 | elevator_params->range = Values::kElevatorRange(); |
| 67 | elevator_params->make_integral_loop = |
| 68 | &control_loops::superstructure::elevator::MakeIntegralElevatorLoop; |
| 69 | elevator_params->zeroing_constants.average_filter_size = |
| 70 | Values::kZeroingSampleSize; |
| 71 | elevator_params->zeroing_constants.one_revolution_distance = |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 72 | M_PI * 2.0 * constants::Values::kElevatorEncoderRatio(); |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 73 | elevator_params->zeroing_constants.zeroing_threshold = 0.005; |
| 74 | elevator_params->zeroing_constants.moving_buffer_size = 20; |
| 75 | elevator_params->zeroing_constants.allowable_encoder_error = 0.9; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 76 | |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 77 | // Wrist constants. |
| 78 | wrist_params->zeroing_voltage = 4.0; |
| 79 | wrist_params->operating_voltage = 12.0; |
| 80 | wrist_params->zeroing_profile_params = {0.5, 2.0}; |
Austin Schuh | 7f87b47 | 2019-02-15 23:20:57 -0800 | [diff] [blame] | 81 | wrist_params->default_profile_params = {10.0, 40.0}; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 82 | wrist_params->range = Values::kWristRange(); |
| 83 | wrist_params->make_integral_loop = |
| 84 | &control_loops::superstructure::wrist::MakeIntegralWristLoop; |
| 85 | wrist_params->zeroing_constants.average_filter_size = |
| 86 | Values::kZeroingSampleSize; |
| 87 | wrist_params->zeroing_constants.one_revolution_distance = |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 88 | M_PI * 2.0 * constants::Values::kWristEncoderRatio(); |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 89 | wrist_params->zeroing_constants.zeroing_threshold = 0.0005; |
| 90 | wrist_params->zeroing_constants.moving_buffer_size = 20; |
| 91 | wrist_params->zeroing_constants.allowable_encoder_error = 0.9; |
| 92 | |
| 93 | // Intake constants. |
Austin Schuh | 7f87b47 | 2019-02-15 23:20:57 -0800 | [diff] [blame] | 94 | intake->zeroing_voltage = 3.0; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 95 | intake->operating_voltage = 12.0; |
| 96 | intake->zeroing_profile_params = {0.5, 3.0}; |
Austin Schuh | 7f87b47 | 2019-02-15 23:20:57 -0800 | [diff] [blame] | 97 | intake->default_profile_params = {6.0, 30.0}; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 98 | intake->range = Values::kIntakeRange(); |
| 99 | intake->make_integral_loop = |
| 100 | control_loops::superstructure::intake::MakeIntegralIntakeLoop; |
| 101 | intake->zeroing_constants.average_filter_size = Values::kZeroingSampleSize; |
| 102 | intake->zeroing_constants.one_revolution_distance = |
| 103 | M_PI * 2.0 * constants::Values::kIntakeEncoderRatio(); |
| 104 | intake->zeroing_constants.zeroing_threshold = 0.0005; |
| 105 | intake->zeroing_constants.moving_buffer_size = 20; |
| 106 | intake->zeroing_constants.allowable_encoder_error = 0.9; |
Austin Schuh | c9c157a | 2019-02-19 13:36:22 -0800 | [diff] [blame] | 107 | intake->zeroing_constants.middle_position = Values::kIntakeRange().middle(); |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 108 | |
| 109 | // Stilts constants. |
Austin Schuh | 7f87b47 | 2019-02-15 23:20:57 -0800 | [diff] [blame] | 110 | stilts_params->zeroing_voltage = 3.0; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 111 | stilts_params->operating_voltage = 12.0; |
Austin Schuh | 7f87b47 | 2019-02-15 23:20:57 -0800 | [diff] [blame] | 112 | stilts_params->zeroing_profile_params = {0.1, 0.5}; |
Austin Schuh | 08bd22d | 2019-02-22 20:48:20 -0800 | [diff] [blame] | 113 | stilts_params->default_profile_params = {0.15, 0.5}; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 114 | stilts_params->range = Values::kStiltsRange(); |
| 115 | stilts_params->make_integral_loop = |
| 116 | &control_loops::superstructure::stilts::MakeIntegralStiltsLoop; |
| 117 | stilts_params->zeroing_constants.average_filter_size = |
| 118 | Values::kZeroingSampleSize; |
| 119 | stilts_params->zeroing_constants.one_revolution_distance = |
| 120 | M_PI * 2.0 * constants::Values::kStiltsEncoderRatio(); |
| 121 | stilts_params->zeroing_constants.zeroing_threshold = 0.0005; |
| 122 | stilts_params->zeroing_constants.moving_buffer_size = 20; |
| 123 | stilts_params->zeroing_constants.allowable_encoder_error = 0.9; |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 124 | |
| 125 | switch (team) { |
| 126 | // A set of constants for tests. |
| 127 | case 1: |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 128 | elevator_params->zeroing_constants.measured_absolute_position = 0.0; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 129 | elevator->potentiometer_offset = 0.0; |
| 130 | |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 131 | intake->zeroing_constants.measured_absolute_position = 0.0; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 132 | |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 133 | wrist_params->zeroing_constants.measured_absolute_position = 0.0; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 134 | wrist->potentiometer_offset = 0.0; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 135 | |
| 136 | stilts_params->zeroing_constants.measured_absolute_position = 0.0; |
| 137 | stilts->potentiometer_offset = 0.0; |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 138 | break; |
| 139 | |
| 140 | case kCompTeamNumber: |
Austin Schuh | 4b5e322 | 2019-02-19 16:48:50 -0800 | [diff] [blame] | 141 | elevator_params->zeroing_constants.measured_absolute_position = 0.024407; |
| 142 | elevator->potentiometer_offset = -0.075017 + 0.015837 + 0.009793 - 0.012017; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 143 | |
Austin Schuh | c9c157a | 2019-02-19 13:36:22 -0800 | [diff] [blame] | 144 | intake->zeroing_constants.measured_absolute_position = 1.860016; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 145 | |
Austin Schuh | c9c157a | 2019-02-19 13:36:22 -0800 | [diff] [blame] | 146 | wrist_params->zeroing_constants.measured_absolute_position = 0.163840; |
| 147 | wrist->potentiometer_offset = -4.257454; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 148 | |
Austin Schuh | c9c157a | 2019-02-19 13:36:22 -0800 | [diff] [blame] | 149 | stilts_params->zeroing_constants.measured_absolute_position = 0.030049; |
| 150 | stilts->potentiometer_offset = -0.015760 + 0.011604; |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 151 | break; |
| 152 | |
| 153 | case kPracticeTeamNumber: |
Austin Schuh | 4b5e322 | 2019-02-19 16:48:50 -0800 | [diff] [blame] | 154 | elevator_params->zeroing_constants.measured_absolute_position = 0.167722; |
| 155 | elevator->potentiometer_offset = -0.022320 + 0.020567 - 0.022355 - 0.006497; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 156 | |
Austin Schuh | 862d4de | 2019-02-17 14:15:18 -0800 | [diff] [blame] | 157 | intake->zeroing_constants.measured_absolute_position = 1.756847; |
Austin Schuh | ed7f863 | 2019-02-15 23:12:20 -0800 | [diff] [blame] | 158 | |
| 159 | wrist_params->zeroing_constants.measured_absolute_position = 0.357394; |
| 160 | wrist->potentiometer_offset = -1.479097 - 2.740303; |
| 161 | |
Sabina Davis | 2184a28 | 2019-03-02 11:59:03 -0800 | [diff] [blame^] | 162 | stilts_params->zeroing_constants.measured_absolute_position = 0.048258; |
| 163 | stilts->potentiometer_offset = -0.093820 + 0.0124 - 0.008334; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 164 | break; |
| 165 | |
| 166 | case kCodingRobotTeamNumber: |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 167 | elevator_params->zeroing_constants.measured_absolute_position = 0.0; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 168 | elevator->potentiometer_offset = 0.0; |
| 169 | |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 170 | intake->zeroing_constants.measured_absolute_position = 0.0; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 171 | |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 172 | wrist_params->zeroing_constants.measured_absolute_position = 0.0; |
Alex Perry | 5fb5ff2 | 2019-02-09 21:53:17 -0800 | [diff] [blame] | 173 | wrist->potentiometer_offset = 0.0; |
Theo Bafrali | 00e4227 | 2019-02-12 01:07:46 -0800 | [diff] [blame] | 174 | |
| 175 | stilts_params->zeroing_constants.measured_absolute_position = 0.0; |
| 176 | stilts->potentiometer_offset = 0.0; |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 177 | break; |
| 178 | |
| 179 | default: |
| 180 | LOG(FATAL, "unknown team #%" PRIu16 "\n", team); |
| 181 | } |
| 182 | |
| 183 | return r; |
| 184 | } |
| 185 | |
| 186 | const Values *DoGetValues() { |
| 187 | uint16_t team = ::aos::network::GetTeamNumber(); |
| 188 | LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team); |
| 189 | return DoGetValuesForTeam(team); |
| 190 | } |
| 191 | |
| 192 | } // namespace |
| 193 | |
| 194 | const Values &GetValues() { |
| 195 | static ::aos::Once<const Values> once(DoGetValues); |
| 196 | return *once.Get(); |
| 197 | } |
| 198 | |
| 199 | const Values &GetValuesForTeam(uint16_t team_number) { |
| 200 | static ::aos::Mutex mutex; |
| 201 | ::aos::MutexLocker locker(&mutex); |
| 202 | |
| 203 | // IMPORTANT: This declaration has to stay after the mutex is locked to avoid |
| 204 | // race conditions. |
| 205 | static ::std::map<uint16_t, const Values *> values; |
| 206 | |
| 207 | if (values.count(team_number) == 0) { |
| 208 | values[team_number] = DoGetValuesForTeam(team_number); |
| 209 | #if __has_feature(address_sanitizer) |
| 210 | __lsan_ignore_object(values[team_number]); |
| 211 | #endif |
| 212 | } |
| 213 | return *values[team_number]; |
| 214 | } |
| 215 | |
James Kuszmaul | 22c5ab3 | 2019-02-09 14:45:58 -0800 | [diff] [blame] | 216 | constexpr size_t Field::kNumTargets; |
| 217 | constexpr size_t Field::kNumObstacles; |
| 218 | |
| 219 | Field::Field() { |
| 220 | // TODO(james): These values need to re-verified. I got them by skimming the |
| 221 | // manual and they all seem to be pretty much correct. |
| 222 | // |
| 223 | // Note: Per //frc971/control_loops/pose.h, coordinate system is: |
| 224 | // -In meters |
| 225 | // -Origin at center of our driver's station wall |
| 226 | // -Positive X-axis pointing straight out from driver's station |
| 227 | // -Positive Y-axis pointing straight left from the driver's perspective |
| 228 | // -Positive Z-axis is straight up. |
| 229 | // -The angle of the target is such that the angle is the angle you would |
| 230 | // need to be facing to see it straight-on. I.e., if the target angle is |
| 231 | // pi / 2.0, then you would be able to see it face on by facing straight |
| 232 | // left from the driver's point of view (if you were standing in the right |
| 233 | // spot). |
| 234 | constexpr double kCenterFieldX = FeetToMeters(27.0) + InchToMeters(1.125); |
| 235 | |
| 236 | constexpr double kFarSideCargoBayX = |
| 237 | kCenterFieldX - InchToMeters(20.875); |
| 238 | constexpr double kMidSideCargoBayX = kFarSideCargoBayX - InchToMeters(21.75); |
| 239 | constexpr double kNearSideCargoBayX = kMidSideCargoBayX - InchToMeters(21.75); |
| 240 | constexpr double kSideCargoBayY = InchToMeters(24 + 3 + 0.875); |
| 241 | constexpr double kSideCargoBayTheta = -M_PI_2; |
| 242 | |
| 243 | constexpr double kFaceCargoBayX = |
| 244 | kCenterFieldX - InchToMeters(7 * 12 + 11.75 + 9); |
| 245 | constexpr double kFaceCargoBayY = InchToMeters(10.875); |
| 246 | constexpr double kFaceCargoBayTheta = 0.0; |
| 247 | |
| 248 | constexpr double kRocketX = kCenterFieldX - FeetToMeters(8); |
| 249 | constexpr double kRocketY = InchToMeters((26 * 12 + 10.5) / 2.0); |
| 250 | |
| 251 | constexpr double kRocketPortX = kRocketX; |
| 252 | constexpr double kRocketPortY = kRocketY - 0.70; |
| 253 | constexpr double kRocketPortTheta = M_PI_2; |
| 254 | |
| 255 | // Half of portal + guess at width * cos(61.5 deg) |
| 256 | const double kRocketHatchXOffset = InchToMeters(14.634); |
| 257 | const double kRocketHatchY = kRocketPortY + InchToMeters(9.326); |
| 258 | const double kRocketNearX = kRocketX - kRocketHatchXOffset; |
| 259 | const double kRocketFarX = kRocketX + kRocketHatchXOffset; |
| 260 | constexpr double kRocketNearTheta = DegToRad(28.5); |
| 261 | constexpr double kRocketFarTheta = M_PI - kRocketNearTheta; |
| 262 | |
| 263 | constexpr double kHpSlotY = InchToMeters((26 * 12 + 10.5) / 2.0 - 25.9); |
| 264 | constexpr double kHpSlotTheta = M_PI; |
| 265 | |
| 266 | constexpr double kNormalZ = 0.80; |
| 267 | constexpr double kPortZ = 0.99; |
| 268 | |
| 269 | const Pose far_side_cargo_bay({kFarSideCargoBayX, kSideCargoBayY, kNormalZ}, |
| 270 | kSideCargoBayTheta); |
| 271 | const Pose mid_side_cargo_bay({kMidSideCargoBayX, kSideCargoBayY, kNormalZ}, |
| 272 | kSideCargoBayTheta); |
| 273 | const Pose near_side_cargo_bay({kNearSideCargoBayX, kSideCargoBayY, kNormalZ}, |
| 274 | kSideCargoBayTheta); |
| 275 | |
| 276 | const Pose face_cargo_bay({kFaceCargoBayX, kFaceCargoBayY, kNormalZ}, |
| 277 | kFaceCargoBayTheta); |
| 278 | |
| 279 | const Pose rocket_port({kRocketPortX, kRocketPortY, kPortZ}, |
| 280 | kRocketPortTheta); |
| 281 | |
| 282 | const Pose rocket_near({kRocketNearX, kRocketHatchY, kNormalZ}, |
| 283 | kRocketNearTheta); |
| 284 | const Pose rocket_far({kRocketFarX, kRocketHatchY, kNormalZ}, |
| 285 | kRocketFarTheta); |
| 286 | |
| 287 | const Pose hp_slot({0.0, kHpSlotY, kNormalZ}, kHpSlotTheta); |
| 288 | |
| 289 | const ::std::array<Pose, 8> quarter_field_targets{ |
| 290 | {far_side_cargo_bay, mid_side_cargo_bay, near_side_cargo_bay, |
| 291 | face_cargo_bay, rocket_port, rocket_near, rocket_far, hp_slot}}; |
| 292 | |
| 293 | // Mirror across center field mid-line (short field axis): |
| 294 | ::std::array<Pose, 16> half_field_targets; |
| 295 | ::std::copy(quarter_field_targets.begin(), quarter_field_targets.end(), |
| 296 | half_field_targets.begin()); |
| 297 | for (int ii = 0; ii < 8; ++ii) { |
| 298 | const int jj = ii + 8; |
| 299 | half_field_targets[jj] = quarter_field_targets[ii]; |
| 300 | half_field_targets[jj].mutable_pos()->x() = |
| 301 | 2.0 * kCenterFieldX - half_field_targets[jj].rel_pos().x(); |
| 302 | half_field_targets[jj].set_theta( |
| 303 | aos::math::NormalizeAngle(M_PI - half_field_targets[jj].rel_theta())); |
| 304 | } |
| 305 | |
| 306 | ::std::array<Pose, 32> target_poses_; |
| 307 | |
| 308 | // Mirror across x-axis (long field axis): |
| 309 | ::std::copy(half_field_targets.begin(), half_field_targets.end(), |
| 310 | target_poses_.begin()); |
| 311 | for (int ii = 0; ii < 16; ++ii) { |
| 312 | const int jj = ii + 16; |
| 313 | target_poses_[jj] = half_field_targets[ii]; |
| 314 | target_poses_[jj].mutable_pos()->y() *= -1; |
| 315 | target_poses_[jj].set_theta(-target_poses_[jj].rel_theta()); |
| 316 | } |
| 317 | for (int ii = 0; ii < 32; ++ii) { |
| 318 | targets_[ii] = {target_poses_[ii]}; |
| 319 | } |
| 320 | |
| 321 | // Define rocket obstacles as just being a single line that should block any |
| 322 | // cameras trying to see through the rocket up and down the field. |
| 323 | // This line is parallel to the driver's station wall and extends behind |
| 324 | // the portal. |
| 325 | Obstacle rocket_obstacle({{kRocketPortX, kRocketY, 0.0}, 0.0}, |
| 326 | {{kRocketPortX, kRocketPortY + 0.01, 0.0}, 0.0}); |
| 327 | // First, we mirror rocket obstacles across x-axis: |
| 328 | Obstacle rocket_obstacle2({{kRocketPortX, -kRocketY, 0.0}, 0.0}, |
| 329 | {{kRocketPortX, -kRocketPortY - 0.01, 0.0}, 0.0}); |
| 330 | |
| 331 | // Define an obstacle for the Hab that extends striaght out a few feet from |
| 332 | // the driver's station wall. |
| 333 | // TODO(james): Does this actually block our view? |
| 334 | const double kHabL3X = FeetToMeters(4.0); |
| 335 | Obstacle hab_obstacle({}, {{kHabL3X, 0.0, 0.0}, 0.0}); |
| 336 | ::std::array<Obstacle, 3> half_obstacles{ |
| 337 | {rocket_obstacle, rocket_obstacle2, hab_obstacle}}; |
| 338 | ::std::copy(half_obstacles.begin(), half_obstacles.end(), obstacles_.begin()); |
| 339 | |
| 340 | // Next, we mirror across the mid-line (short axis) to duplicate the |
| 341 | // rockets and hab to opposite side of the field. |
| 342 | for (int ii = 0; ii < 3; ++ii) { |
| 343 | const int jj = ii + 3; |
| 344 | obstacles_[jj] = half_obstacles[ii]; |
| 345 | obstacles_[jj].mutable_pose1()->mutable_pos()->x() = |
| 346 | 2.0 * kCenterFieldX - obstacles_[jj].mutable_pose1()->rel_pos().x(); |
| 347 | obstacles_[jj].mutable_pose2()->mutable_pos()->x() = |
| 348 | 2.0 * kCenterFieldX - obstacles_[jj].mutable_pose2()->rel_pos().x(); |
| 349 | } |
| 350 | |
| 351 | // Finally, define a rectangular cargo ship. |
| 352 | const double kCargoCornerX = kFaceCargoBayX + 0.1; |
| 353 | const double kCargoCornerY = kSideCargoBayY - 0.1; |
| 354 | ::std::array<Pose, 4> cargo_corners{ |
| 355 | {{{kCargoCornerX, kCargoCornerY, 0.0}, 0.0}, |
| 356 | {{kCargoCornerX, -kCargoCornerY, 0.0}, 0.0}, |
| 357 | {{2.0 * kCenterFieldX - kCargoCornerX, -kCargoCornerY, 0.0}, 0.0}, |
| 358 | {{2.0 * kCenterFieldX - kCargoCornerX, kCargoCornerY, 0.0}, 0.0}}}; |
| 359 | for (int ii = 6; ii < 10; ++ii) { |
| 360 | obstacles_[ii] = Obstacle(cargo_corners[ii % cargo_corners.size()], |
| 361 | cargo_corners[(ii + 1) % cargo_corners.size()]); |
| 362 | } |
| 363 | } |
| 364 | |
Tyler Chatow | 37ecdcd | 2019-01-26 20:18:42 -0800 | [diff] [blame] | 365 | } // namespace constants |
| 366 | } // namespace y2019 |