blob: 01650c4d0b980116199d5ccf916e2be08ae16bd5 [file] [log] [blame]
Comran Morshede68e3732016-03-12 14:12:11 +00001#include "y2016/actors/autonomous_actor.h"
2
3#include <inttypes.h>
4
Austin Schuh8aec1ed2016-05-01 13:29:20 -07005#include <chrono>
Comran Morshedb134e772016-03-16 21:05:05 +00006#include <cmath>
7
John Park33858a32018-09-28 23:05:48 -07008#include "aos/logging/logging.h"
James Kuszmaul651fc3f2019-05-15 21:14:25 -07009#include "aos/util/phased_loop.h"
Comran Morshed435f1112016-03-12 14:20:45 +000010
11#include "frc971/control_loops/drivetrain/drivetrain.q.h"
12#include "y2016/control_loops/drivetrain/drivetrain_base.h"
Austin Schuhf59b8ee2016-03-19 21:31:36 -070013#include "y2016/control_loops/shooter/shooter.q.h"
Comran Morshedb134e772016-03-16 21:05:05 +000014#include "y2016/control_loops/superstructure/superstructure.q.h"
Austin Schuh23b21802016-04-03 21:18:56 -070015#include "y2016/queues/ball_detector.q.h"
Austin Schuhf59b8ee2016-03-19 21:31:36 -070016#include "y2016/vision/vision.q.h"
Comran Morshede68e3732016-03-12 14:12:11 +000017
18namespace y2016 {
19namespace actors {
Austin Schuhf2a50ba2016-12-24 16:16:26 -080020using ::aos::monotonic_clock;
21namespace chrono = ::std::chrono;
22namespace this_thread = ::std::this_thread;
Comran Morshed435f1112016-03-12 14:20:45 +000023
24namespace {
Austin Schuhf59b8ee2016-03-19 21:31:36 -070025const ProfileParameters kSlowDrive = {0.8, 2.5};
26const ProfileParameters kLowBarDrive = {1.3, 2.5};
27const ProfileParameters kMoatDrive = {1.2, 3.5};
28const ProfileParameters kRealignDrive = {2.0, 2.5};
29const ProfileParameters kRockWallDrive = {0.8, 2.5};
Comran Morshed435f1112016-03-12 14:20:45 +000030const ProfileParameters kFastDrive = {3.0, 2.5};
31
Austin Schuhf59b8ee2016-03-19 21:31:36 -070032const ProfileParameters kSlowTurn = {0.8, 3.0};
Comran Morshed435f1112016-03-12 14:20:45 +000033const ProfileParameters kFastTurn = {3.0, 10.0};
Austin Schuhe4ec49c2016-04-24 19:07:15 -070034const ProfileParameters kStealTurn = {4.0, 15.0};
Austin Schuh23b21802016-04-03 21:18:56 -070035const ProfileParameters kSwerveTurn = {2.0, 7.0};
36const ProfileParameters kFinishTurn = {2.0, 5.0};
37
38const ProfileParameters kTwoBallLowDrive = {1.7, 3.5};
39const ProfileParameters kTwoBallFastDrive = {3.0, 1.5};
40const ProfileParameters kTwoBallReturnDrive = {3.0, 1.9};
Austin Schuhe4ec49c2016-04-24 19:07:15 -070041const ProfileParameters kTwoBallReturnSlow = {3.0, 2.5};
Austin Schuh23b21802016-04-03 21:18:56 -070042const ProfileParameters kTwoBallBallPickup = {2.0, 1.75};
Austin Schuhe4ec49c2016-04-24 19:07:15 -070043const ProfileParameters kTwoBallBallPickupAccel = {2.0, 2.5};
Austin Schuhf2a50ba2016-12-24 16:16:26 -080044
Comran Morshed435f1112016-03-12 14:20:45 +000045} // namespace
Comran Morshede68e3732016-03-12 14:12:11 +000046
Austin Schuh1bf8a212019-05-26 22:13:14 -070047AutonomousActor::AutonomousActor(::aos::EventLoop *event_loop)
Philipp Schrader4bd29b12017-02-22 04:42:27 +000048 : frc971::autonomous::BaseAutonomousActor(
Austin Schuh1bf8a212019-05-26 22:13:14 -070049 event_loop, control_loops::drivetrain::GetDrivetrainConfig()),
50 vision_align_actor_factory_(
Austin Schuh28bde302019-05-26 22:24:33 -070051 actors::VisionAlignActor::MakeFactory(event_loop)),
52 vision_status_fetcher_(
53 event_loop->MakeFetcher<::y2016::vision::VisionStatus>(
Austin Schuh4b652c92019-05-27 13:22:27 -070054 ".y2016.vision.vision_status")),
55 ball_detector_fetcher_(
56 event_loop->MakeFetcher<::y2016::sensors::BallDetector>(
Austin Schuhae023fb2019-06-29 17:11:45 -070057 ".y2016.sensors.ball_detector")),
58 shooter_goal_sender_(
59 event_loop
60 ->MakeSender<::y2016::control_loops::shooter::ShooterQueue::Goal>(
61 ".y2016.control_loops.shooter.shooter_queue.goal")),
62 shooter_status_fetcher_(
63 event_loop->MakeFetcher<
64 ::y2016::control_loops::shooter::ShooterQueue::Status>(
Austin Schuh9481d0d2019-06-29 21:56:17 -070065 ".y2016.control_loops.shooter.shooter_queue.status")),
66 superstructure_status_fetcher_(
67 event_loop->MakeFetcher<
68 ::y2016::control_loops::SuperstructureQueue::Status>(
69 ".y2016.control_loops.superstructure_queue.status")),
70 superstructure_goal_sender_(
71 event_loop
72 ->MakeSender<::y2016::control_loops::SuperstructureQueue::Goal>(
73 ".y2016.control_loops.superstructure_queue.goal")) {}
Comran Morshed435f1112016-03-12 14:20:45 +000074
Austin Schuhe4ec49c2016-04-24 19:07:15 -070075constexpr double kDoNotTurnCare = 2.0;
76
Comran Morshedb134e772016-03-16 21:05:05 +000077void AutonomousActor::MoveSuperstructure(
78 double intake, double shoulder, double wrist,
79 const ProfileParameters intake_params,
80 const ProfileParameters shoulder_params,
Austin Schuh23b21802016-04-03 21:18:56 -070081 const ProfileParameters wrist_params, bool traverse_up,
82 double roller_power) {
Comran Morshedb134e772016-03-16 21:05:05 +000083 superstructure_goal_ = {intake, shoulder, wrist};
84
Austin Schuh9481d0d2019-06-29 21:56:17 -070085 auto new_superstructure_goal = superstructure_goal_sender_.MakeMessage();
Comran Morshedb134e772016-03-16 21:05:05 +000086
87 new_superstructure_goal->angle_intake = intake;
88 new_superstructure_goal->angle_shoulder = shoulder;
89 new_superstructure_goal->angle_wrist = wrist;
90
91 new_superstructure_goal->max_angular_velocity_intake =
92 intake_params.max_velocity;
93 new_superstructure_goal->max_angular_velocity_shoulder =
94 shoulder_params.max_velocity;
95 new_superstructure_goal->max_angular_velocity_wrist =
96 wrist_params.max_velocity;
97
98 new_superstructure_goal->max_angular_acceleration_intake =
99 intake_params.max_acceleration;
100 new_superstructure_goal->max_angular_acceleration_shoulder =
101 shoulder_params.max_acceleration;
102 new_superstructure_goal->max_angular_acceleration_wrist =
103 wrist_params.max_acceleration;
104
Austin Schuh23b21802016-04-03 21:18:56 -0700105 new_superstructure_goal->voltage_top_rollers = roller_power;
106 new_superstructure_goal->voltage_bottom_rollers = roller_power;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700107
108 new_superstructure_goal->traverse_unlatched = true;
109 new_superstructure_goal->traverse_down = !traverse_up;
Diana Vandenberg9cc9ab62016-04-20 21:27:47 -0700110 new_superstructure_goal->voltage_climber = 0.0;
111 new_superstructure_goal->unfold_climber = false;
Comran Morshedb134e772016-03-16 21:05:05 +0000112
113 if (!new_superstructure_goal.Send()) {
114 LOG(ERROR, "Sending superstructure goal failed.\n");
115 }
116}
117
Austin Schuh23b21802016-04-03 21:18:56 -0700118void AutonomousActor::OpenShooter() {
119 shooter_speed_ = 0.0;
120
Austin Schuhae023fb2019-06-29 17:11:45 -0700121 auto shooter_goal = shooter_goal_sender_.MakeMessage();
122 shooter_goal->angular_velocity = shooter_speed_;
123 shooter_goal->clamp_open = true;
124 shooter_goal->push_to_shooter = false;
125 shooter_goal->force_lights_on = false;
126 if (!shooter_goal.Send()) {
Austin Schuh23b21802016-04-03 21:18:56 -0700127 LOG(ERROR, "Sending shooter goal failed.\n");
128 }
129}
130
131void AutonomousActor::CloseShooter() {
132 shooter_speed_ = 0.0;
133
Austin Schuhae023fb2019-06-29 17:11:45 -0700134 auto shooter_goal = shooter_goal_sender_.MakeMessage();
135 shooter_goal->angular_velocity = shooter_speed_;
136 shooter_goal->clamp_open = false;
137 shooter_goal->push_to_shooter = false;
138 shooter_goal->force_lights_on = false;
139
140 if (!shooter_goal.Send()) {
Austin Schuh23b21802016-04-03 21:18:56 -0700141 LOG(ERROR, "Sending shooter goal failed.\n");
142 }
143}
144
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700145void AutonomousActor::SetShooterSpeed(double speed) {
146 shooter_speed_ = speed;
147
148 // In auto, we want to have the lights on whenever possible since we have no
149 // hope of a human aligning the robot.
150 bool force_lights_on = shooter_speed_ > 1.0;
151
Austin Schuhae023fb2019-06-29 17:11:45 -0700152 auto shooter_goal = shooter_goal_sender_.MakeMessage();
153 shooter_goal->angular_velocity = shooter_speed_;
154 shooter_goal->clamp_open = false;
155 shooter_goal->push_to_shooter = false;
156 shooter_goal->force_lights_on = force_lights_on;
157
158 if (!shooter_goal.Send()) {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700159 LOG(ERROR, "Sending shooter goal failed.\n");
160 }
161}
162
163void AutonomousActor::Shoot() {
164 uint32_t initial_shots = 0;
165
Austin Schuhae023fb2019-06-29 17:11:45 -0700166 shooter_status_fetcher_.Fetch();
167 if (shooter_status_fetcher_.get()) {
168 initial_shots = shooter_status_fetcher_->shots;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700169 }
170
171 // In auto, we want to have the lights on whenever possible since we have no
172 // hope of a human aligning the robot.
173 bool force_lights_on = shooter_speed_ > 1.0;
174
Austin Schuhae023fb2019-06-29 17:11:45 -0700175 auto shooter_goal = shooter_goal_sender_.MakeMessage();
176 shooter_goal->angular_velocity = shooter_speed_;
177 shooter_goal->clamp_open = false;
178 shooter_goal->push_to_shooter = true;
179 shooter_goal->force_lights_on = force_lights_on;
180
181 if (!shooter_goal.Send()) {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700182 LOG(ERROR, "Sending shooter goal failed.\n");
183 }
184
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700185 ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
Austin Schuhd32b3622019-06-23 18:49:06 -0700186 event_loop()->monotonic_now(),
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700187 ::std::chrono::milliseconds(5) / 2);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700188 while (true) {
189 if (ShouldCancel()) return;
190
191 // Wait for the shot count to change so we know when the shot is complete.
Austin Schuhae023fb2019-06-29 17:11:45 -0700192 shooter_status_fetcher_.Fetch();
193 if (shooter_status_fetcher_.get()) {
194 if (initial_shots < shooter_status_fetcher_->shots) {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700195 return;
196 }
197 }
198 phased_loop.SleepUntilNext();
199 }
200}
201
202void AutonomousActor::WaitForShooterSpeed() {
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700203 ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
Austin Schuhd32b3622019-06-23 18:49:06 -0700204 event_loop()->monotonic_now(),
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700205 ::std::chrono::milliseconds(5) / 2);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700206 while (true) {
207 if (ShouldCancel()) return;
208
Austin Schuhae023fb2019-06-29 17:11:45 -0700209 shooter_status_fetcher_.Fetch();
210 if (shooter_status_fetcher_.get()) {
211 if (shooter_status_fetcher_->left.ready &&
212 shooter_status_fetcher_->right.ready) {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700213 return;
214 }
215 }
216 phased_loop.SleepUntilNext();
217 }
218}
219
220void AutonomousActor::AlignWithVisionGoal() {
221 actors::VisionAlignActionParams params;
Austin Schuh1bf8a212019-05-26 22:13:14 -0700222 vision_action_ = vision_align_actor_factory_.Make(params);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700223 vision_action_->Start();
224}
225
Austin Schuh23b21802016-04-03 21:18:56 -0700226void AutonomousActor::WaitForAlignedWithVision(
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800227 chrono::nanoseconds align_duration) {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700228 bool vision_valid = false;
229 double last_angle = 0.0;
230 int ready_to_fire = 0;
231
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700232 ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
Austin Schuhd32b3622019-06-23 18:49:06 -0700233 event_loop()->monotonic_now(),
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700234 ::std::chrono::milliseconds(5) / 2);
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800235 monotonic_clock::time_point end_time =
236 monotonic_clock::now() + align_duration;
237 while (end_time > monotonic_clock::now()) {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700238 if (ShouldCancel()) break;
239
Austin Schuh28bde302019-05-26 22:24:33 -0700240 vision_status_fetcher_.Fetch();
241 if (vision_status_fetcher_.get()) {
242 vision_valid = (vision_status_fetcher_->left_image_valid &&
243 vision_status_fetcher_->right_image_valid);
244 last_angle = vision_status_fetcher_->horizontal_angle;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700245 }
246
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700247 drivetrain_status_fetcher_.Fetch();
248 drivetrain_goal_fetcher_.Fetch();
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700249
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700250 if (drivetrain_status_fetcher_.get() && drivetrain_goal_fetcher_.get()) {
251 const double left_goal = drivetrain_goal_fetcher_->left_goal;
252 const double right_goal = drivetrain_goal_fetcher_->right_goal;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700253 const double left_current =
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700254 drivetrain_status_fetcher_->estimated_left_position;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700255 const double right_current =
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700256 drivetrain_status_fetcher_->estimated_right_position;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700257 const double left_velocity =
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700258 drivetrain_status_fetcher_->estimated_left_velocity;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700259 const double right_velocity =
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700260 drivetrain_status_fetcher_->estimated_right_velocity;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700261
262 if (vision_valid && ::std::abs(last_angle) < 0.02 &&
263 ::std::abs((left_goal - right_goal) -
264 (left_current - right_current)) /
265 dt_config_.robot_radius / 2.0 <
266 0.02 &&
267 ::std::abs(left_velocity - right_velocity) < 0.01) {
268 ++ready_to_fire;
269 } else {
270 ready_to_fire = 0;
271 }
Austin Schuh3e4a5272016-04-20 20:11:00 -0700272 if (ready_to_fire > 15) {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700273 break;
Austin Schuh23b21802016-04-03 21:18:56 -0700274 LOG(INFO, "Vision align success!\n");
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700275 }
276 }
277 phased_loop.SleepUntilNext();
278 }
279
280 vision_action_->Cancel();
281 WaitUntilDoneOrCanceled(::std::move(vision_action_));
Austin Schuh23b21802016-04-03 21:18:56 -0700282 LOG(INFO, "Done waiting for vision\n");
283}
284
285bool AutonomousActor::IntakeDone() {
Austin Schuh9481d0d2019-06-29 21:56:17 -0700286 superstructure_status_fetcher_.Fetch();
Austin Schuh23b21802016-04-03 21:18:56 -0700287
288 constexpr double kProfileError = 1e-5;
289 constexpr double kEpsilon = 0.15;
290
Austin Schuh9481d0d2019-06-29 21:56:17 -0700291 if (superstructure_status_fetcher_->state < 12 ||
292 superstructure_status_fetcher_->state == 16) {
Austin Schuh23b21802016-04-03 21:18:56 -0700293 LOG(ERROR, "Superstructure no longer running, aborting action\n");
294 return true;
295 }
296
Austin Schuh9481d0d2019-06-29 21:56:17 -0700297 if (::std::abs(superstructure_status_fetcher_->intake.goal_angle -
Austin Schuh23b21802016-04-03 21:18:56 -0700298 superstructure_goal_.intake) < kProfileError &&
Austin Schuh9481d0d2019-06-29 21:56:17 -0700299 ::std::abs(superstructure_status_fetcher_->intake
Austin Schuh23b21802016-04-03 21:18:56 -0700300 .goal_angular_velocity) < kProfileError) {
301 LOG(DEBUG, "Profile done.\n");
Austin Schuh9481d0d2019-06-29 21:56:17 -0700302 if (::std::abs(superstructure_status_fetcher_->intake.angle -
Austin Schuh23b21802016-04-03 21:18:56 -0700303 superstructure_goal_.intake) < kEpsilon &&
Austin Schuh9481d0d2019-06-29 21:56:17 -0700304 ::std::abs(superstructure_status_fetcher_->intake
Austin Schuh23b21802016-04-03 21:18:56 -0700305 .angular_velocity) < kEpsilon) {
306 LOG(INFO, "Near goal, done.\n");
307 return true;
308 }
309 }
310 return false;
311}
312
313bool AutonomousActor::SuperstructureProfileDone() {
Austin Schuh9481d0d2019-06-29 21:56:17 -0700314 if (superstructure_status_fetcher_->state < 12 ||
315 superstructure_status_fetcher_->state == 16) {
Austin Schuh23b21802016-04-03 21:18:56 -0700316 LOG(ERROR, "Superstructure no longer running, aborting action\n");
317 return true;
318 }
319
Austin Schuh9481d0d2019-06-29 21:56:17 -0700320 constexpr double kProfileError = 1e-5;
321 return ::std::abs(
322 superstructure_status_fetcher_->intake.goal_angle -
323 superstructure_goal_.intake) < kProfileError &&
324 ::std::abs(
325 superstructure_status_fetcher_->shoulder.goal_angle -
326 superstructure_goal_.shoulder) < kProfileError &&
327 ::std::abs(
328 superstructure_status_fetcher_->wrist.goal_angle -
329 superstructure_goal_.wrist) < kProfileError &&
330 ::std::abs(superstructure_status_fetcher_->intake
331 .goal_angular_velocity) < kProfileError &&
332 ::std::abs(superstructure_status_fetcher_->shoulder
333 .goal_angular_velocity) < kProfileError &&
334 ::std::abs(superstructure_status_fetcher_->wrist
335 .goal_angular_velocity) < kProfileError;
336}
337
338bool AutonomousActor::SuperstructureDone() {
339 superstructure_status_fetcher_.Fetch();
340
341 constexpr double kEpsilon = 0.03;
Austin Schuh23b21802016-04-03 21:18:56 -0700342 if (SuperstructureProfileDone()) {
343 LOG(DEBUG, "Profile done.\n");
Austin Schuh9481d0d2019-06-29 21:56:17 -0700344 if (::std::abs(superstructure_status_fetcher_->intake.angle -
Austin Schuh23b21802016-04-03 21:18:56 -0700345 superstructure_goal_.intake) < (kEpsilon + 0.1) &&
Austin Schuh9481d0d2019-06-29 21:56:17 -0700346 ::std::abs(superstructure_status_fetcher_->shoulder.angle -
Austin Schuh23b21802016-04-03 21:18:56 -0700347 superstructure_goal_.shoulder) < (kEpsilon + 0.05) &&
Austin Schuh9481d0d2019-06-29 21:56:17 -0700348 ::std::abs(superstructure_status_fetcher_->wrist.angle -
Austin Schuh23b21802016-04-03 21:18:56 -0700349 superstructure_goal_.wrist) < (kEpsilon + 0.01) &&
Austin Schuh9481d0d2019-06-29 21:56:17 -0700350 ::std::abs(superstructure_status_fetcher_->intake
Austin Schuh23b21802016-04-03 21:18:56 -0700351 .angular_velocity) < (kEpsilon + 0.1) &&
Austin Schuh9481d0d2019-06-29 21:56:17 -0700352 ::std::abs(superstructure_status_fetcher_->shoulder
Austin Schuh23b21802016-04-03 21:18:56 -0700353 .angular_velocity) < (kEpsilon + 0.10) &&
Austin Schuh9481d0d2019-06-29 21:56:17 -0700354 ::std::abs(superstructure_status_fetcher_->wrist
Austin Schuh23b21802016-04-03 21:18:56 -0700355 .angular_velocity) < (kEpsilon + 0.05)) {
356 LOG(INFO, "Near goal, done.\n");
357 return true;
358 }
359 }
360 return false;
361}
362
363void AutonomousActor::WaitForIntake() {
Austin Schuh9481d0d2019-06-29 21:56:17 -0700364 WaitUntil(::std::bind(&AutonomousActor::IntakeDone, this));
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700365}
366
Comran Morshedb134e772016-03-16 21:05:05 +0000367void AutonomousActor::WaitForSuperstructure() {
Austin Schuh9481d0d2019-06-29 21:56:17 -0700368 WaitUntil(::std::bind(&AutonomousActor::SuperstructureDone, this));
Austin Schuh23b21802016-04-03 21:18:56 -0700369}
Comran Morshedb134e772016-03-16 21:05:05 +0000370
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700371void AutonomousActor::WaitForSuperstructureProfile() {
Austin Schuh9481d0d2019-06-29 21:56:17 -0700372 WaitUntil([this]() {
373 superstructure_status_fetcher_.Fetch();
374 return SuperstructureProfileDone();
375 });
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700376}
377
Austin Schuh23b21802016-04-03 21:18:56 -0700378void AutonomousActor::WaitForSuperstructureLow() {
Austin Schuh9481d0d2019-06-29 21:56:17 -0700379 WaitUntil([this]() {
380 superstructure_status_fetcher_.Fetch();
Comran Morshedb134e772016-03-16 21:05:05 +0000381
Austin Schuh9481d0d2019-06-29 21:56:17 -0700382 return SuperstructureProfileDone() ||
383 superstructure_status_fetcher_->shoulder.angle < 0.1;
384 });
Comran Morshedb134e772016-03-16 21:05:05 +0000385}
Austin Schuh9481d0d2019-06-29 21:56:17 -0700386
Austin Schuh23b21802016-04-03 21:18:56 -0700387void AutonomousActor::BackLongShotLowBarTwoBall() {
388 LOG(INFO, "Expanding for back long shot\n");
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700389 MoveSuperstructure(0.00, M_PI / 2.0 - 0.2, -0.55, {7.0, 40.0}, {4.0, 6.0},
Austin Schuh23b21802016-04-03 21:18:56 -0700390 {10.0, 25.0}, false, 0.0);
391}
392
393void AutonomousActor::BackLongShotTwoBall() {
394 LOG(INFO, "Expanding for back long shot\n");
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700395 MoveSuperstructure(0.00, M_PI / 2.0 - 0.2, -0.55, {7.0, 40.0}, {4.0, 6.0},
396 {10.0, 25.0}, false, 0.0);
397}
398
399void AutonomousActor::BackLongShotTwoBallFinish() {
400 LOG(INFO, "Expanding for back long shot\n");
Philipp Schrader4bd29b12017-02-22 04:42:27 +0000401 MoveSuperstructure(0.00, M_PI / 2.0 - 0.2, -0.625 + 0.03, {7.0, 40.0},
402 {4.0, 6.0}, {10.0, 25.0}, false, 0.0);
Austin Schuh23b21802016-04-03 21:18:56 -0700403}
404
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700405void AutonomousActor::BackLongShot() {
406 LOG(INFO, "Expanding for back long shot\n");
Austin Schuh23b21802016-04-03 21:18:56 -0700407 MoveSuperstructure(0.80, M_PI / 2.0 - 0.2, -0.62, {7.0, 40.0}, {4.0, 6.0},
408 {10.0, 25.0}, false, 0.0);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700409}
410
411void AutonomousActor::BackMiddleShot() {
412 LOG(INFO, "Expanding for back middle shot\n");
413 MoveSuperstructure(-0.05, M_PI / 2.0 - 0.2, -0.665, {7.0, 40.0}, {4.0, 10.0},
Austin Schuh23b21802016-04-03 21:18:56 -0700414 {10.0, 25.0}, false, 0.0);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700415}
416
Austin Schuh3e4a5272016-04-20 20:11:00 -0700417void AutonomousActor::FrontLongShot() {
418 LOG(INFO, "Expanding for front long shot\n");
419 MoveSuperstructure(0.80, M_PI / 2.0 + 0.1, M_PI + 0.41 + 0.02, {7.0, 40.0},
420 {4.0, 6.0}, {10.0, 25.0}, false, 0.0);
421}
422
423void AutonomousActor::FrontMiddleShot() {
424 LOG(INFO, "Expanding for front middle shot\n");
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700425 MoveSuperstructure(-0.05, M_PI / 2.0 + 0.1, M_PI + 0.44, {7.0, 40.0},
Austin Schuh3e4a5272016-04-20 20:11:00 -0700426 {4.0, 10.0}, {10.0, 25.0}, true, 0.0);
427}
428
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700429void AutonomousActor::TuckArm(bool low_bar, bool traverse_down) {
430 MoveSuperstructure(low_bar ? -0.05 : 2.0, -0.010, 0.0, {7.0, 40.0},
Austin Schuh23b21802016-04-03 21:18:56 -0700431 {4.0, 10.0}, {10.0, 25.0}, !traverse_down, 0.0);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700432}
433
Austin Schuh3e4a5272016-04-20 20:11:00 -0700434void AutonomousActor::DoFullShot() {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700435 if (ShouldCancel()) return;
436 // Make sure that the base is aligned with the base.
437 LOG(INFO, "Waiting for the superstructure\n");
438 WaitForSuperstructure();
Austin Schuh3e4a5272016-04-20 20:11:00 -0700439
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800440 this_thread::sleep_for(chrono::milliseconds(500));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700441
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700442 if (ShouldCancel()) return;
443 LOG(INFO, "Triggering the vision actor\n");
444 AlignWithVisionGoal();
445
446 // Wait for the drive base to be aligned with the target and make sure that
447 // the shooter is up to speed.
448 LOG(INFO, "Waiting for vision to be aligned\n");
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800449 WaitForAlignedWithVision(chrono::milliseconds(2000));
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700450 if (ShouldCancel()) return;
451 LOG(INFO, "Waiting for shooter to be up to speed\n");
452 WaitForShooterSpeed();
453 if (ShouldCancel()) return;
454
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800455 this_thread::sleep_for(chrono::milliseconds(300));
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700456 LOG(INFO, "Shoot!\n");
457 Shoot();
458
459 // Turn off the shooter and fold up the superstructure.
460 if (ShouldCancel()) return;
461 LOG(INFO, "Stopping shooter\n");
462 SetShooterSpeed(0.0);
463 LOG(INFO, "Folding superstructure back down\n");
464 TuckArm(false, false);
465
466 // Wait for everything to be folded up.
467 LOG(INFO, "Waiting for superstructure to be folded back down\n");
Austin Schuh3e4a5272016-04-20 20:11:00 -0700468 WaitForSuperstructureLow();
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700469}
470
471void AutonomousActor::LowBarDrive() {
472 TuckArm(false, true);
473 StartDrive(-5.5, 0.0, kLowBarDrive, kSlowTurn);
474
475 if (!WaitForDriveNear(5.3, 0.0)) return;
476 TuckArm(true, true);
477
478 if (!WaitForDriveNear(5.0, 0.0)) return;
479
480 StartDrive(0.0, 0.0, kLowBarDrive, kSlowTurn);
481
482 if (!WaitForDriveNear(3.0, 0.0)) return;
483
484 StartDrive(0.0, 0.0, kLowBarDrive, kSlowTurn);
485
486 if (!WaitForDriveNear(1.0, 0.0)) return;
487
Austin Schuh15b5f6a2016-03-26 19:43:56 -0700488 StartDrive(0, -M_PI / 4.0 - 0.2, kLowBarDrive, kSlowTurn);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700489}
490
Austin Schuh3e4a5272016-04-20 20:11:00 -0700491void AutonomousActor::TippyDrive(double goal_distance, double tip_distance,
492 double below, double above) {
493 StartDrive(goal_distance, 0.0, kMoatDrive, kSlowTurn);
494 if (!WaitForBelowAngle(below)) return;
495 if (!WaitForAboveAngle(above)) return;
496 // Ok, we are good now. Compensate by moving the goal by the error.
497 // Should be here at 2.7
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700498 drivetrain_status_fetcher_.Fetch();
499 if (drivetrain_status_fetcher_.get()) {
Austin Schuh3e4a5272016-04-20 20:11:00 -0700500 const double left_error =
501 (initial_drivetrain_.left -
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700502 drivetrain_status_fetcher_->estimated_left_position);
Austin Schuh3e4a5272016-04-20 20:11:00 -0700503 const double right_error =
504 (initial_drivetrain_.right -
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700505 drivetrain_status_fetcher_->estimated_right_position);
Austin Schuh3e4a5272016-04-20 20:11:00 -0700506 const double distance_to_go = (left_error + right_error) / 2.0;
507 const double distance_compensation =
508 goal_distance - tip_distance - distance_to_go;
509 LOG(INFO, "Going %f further at the bump\n", distance_compensation);
510 StartDrive(distance_compensation, 0.0, kMoatDrive, kSlowTurn);
511 }
512}
513
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700514void AutonomousActor::MiddleDrive() {
515 TuckArm(false, false);
Austin Schuh3e4a5272016-04-20 20:11:00 -0700516 TippyDrive(3.65, 2.7, -0.2, 0.0);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700517 if (!WaitForDriveDone()) return;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700518}
519
520void AutonomousActor::OneFromMiddleDrive(bool left) {
Austin Schuh3e4a5272016-04-20 20:11:00 -0700521 const double kTurnAngle = left ? -0.41 : 0.41;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700522 TuckArm(false, false);
Austin Schuh3e4a5272016-04-20 20:11:00 -0700523 TippyDrive(4.05, 2.7, -0.2, 0.0);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700524
525 if (!WaitForDriveDone()) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700526 StartDrive(0.0, kTurnAngle, kRealignDrive, kFastTurn);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700527}
528
529void AutonomousActor::TwoFromMiddleDrive() {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700530 TuckArm(false, false);
Austin Schuh3e4a5272016-04-20 20:11:00 -0700531 constexpr double kDriveDistance = 5.10;
532 TippyDrive(kDriveDistance, 2.7, -0.2, 0.0);
533
534 if (!WaitForDriveNear(kDriveDistance - 3.0, 2.0)) return;
535 StartDrive(0, -M_PI / 2 - 0.10, kMoatDrive, kFastTurn);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700536
537 if (!WaitForDriveDone()) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700538 StartDrive(0, M_PI / 3 + 0.35, kMoatDrive, kFastTurn);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700539}
Comran Morshedb134e772016-03-16 21:05:05 +0000540
Austin Schuh23b21802016-04-03 21:18:56 -0700541void AutonomousActor::CloseIfBall() {
Austin Schuh4b652c92019-05-27 13:22:27 -0700542 ball_detector_fetcher_.Fetch();
543 if (ball_detector_fetcher_.get()) {
544 const bool ball_detected = ball_detector_fetcher_->voltage > 2.5;
Austin Schuh23b21802016-04-03 21:18:56 -0700545 if (ball_detected) {
546 CloseShooter();
547 }
548 }
549}
550
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700551void AutonomousActor::WaitForBallOrDriveDone() {
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700552 ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
Austin Schuhd32b3622019-06-23 18:49:06 -0700553 event_loop()->monotonic_now(),
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700554 ::std::chrono::milliseconds(5) / 2);
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700555 while (true) {
556 if (ShouldCancel()) {
557 return;
558 }
559 phased_loop.SleepUntilNext();
Austin Schuhbd0a40f2019-06-30 14:56:31 -0700560 drivetrain_status_fetcher_.Fetch();
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700561 if (IsDriveDone()) {
562 return;
563 }
564
Austin Schuh4b652c92019-05-27 13:22:27 -0700565 ball_detector_fetcher_.Fetch();
566 if (ball_detector_fetcher_.get()) {
567 const bool ball_detected = ball_detector_fetcher_->voltage > 2.5;
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700568 if (ball_detected) {
569 return;
570 }
571 }
572 }
573}
574
Austin Schuh3e4a5272016-04-20 20:11:00 -0700575void AutonomousActor::TwoBallAuto() {
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800576 monotonic_clock::time_point start_time = monotonic_clock::now();
Austin Schuh3e4a5272016-04-20 20:11:00 -0700577 OpenShooter();
578 MoveSuperstructure(0.10, -0.010, 0.0, {8.0, 60.0}, {4.0, 10.0}, {10.0, 25.0},
579 false, 12.0);
580 if (ShouldCancel()) return;
581 LOG(INFO, "Waiting for the intake to come down.\n");
582
583 WaitForIntake();
584 LOG(INFO, "Intake done at %f seconds, starting to drive\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700585 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700586 if (ShouldCancel()) return;
587 const double kDriveDistance = 5.05;
588 StartDrive(-kDriveDistance, 0.0, kTwoBallLowDrive, kSlowTurn);
589
590 StartDrive(0.0, 0.4, kTwoBallLowDrive, kSwerveTurn);
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700591 if (!WaitForDriveNear(kDriveDistance - 0.5, kDoNotTurnCare)) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700592
Austin Schuh295c2d92016-05-01 12:28:04 -0700593 // Check if the ball is there.
594 bool first_ball_there = true;
Austin Schuh4b652c92019-05-27 13:22:27 -0700595 ball_detector_fetcher_.Fetch();
596 if (ball_detector_fetcher_.get()) {
597 const bool ball_detected = ball_detector_fetcher_->voltage > 2.5;
Austin Schuh295c2d92016-05-01 12:28:04 -0700598 first_ball_there = ball_detected;
599 LOG(INFO, "Saw the ball: %d at %f\n", first_ball_there,
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700600 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh295c2d92016-05-01 12:28:04 -0700601 }
Austin Schuh3e4a5272016-04-20 20:11:00 -0700602 MoveSuperstructure(0.10, -0.010, 0.0, {8.0, 40.0}, {4.0, 10.0}, {10.0, 25.0},
603 false, 0.0);
604 LOG(INFO, "Shutting off rollers at %f seconds, starting to straighten out\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700605 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700606 StartDrive(0.0, -0.4, kTwoBallLowDrive, kSwerveTurn);
607 MoveSuperstructure(-0.05, -0.010, 0.0, {8.0, 40.0}, {4.0, 10.0}, {10.0, 25.0},
608 false, 0.0);
609 CloseShooter();
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700610 if (!WaitForDriveNear(kDriveDistance - 2.4, kDoNotTurnCare)) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700611
612 // We are now under the low bar. Start lifting.
613 BackLongShotLowBarTwoBall();
614 LOG(INFO, "Spinning up the shooter wheels\n");
615 SetShooterSpeed(640.0);
616 StartDrive(0.0, 0.0, kTwoBallFastDrive, kSwerveTurn);
617
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700618 if (!WaitForDriveNear(1.50, kDoNotTurnCare)) return;
619 constexpr double kShootTurnAngle = -M_PI / 4.0 - 0.05;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700620 StartDrive(0, kShootTurnAngle, kTwoBallFastDrive, kFinishTurn);
621 BackLongShotTwoBall();
622
623 if (!WaitForDriveDone()) return;
624 LOG(INFO, "First shot done driving at %f seconds\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700625 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700626
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700627 WaitForSuperstructureProfile();
Austin Schuh3e4a5272016-04-20 20:11:00 -0700628
629 if (ShouldCancel()) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700630 AlignWithVisionGoal();
631
632 WaitForShooterSpeed();
633 if (ShouldCancel()) return;
634
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800635 constexpr chrono::milliseconds kVisionExtra{0};
636 WaitForAlignedWithVision(chrono::milliseconds(500) + kVisionExtra);
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700637 BackLongShotTwoBallFinish();
638 WaitForSuperstructureProfile();
639 if (ShouldCancel()) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700640 LOG(INFO, "Shoot!\n");
Austin Schuh295c2d92016-05-01 12:28:04 -0700641 if (first_ball_there) {
642 Shoot();
643 } else {
644 LOG(INFO, "Nah, not shooting\n");
645 }
Austin Schuh3e4a5272016-04-20 20:11:00 -0700646
647 LOG(INFO, "First shot at %f seconds\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700648 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700649 if (ShouldCancel()) return;
650
651 SetShooterSpeed(0.0);
652 LOG(INFO, "Folding superstructure back down\n");
653 TuckArm(true, true);
654
655 // Undo vision move.
656 StartDrive(0.0, 0.0, kTwoBallFastDrive, kFinishTurn);
657 if (!WaitForDriveDone()) return;
658
659 constexpr double kBackDrive = 3.09 - 0.4;
660 StartDrive(kBackDrive, 0.0, kTwoBallReturnDrive, kSlowTurn);
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700661 if (!WaitForDriveNear(kBackDrive - 0.19, kDoNotTurnCare)) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700662 StartDrive(0, -kShootTurnAngle, kTwoBallReturnDrive, kSwerveTurn);
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700663 if (!WaitForDriveNear(1.0, kDoNotTurnCare)) return;
664 StartDrive(0, 0, kTwoBallReturnSlow, kSwerveTurn);
Austin Schuh3e4a5272016-04-20 20:11:00 -0700665
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700666 if (!WaitForDriveNear(0.06, kDoNotTurnCare)) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700667 LOG(INFO, "At Low Bar %f\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700668 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700669
670 OpenShooter();
671 constexpr double kSecondBallAfterBarDrive = 2.10;
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700672 StartDrive(kSecondBallAfterBarDrive, 0.0, kTwoBallBallPickupAccel, kSlowTurn);
673 if (!WaitForDriveNear(kSecondBallAfterBarDrive - 0.5, kDoNotTurnCare)) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700674 constexpr double kBallSmallWallTurn = -0.11;
675 StartDrive(0, kBallSmallWallTurn, kTwoBallBallPickup, kFinishTurn);
676
677 MoveSuperstructure(0.03, -0.010, 0.0, {8.0, 60.0}, {4.0, 10.0}, {10.0, 25.0},
678 false, 12.0);
679
680 if (!WaitForDriveProfileDone()) return;
681
682 MoveSuperstructure(0.10, -0.010, 0.0, {8.0, 60.0}, {4.0, 10.0}, {10.0, 25.0},
683 false, 12.0);
684
685 LOG(INFO, "Done backing up %f\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700686 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700687
688 constexpr double kDriveBackDistance = 5.15 - 0.4;
689 StartDrive(-kDriveBackDistance, 0.0, kTwoBallLowDrive, kFinishTurn);
690 CloseIfBall();
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700691 if (!WaitForDriveNear(kDriveBackDistance - 0.75, kDoNotTurnCare)) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700692
693 StartDrive(0.0, -kBallSmallWallTurn, kTwoBallLowDrive, kFinishTurn);
694 LOG(INFO, "Straightening up at %f\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700695 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700696
697 CloseIfBall();
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700698 if (!WaitForDriveNear(kDriveBackDistance - 2.3, kDoNotTurnCare)) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700699
Austin Schuh4b652c92019-05-27 13:22:27 -0700700 ball_detector_fetcher_.Fetch();
701 if (ball_detector_fetcher_.get()) {
702 const bool ball_detected = ball_detector_fetcher_->voltage > 2.5;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700703 if (!ball_detected) {
704 if (!WaitForDriveDone()) return;
705 LOG(INFO, "Aborting, no ball %f\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700706 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700707 return;
708 }
709 }
710 CloseShooter();
711
712 BackLongShotLowBarTwoBall();
713 LOG(INFO, "Spinning up the shooter wheels\n");
714 SetShooterSpeed(640.0);
715 StartDrive(0.0, 0.0, kTwoBallFastDrive, kSwerveTurn);
716
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700717 if (!WaitForDriveNear(1.80, kDoNotTurnCare)) return;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700718 StartDrive(0, kShootTurnAngle, kTwoBallFastDrive, kFinishTurn);
719 BackLongShotTwoBall();
720
721 if (!WaitForDriveDone()) return;
722 LOG(INFO, "Second shot done driving at %f seconds\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700723 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700724 WaitForSuperstructure();
Austin Schuh3e4a5272016-04-20 20:11:00 -0700725 AlignWithVisionGoal();
726 if (ShouldCancel()) return;
727
728 WaitForShooterSpeed();
729 if (ShouldCancel()) return;
730
731 // 2.2 with 0.4 of vision.
732 // 1.8 without any vision.
733 LOG(INFO, "Going to vision align at %f\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700734 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800735 WaitForAlignedWithVision(
736 (start_time + chrono::milliseconds(13500) + kVisionExtra * 2) -
737 monotonic_clock::now());
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700738 BackLongShotTwoBallFinish();
739 WaitForSuperstructureProfile();
740 if (ShouldCancel()) return;
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800741 LOG(INFO, "Shoot at %f\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700742 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700743 Shoot();
744
745 LOG(INFO, "Second shot at %f seconds\n",
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700746 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700747 if (ShouldCancel()) return;
748
749 SetShooterSpeed(0.0);
750 LOG(INFO, "Folding superstructure back down\n");
751 TuckArm(true, false);
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700752 LOG(INFO, "Shot %f\n",
753 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700754
755 WaitForSuperstructureLow();
756
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700757 LOG(INFO, "Done %f\n",
758 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Austin Schuh3e4a5272016-04-20 20:11:00 -0700759}
760
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700761void AutonomousActor::StealAndMoveOverBy(double distance) {
762 OpenShooter();
763 MoveSuperstructure(0.10, -0.010, 0.0, {8.0, 60.0}, {4.0, 10.0}, {10.0, 25.0},
764 true, 12.0);
765 if (ShouldCancel()) return;
766 LOG(INFO, "Waiting for the intake to come down.\n");
767
768 WaitForIntake();
769 if (ShouldCancel()) return;
770 StartDrive(-distance, M_PI / 2.0, kFastDrive, kStealTurn);
771 WaitForBallOrDriveDone();
772 if (ShouldCancel()) return;
773 MoveSuperstructure(1.0, -0.010, 0.0, {8.0, 60.0}, {4.0, 10.0}, {10.0, 25.0},
774 true, 12.0);
775
776 if (!WaitForDriveDone()) return;
777 StartDrive(0.0, M_PI / 2.0, kFastDrive, kStealTurn);
778 if (!WaitForDriveDone()) return;
779}
780
Philipp Schrader4bd29b12017-02-22 04:42:27 +0000781bool AutonomousActor::RunAction(
782 const ::frc971::autonomous::AutonomousActionParams &params) {
Austin Schuhf2a50ba2016-12-24 16:16:26 -0800783 monotonic_clock::time_point start_time = monotonic_clock::now();
Comran Morshede68e3732016-03-12 14:12:11 +0000784 LOG(INFO, "Starting autonomous action with mode %" PRId32 "\n", params.mode);
785
Comran Morshed435f1112016-03-12 14:20:45 +0000786 InitializeEncoders();
787 ResetDrivetrain();
788
Austin Schuh295c2d92016-05-01 12:28:04 -0700789 switch (params.mode) {
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700790 case 0:
791 LowBarDrive();
Austin Schuh3e4a5272016-04-20 20:11:00 -0700792 if (!WaitForDriveDone()) return true;
793 // Get the superstructure to unfold and get ready for shooting.
794 LOG(INFO, "Unfolding superstructure\n");
795 FrontLongShot();
796
797 // Spin up the shooter wheels.
798 LOG(INFO, "Spinning up the shooter wheels\n");
799 SetShooterSpeed(640.0);
800
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700801 break;
802 case 1:
803 TwoFromMiddleDrive();
Austin Schuh3e4a5272016-04-20 20:11:00 -0700804 if (!WaitForDriveDone()) return true;
805 // Get the superstructure to unfold and get ready for shooting.
806 LOG(INFO, "Unfolding superstructure\n");
807 FrontMiddleShot();
808
809 // Spin up the shooter wheels.
810 LOG(INFO, "Spinning up the shooter wheels\n");
811 SetShooterSpeed(600.0);
812
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700813 break;
814 case 2:
815 OneFromMiddleDrive(true);
Austin Schuh3e4a5272016-04-20 20:11:00 -0700816 if (!WaitForDriveDone()) return true;
817 // Get the superstructure to unfold and get ready for shooting.
818 LOG(INFO, "Unfolding superstructure\n");
819 FrontMiddleShot();
820
821 // Spin up the shooter wheels.
822 LOG(INFO, "Spinning up the shooter wheels\n");
823 SetShooterSpeed(600.0);
824
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700825 break;
826 case 3:
827 MiddleDrive();
Austin Schuh3e4a5272016-04-20 20:11:00 -0700828 if (!WaitForDriveDone()) return true;
829 // Get the superstructure to unfold and get ready for shooting.
830 LOG(INFO, "Unfolding superstructure\n");
831 FrontMiddleShot();
832
833 // Spin up the shooter wheels.
834 LOG(INFO, "Spinning up the shooter wheels\n");
835 SetShooterSpeed(600.0);
836
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700837 break;
838 case 4:
839 OneFromMiddleDrive(false);
Austin Schuh3e4a5272016-04-20 20:11:00 -0700840 if (!WaitForDriveDone()) return true;
841 // Get the superstructure to unfold and get ready for shooting.
842 LOG(INFO, "Unfolding superstructure\n");
843 FrontMiddleShot();
844
845 // Spin up the shooter wheels.
846 LOG(INFO, "Spinning up the shooter wheels\n");
847 SetShooterSpeed(600.0);
848
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700849 break;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700850 case 5:
Campbell Crowley9ed61a52016-11-05 17:13:07 -0700851 case 15:
Austin Schuh3e4a5272016-04-20 20:11:00 -0700852 TwoBallAuto();
Austin Schuh23b21802016-04-03 21:18:56 -0700853 return true;
Austin Schuh3e4a5272016-04-20 20:11:00 -0700854 break;
Austin Schuhe4ec49c2016-04-24 19:07:15 -0700855 case 6:
856 StealAndMoveOverBy(3.10 + 2 * 52 * 2.54 / 100.0);
857 if (ShouldCancel()) return true;
858
859 TwoFromMiddleDrive();
860 if (!WaitForDriveDone()) return true;
861 // Get the superstructure to unfold and get ready for shooting.
862 LOG(INFO, "Unfolding superstructure\n");
863 FrontMiddleShot();
864
865 // Spin up the shooter wheels.
866 LOG(INFO, "Spinning up the shooter wheels\n");
867 SetShooterSpeed(600.0);
868
869 break;
870 case 7:
871 StealAndMoveOverBy(2.95 + 52 * 2.54 / 100.0);
872 if (ShouldCancel()) return true;
873
874 OneFromMiddleDrive(true);
875 if (!WaitForDriveDone()) return true;
876 // Get the superstructure to unfold and get ready for shooting.
877 LOG(INFO, "Unfolding superstructure\n");
878 FrontMiddleShot();
879
880 // Spin up the shooter wheels.
881 LOG(INFO, "Spinning up the shooter wheels\n");
882 SetShooterSpeed(600.0);
883
884 break;
885 case 8: {
886 StealAndMoveOverBy(2.95);
887 if (ShouldCancel()) return true;
888
889 MiddleDrive();
890 if (!WaitForDriveDone()) return true;
891 // Get the superstructure to unfold and get ready for shooting.
892 LOG(INFO, "Unfolding superstructure\n");
893 FrontMiddleShot();
894
895 // Spin up the shooter wheels.
896 LOG(INFO, "Spinning up the shooter wheels\n");
897 SetShooterSpeed(600.0);
898
899 } break;
900 case 9: {
901 StealAndMoveOverBy(1.70);
902 if (ShouldCancel()) return true;
903
904 OneFromMiddleDrive(false);
905 if (!WaitForDriveDone()) return true;
906 // Get the superstructure to unfold and get ready for shooting.
907 LOG(INFO, "Unfolding superstructure\n");
908 FrontMiddleShot();
909
910 // Spin up the shooter wheels.
911 LOG(INFO, "Spinning up the shooter wheels\n");
912 SetShooterSpeed(600.0);
913
914 } break;
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700915 default:
Austin Schuh6c9bc622016-03-26 19:44:12 -0700916 LOG(ERROR, "Invalid auto mode %d\n", params.mode);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700917 return true;
918 }
Comran Morshed435f1112016-03-12 14:20:45 +0000919
Austin Schuh3e4a5272016-04-20 20:11:00 -0700920 DoFullShot();
921
922 StartDrive(0.5, 0.0, kMoatDrive, kFastTurn);
Comran Morshed435f1112016-03-12 14:20:45 +0000923 if (!WaitForDriveDone()) return true;
924
James Kuszmaul651fc3f2019-05-15 21:14:25 -0700925 LOG(INFO, "Done %f\n",
926 ::aos::time::DurationInSeconds(monotonic_clock::now() - start_time));
Comran Morshed435f1112016-03-12 14:20:45 +0000927
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700928 ::aos::time::PhasedLoop phased_loop(::std::chrono::milliseconds(5),
Austin Schuhd32b3622019-06-23 18:49:06 -0700929 event_loop()->monotonic_now(),
Austin Schuh8aec1ed2016-05-01 13:29:20 -0700930 ::std::chrono::milliseconds(5) / 2);
Austin Schuhf59b8ee2016-03-19 21:31:36 -0700931
Comran Morshed435f1112016-03-12 14:20:45 +0000932 while (!ShouldCancel()) {
933 phased_loop.SleepUntilNext();
Comran Morshede68e3732016-03-12 14:12:11 +0000934 }
Comran Morshed435f1112016-03-12 14:20:45 +0000935 LOG(DEBUG, "Done running\n");
Comran Morshede68e3732016-03-12 14:12:11 +0000936
937 return true;
938}
939
Comran Morshede68e3732016-03-12 14:12:11 +0000940} // namespace actors
941} // namespace y2016