blob: 160d36ad2053b9cb7ef3d4a5801cfb55eac39936 [file] [log] [blame]
Stephan Massaltd021f972020-01-05 20:41:23 -08001#include "y2020/actors/autonomous_actor.h"
2
Stephan Massaltd021f972020-01-05 20:41:23 -08003#include <chrono>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07004#include <cinttypes>
Stephan Massaltd021f972020-01-05 20:41:23 -08005#include <cmath>
6
7#include "aos/logging/logging.h"
Austin Schuh3653cf22021-11-12 11:54:51 -08008#include "aos/network/team_number.h"
James Kuszmaulddd2ba62020-03-08 22:17:13 -07009#include "aos/util/math.h"
Stephan Massaltd021f972020-01-05 20:41:23 -080010#include "frc971/control_loops/drivetrain/localizer_generated.h"
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080011#include "y2020/actors/auto_splines.h"
Austin Schuh3653cf22021-11-12 11:54:51 -080012#include "y2020/constants.h"
Ravago Jonesc2a08022021-02-06 17:40:54 -080013#include "y2020/control_loops/drivetrain/drivetrain_base.h"
Stephan Massaltd021f972020-01-05 20:41:23 -080014
Austin Schuh3fb9e422021-03-31 20:11:32 -070015DEFINE_bool(spline_auto, false, "If true, define a spline autonomous mode");
Ravago Jonesa7b3c822021-08-26 12:36:03 -070016DEFINE_bool(just_shoot, false,
17 "If true, run the autonomous that just shoots balls.");
milind upadhyay47a0ab32020-11-25 19:34:41 -080018
Stephan Massaltd021f972020-01-05 20:41:23 -080019namespace y2020 {
20namespace actors {
21
22using ::aos::monotonic_clock;
23using ::frc971::ProfileParametersT;
24using frc971::control_loops::drivetrain::LocalizerControl;
25namespace chrono = ::std::chrono;
26
27AutonomousActor::AutonomousActor(::aos::EventLoop *event_loop)
28 : frc971::autonomous::BaseAutonomousActor(
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080029 event_loop, control_loops::drivetrain::GetDrivetrainConfig()),
Ravago Jonesc2a08022021-02-06 17:40:54 -080030 localizer_control_sender_(
31 event_loop->MakeSender<
32 ::frc971::control_loops::drivetrain::LocalizerControl>(
33 "/drivetrain")),
Austin Schuh67e127e2021-03-27 13:25:23 -070034 superstructure_goal_sender_(
35 event_loop->MakeSender<control_loops::superstructure::Goal>(
36 "/superstructure")),
Ravago Jones1f32d622021-08-26 12:20:36 -070037 superstructure_status_fetcher_(
38 event_loop->MakeFetcher<y2020::control_loops::superstructure::Status>(
39 "/superstructure")),
Austin Schuhba77b7e2021-10-25 21:58:54 -070040 joystick_state_fetcher_(
41 event_loop->MakeFetcher<aos::JoystickState>("/aos")),
42 robot_state_fetcher_(event_loop->MakeFetcher<aos::RobotState>("/aos")),
Ravago Jonesc2a08022021-02-06 17:40:54 -080043 auto_splines_() {
Austin Schuh3653cf22021-11-12 11:54:51 -080044 practice_robot_ =
45 ::aos::network::GetTeamNumber() == constants::Values::kPracticeTeamNumber;
46
Austin Schuhd0e9e062021-10-24 17:40:58 -070047 set_max_drivetrain_voltage(12.0);
James Kuszmaul99af8b52021-03-28 10:50:15 -070048 replan_timer_ = event_loop->AddTimer([this]() { Replan(); });
49 event_loop->OnRun([this, event_loop]() {
Philipp Schradera6712522023-07-05 20:25:11 -070050 replan_timer_->Schedule(event_loop->monotonic_now());
51 button_poll_->Schedule(event_loop->monotonic_now(),
52 chrono::milliseconds(50));
James Kuszmaul99af8b52021-03-28 10:50:15 -070053 });
Austin Schuhba77b7e2021-10-25 21:58:54 -070054
55 button_poll_ = event_loop->AddTimer([this]() {
James Kuszmaulead4da62021-10-24 17:36:54 -070056 const aos::monotonic_clock::time_point now =
57 this->event_loop()->context().monotonic_event_time;
Austin Schuhba77b7e2021-10-25 21:58:54 -070058 if (robot_state_fetcher_.Fetch()) {
59 if (robot_state_fetcher_->user_button()) {
60 user_indicated_safe_to_reset_ = true;
61 MaybeSendStartingPosition();
62 }
James Kuszmaul4303a5d2021-10-23 19:58:48 -070063 }
Austin Schuhba77b7e2021-10-25 21:58:54 -070064 if (joystick_state_fetcher_.Fetch()) {
65 if (joystick_state_fetcher_->has_alliance() &&
66 (joystick_state_fetcher_->alliance() != alliance_)) {
67 alliance_ = joystick_state_fetcher_->alliance();
James Kuszmaulead4da62021-10-24 17:36:54 -070068 is_planned_ = false;
69 // Only kick the planning out by 2 seconds. If we end up enabled in that
70 // second, then we will kick it out further based on the code below.
Philipp Schradera6712522023-07-05 20:25:11 -070071 replan_timer_->Schedule(now + std::chrono::seconds(2));
James Kuszmaulead4da62021-10-24 17:36:54 -070072 }
73 if (joystick_state_fetcher_->enabled()) {
74 if (!is_planned_) {
75 // Only replan once we've been disabled for 5 seconds.
Philipp Schradera6712522023-07-05 20:25:11 -070076 replan_timer_->Schedule(now + std::chrono::seconds(5));
James Kuszmaulead4da62021-10-24 17:36:54 -070077 }
Austin Schuhba77b7e2021-10-25 21:58:54 -070078 }
James Kuszmaul4303a5d2021-10-23 19:58:48 -070079 }
80 });
81}
82
83void AutonomousActor::MaybeSendStartingPosition() {
James Kuszmaulead4da62021-10-24 17:36:54 -070084 if (is_planned_ && user_indicated_safe_to_reset_ &&
85 !sent_starting_position_) {
James Kuszmaul4303a5d2021-10-23 19:58:48 -070086 CHECK(starting_position_);
87 SendStartingPosition(starting_position_.value());
88 }
James Kuszmaul99af8b52021-03-28 10:50:15 -070089}
90
91void AutonomousActor::Replan() {
milind-u0e203782021-10-30 21:57:20 -070092 LOG(INFO) << "Alliance " << static_cast<int>(alliance_);
Austin Schuhd0e9e062021-10-24 17:40:58 -070093 if (alliance_ == aos::Alliance::kInvalid) {
94 return;
95 }
milind-u0e203782021-10-30 21:57:20 -070096 sent_starting_position_ = false;
Ravago Jones8c5737e2021-10-16 15:36:12 -070097 if (FLAGS_spline_auto) {
Tyler Chatowbf0609c2021-07-31 16:13:27 -070098 test_spline_ = PlanSpline(std::bind(&AutonomousSplines::TestSpline,
99 &auto_splines_, std::placeholders::_1),
100 SplineDirection::kForward);
James Kuszmaul4303a5d2021-10-23 19:58:48 -0700101 starting_position_ = test_spline_->starting_position();
James Kuszmaul4303a5d2021-10-23 19:58:48 -0700102 } else {
Austin Schuh3653cf22021-11-12 11:54:51 -0800103 if (practice_robot_) {
104 fender_splines_ = {PlanSpline(
105 std::bind(&AutonomousSplines::FarSideFender, &auto_splines_,
106 std::placeholders::_1, alliance_),
107 SplineDirection::kForward)};
108 starting_position_ = fender_splines_.value()[0].starting_position();
109 CHECK(starting_position_);
110 } else {
111 target_aligned_splines_ = {
112 PlanSpline(
113 std::bind(&AutonomousSplines::TargetAligned1, &auto_splines_,
114 std::placeholders::_1, alliance_),
115 SplineDirection::kForward),
116 PlanSpline(
117 std::bind(&AutonomousSplines::TargetAligned2, &auto_splines_,
118 std::placeholders::_1, alliance_),
119 SplineDirection::kBackward),
120 PlanSpline(
121 std::bind(&AutonomousSplines::TargetAligned3, &auto_splines_,
122 std::placeholders::_1, alliance_),
123 SplineDirection::kForward)};
124 starting_position_ =
125 target_aligned_splines_.value()[0].starting_position();
126 CHECK(starting_position_);
127 }
James Kuszmaul99af8b52021-03-28 10:50:15 -0700128 }
James Kuszmaulead4da62021-10-24 17:36:54 -0700129
130 is_planned_ = true;
131
James Kuszmaul4303a5d2021-10-23 19:58:48 -0700132 MaybeSendStartingPosition();
milind upadhyay47a0ab32020-11-25 19:34:41 -0800133}
Stephan Massaltd021f972020-01-05 20:41:23 -0800134
135void AutonomousActor::Reset() {
136 InitializeEncoders();
137 ResetDrivetrain();
milind upadhyayb2e840a2021-03-27 13:54:49 -0700138 RetractIntake();
James Kuszmaul5f6d1d42020-03-01 18:10:07 -0800139
James Kuszmaulddd2ba62020-03-08 22:17:13 -0700140 joystick_state_fetcher_.Fetch();
141 CHECK(joystick_state_fetcher_.get() != nullptr)
142 << "Expect at least one JoystickState message before running auto...";
143 alliance_ = joystick_state_fetcher_->alliance();
Stephan Massaltd021f972020-01-05 20:41:23 -0800144}
145
146bool AutonomousActor::RunAction(
Austin Schuh6fb0a6d2021-01-23 15:43:17 -0800147 const ::frc971::autonomous::AutonomousActionParams *params) {
Stephan Massaltd021f972020-01-05 20:41:23 -0800148 Reset();
James Kuszmaul4303a5d2021-10-23 19:58:48 -0700149 if (!user_indicated_safe_to_reset_) {
150 AOS_LOG(WARNING, "Didn't send starting position prior to starting auto.");
milind-u0e203782021-10-30 21:57:20 -0700151 CHECK(starting_position_);
James Kuszmaul4303a5d2021-10-23 19:58:48 -0700152 SendStartingPosition(starting_position_.value());
153 }
James Kuszmaulead4da62021-10-24 17:36:54 -0700154 // Clear this so that we don't accidentally resend things as soon as we replan
155 // later.
156 user_indicated_safe_to_reset_ = false;
157 is_planned_ = false;
158 starting_position_.reset();
James Kuszmaul99af8b52021-03-28 10:50:15 -0700159
milind upadhyay47a0ab32020-11-25 19:34:41 -0800160 AOS_LOG(INFO, "Params are %d\n", params->mode());
James Kuszmaulddd2ba62020-03-08 22:17:13 -0700161 if (alliance_ == aos::Alliance::kInvalid) {
162 AOS_LOG(INFO, "Aborting autonomous due to invalid alliance selection.");
163 return false;
164 }
Austin Schuhd0e9e062021-10-24 17:40:58 -0700165 if (FLAGS_spline_auto) {
166 SplineAuto();
milind upadhyay47a0ab32020-11-25 19:34:41 -0800167 } else {
Austin Schuh3653cf22021-11-12 11:54:51 -0800168 if (practice_robot_) {
169 Fender();
170 } else {
171 TargetAligned();
172 }
milind upadhyay47a0ab32020-11-25 19:34:41 -0800173 }
Austin Schuh3653cf22021-11-12 11:54:51 -0800174
milind upadhyay47a0ab32020-11-25 19:34:41 -0800175 return true;
176}
Stephan Massaltd021f972020-01-05 20:41:23 -0800177
James Kuszmaul99af8b52021-03-28 10:50:15 -0700178void AutonomousActor::SendStartingPosition(const Eigen::Vector3d &start) {
kyle96c406e2021-02-27 14:07:22 -0800179 // Set up the starting position for the blue alliance.
kyle96c406e2021-02-27 14:07:22 -0800180
181 // TODO(james): Resetting the localizer breaks the left/right statespace
182 // controller. That is a bug, but we can fix that later by not resetting.
183 auto builder = localizer_control_sender_.MakeBuilder();
184
185 LocalizerControl::Builder localizer_control_builder =
186 builder.MakeBuilder<LocalizerControl>();
James Kuszmaul99af8b52021-03-28 10:50:15 -0700187 localizer_control_builder.add_x(start(0));
188 localizer_control_builder.add_y(start(1));
189 localizer_control_builder.add_theta(start(2));
kyle96c406e2021-02-27 14:07:22 -0800190 localizer_control_builder.add_theta_uncertainty(0.00001);
milind-u0e203782021-10-30 21:57:20 -0700191 LOG(INFO) << "User button pressed, x: " << start(0) << " y: " << start(1)
192 << " theta: " << start(2);
milind1f1dca32021-07-03 13:50:07 -0700193 if (builder.Send(localizer_control_builder.Finish()) !=
194 aos::RawSender::Error::kOk) {
kyle96c406e2021-02-27 14:07:22 -0800195 AOS_LOG(ERROR, "Failed to reset localizer.\n");
196 }
197}
198
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700199void AutonomousActor::TargetAligned() {
Austin Schuhd0e9e062021-10-24 17:40:58 -0700200 aos::monotonic_clock::time_point start_time = aos::monotonic_clock::now();
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700201 CHECK(target_aligned_splines_);
202 auto &splines = *target_aligned_splines_;
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700203
Austin Schuhd0e9e062021-10-24 17:40:58 -0700204 // Spin up.
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700205 set_shooting(true);
milind-u0e203782021-10-30 21:57:20 -0700206 set_preloading(true);
207 set_shooter_tracking(true);
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700208 SendSuperstructureGoal();
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700209 if (!WaitForBallsShot(3)) return;
milind-u0e203782021-10-30 21:57:20 -0700210 LOG(INFO) << "Shot balls";
211 set_shooter_tracking(false);
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700212
milind-u0e203782021-10-30 21:57:20 -0700213 // Drive and intake 3 balls in front of the trench run
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700214 set_shooting(false);
Austin Schuhd0e9e062021-10-24 17:40:58 -0700215 ExtendIntake();
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700216 SendSuperstructureGoal();
217
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700218 if (!splines[0].WaitForPlan()) return;
219 splines[0].Start();
220
221 if (!splines[0].WaitForSplineDistanceRemaining(0.02)) return;
milind-u0e203782021-10-30 21:57:20 -0700222
Austin Schuhd0e9e062021-10-24 17:40:58 -0700223 std::this_thread::sleep_for(chrono::milliseconds(200));
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700224 RetractIntake();
225
milind-u0e203782021-10-30 21:57:20 -0700226 // Drive back to shooting position
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700227 if (!splines[1].WaitForPlan()) return;
228 splines[1].Start();
229
Austin Schuhd0e9e062021-10-24 17:40:58 -0700230 if (!splines[1].WaitForSplineDistanceRemaining(2.0)) return;
231 // Reverse the rollers for a moment to try to unjam any jammed balls. Since
232 // we are moving here, this is free to try.
233 set_roller_voltage(-12.0);
234 std::this_thread::sleep_for(chrono::milliseconds(300));
235 set_roller_voltage(0.0);
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700236
Austin Schuhd0e9e062021-10-24 17:40:58 -0700237 // Once we come to a stop, give the robot a moment to settle down. This makes
238 // the shot more accurate.
239 if (!splines[1].WaitForSplineDistanceRemaining(0.02)) return;
milind-u0e203782021-10-30 21:57:20 -0700240 set_shooter_tracking(true);
Austin Schuhd0e9e062021-10-24 17:40:58 -0700241 std::this_thread::sleep_for(chrono::milliseconds(1500));
242 set_shooting(true);
243 const int balls = Balls();
244
245 SendSuperstructureGoal();
246
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700247 SendSuperstructureGoal();
248
Austin Schuhd0e9e062021-10-24 17:40:58 -0700249 if (!WaitUntilAbsoluteBallsShot(3 + balls)) return;
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700250
milind-u0e203782021-10-30 21:57:20 -0700251 set_shooting(false);
252 set_roller_voltage(0.0);
253 set_shooter_tracking(false);
254 set_preloading(false);
255 SendSuperstructureGoal();
256
257 // Drive close to the rendezvous point in the center of the field so that the
258 // driver can intake balls there right after auto ends.
259 if (!splines[2].WaitForPlan()) return;
260 splines[2].Start();
261
262 if (!splines[2].WaitForSplineDistanceRemaining(0.02)) return;
263
Austin Schuhd0e9e062021-10-24 17:40:58 -0700264 LOG(INFO) << "Took "
265 << chrono::duration<double>(aos::monotonic_clock::now() -
266 start_time)
267 .count();
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700268}
269
Austin Schuh3653cf22021-11-12 11:54:51 -0800270void AutonomousActor::Fender() {
271 aos::monotonic_clock::time_point start_time = aos::monotonic_clock::now();
272 CHECK(fender_splines_);
273 auto &splines = *fender_splines_;
274
275 // Spin up.
276 set_shooting(false);
277 set_preloading(true);
278 set_shooter_tracking(false);
279 SendSuperstructureGoal();
280
281 if (!splines[0].WaitForPlan()) return;
282 splines[0].Start();
283
284 if (!splines[0].WaitForSplineDistanceRemaining(0.02)) return;
285
286 SendSuperstructureGoal();
287 std::this_thread::sleep_for(chrono::milliseconds(500));
288 ApplyThrottle(0.2);
289 set_shooting(true);
290 SendSuperstructureGoal();
291 LOG(INFO) << "Took "
292 << chrono::duration<double>(aos::monotonic_clock::now() -
293 start_time)
294 .count();
295}
296
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700297void AutonomousActor::JustShoot() {
298 // shoot pre-loaded balls
299 set_shooter_tracking(true);
300 set_shooting(true);
301 SendSuperstructureGoal();
302
303 if (!WaitForBallsShot(3)) return;
304
305 set_shooting(false);
306 set_shooter_tracking(true);
307 SendSuperstructureGoal();
308}
309
310void AutonomousActor::TargetOffset() {
311 CHECK(target_offset_splines_);
312 auto &splines = *target_offset_splines_;
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700313
314 // spin up shooter
315 set_shooter_tracking(true);
316 SendSuperstructureGoal();
317 ExtendIntake();
318
319 // pickup 2 more balls in front of the trench run
320 if (!splines[0].WaitForPlan()) return;
321 splines[0].Start();
322
323 if (!splines[0].WaitForSplineDistanceRemaining(0.02)) return;
324 RetractIntake();
325
326 if (!splines[1].WaitForPlan()) return;
327 splines[1].Start();
328
329 if (!splines[1].WaitForSplineDistanceRemaining(0.02)) return;
330
331 // shoot the balls from in front of the goal.
332 set_shooting(true);
333 SendSuperstructureGoal();
334
335 if (!WaitForBallsShot(5)) return;
336
337 set_shooting(false);
338 set_shooter_tracking(false);
339 SendSuperstructureGoal();
340}
341
milind upadhyay47a0ab32020-11-25 19:34:41 -0800342void AutonomousActor::SplineAuto() {
James Kuszmaul99af8b52021-03-28 10:50:15 -0700343 CHECK(test_spline_);
James Kuszmaul5f6d1d42020-03-01 18:10:07 -0800344
James Kuszmaul99af8b52021-03-28 10:50:15 -0700345 if (!test_spline_->WaitForPlan()) return;
346 test_spline_->Start();
Stephan Massaltd021f972020-01-05 20:41:23 -0800347
James Kuszmaul99af8b52021-03-28 10:50:15 -0700348 if (!test_spline_->WaitForSplineDistanceRemaining(0.02)) return;
kyle96c406e2021-02-27 14:07:22 -0800349}
350
milind upadhyay47a0ab32020-11-25 19:34:41 -0800351ProfileParametersT MakeProfileParametersT(const float max_velocity,
352 const float max_acceleration) {
353 ProfileParametersT params;
354 params.max_velocity = max_velocity;
355 params.max_acceleration = max_acceleration;
356 return params;
357}
358
359bool AutonomousActor::DriveFwd() {
Austin Schuhfd1715f2021-01-30 16:58:24 -0800360 const ProfileParametersT kDrive = MakeProfileParametersT(0.3f, 1.0f);
milind upadhyay47a0ab32020-11-25 19:34:41 -0800361 const ProfileParametersT kTurn = MakeProfileParametersT(5.0f, 15.0f);
Austin Schuhfd1715f2021-01-30 16:58:24 -0800362 StartDrive(1.0, 0.0, kDrive, kTurn);
milind upadhyay47a0ab32020-11-25 19:34:41 -0800363 return WaitForDriveDone();
364}
Sabina Leavera0b43b42021-03-03 20:30:04 -0800365
366void AutonomousActor::SendSuperstructureGoal() {
Sabina Leavera0b43b42021-03-03 20:30:04 -0800367 auto builder = superstructure_goal_sender_.MakeBuilder();
368
369 flatbuffers::Offset<StaticZeroingSingleDOFProfiledSubsystemGoal>
370 intake_offset;
milind upadhyayb9dec712021-03-20 15:47:51 -0700371
Sabina Leavera0b43b42021-03-03 20:30:04 -0800372 {
373 StaticZeroingSingleDOFProfiledSubsystemGoal::Builder intake_builder =
374 builder.MakeBuilder<StaticZeroingSingleDOFProfiledSubsystemGoal>();
375
milind upadhyayb9dec712021-03-20 15:47:51 -0700376 frc971::ProfileParameters::Builder profile_params_builder =
Sabina Leavera0b43b42021-03-03 20:30:04 -0800377 builder.MakeBuilder<frc971::ProfileParameters>();
Austin Schuhb39a21c2021-03-31 20:12:18 -0700378 profile_params_builder.add_max_velocity(20.0);
379 profile_params_builder.add_max_acceleration(60.0);
milind upadhyayb9dec712021-03-20 15:47:51 -0700380 flatbuffers::Offset<frc971::ProfileParameters> profile_params_offset =
Sabina Leavera0b43b42021-03-03 20:30:04 -0800381 profile_params_builder.Finish();
382 intake_builder.add_unsafe_goal(intake_goal_);
383 intake_builder.add_profile_params(profile_params_offset);
384 intake_offset = intake_builder.Finish();
385 }
386
Austin Schuh3653cf22021-11-12 11:54:51 -0800387 flatbuffers::Offset<superstructure::ShooterGoal> shooter_offset =
388 superstructure::CreateShooterGoal(*builder.fbb(), 400.0, 200.0);
389
Sabina Leavera0b43b42021-03-03 20:30:04 -0800390 superstructure::Goal::Builder superstructure_builder =
Tyler Chatowbf0609c2021-07-31 16:13:27 -0700391 builder.MakeBuilder<superstructure::Goal>();
milind upadhyayb9dec712021-03-20 15:47:51 -0700392
Sabina Leavera0b43b42021-03-03 20:30:04 -0800393 superstructure_builder.add_intake(intake_offset);
milind-u0e203782021-10-30 21:57:20 -0700394 superstructure_builder.add_intake_preloading(preloading_);
Austin Schuh3653cf22021-11-12 11:54:51 -0800395 if (!shooter_tracking_ && shooting_) {
396 superstructure_builder.add_shooter(shooter_offset);
397 }
Sabina Leavera0b43b42021-03-03 20:30:04 -0800398 superstructure_builder.add_roller_voltage(roller_voltage_);
Tyler Chatowbf0609c2021-07-31 16:13:27 -0700399 superstructure_builder.add_roller_speed_compensation(
400 kRollerSpeedCompensation);
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700401 superstructure_builder.add_hood_tracking(shooter_tracking_);
402 superstructure_builder.add_turret_tracking(shooter_tracking_);
403 superstructure_builder.add_shooter_tracking(shooter_tracking_);
404 superstructure_builder.add_shooting(shooting_);
Sabina Leavera0b43b42021-03-03 20:30:04 -0800405
milind1f1dca32021-07-03 13:50:07 -0700406 if (builder.Send(superstructure_builder.Finish()) !=
407 aos::RawSender::Error::kOk) {
Sabina Leavera0b43b42021-03-03 20:30:04 -0800408 AOS_LOG(ERROR, "Sending superstructure goal failed.\n");
409 }
Sabina Leavera0b43b42021-03-03 20:30:04 -0800410}
milind upadhyay5e589d72021-03-27 13:47:18 -0700411
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700412void AutonomousActor::ExtendIntake() {
Austin Schuhd0e9e062021-10-24 17:40:58 -0700413 set_intake_goal(1.30);
414 set_roller_voltage(6.0);
Ravago Jonesa7b3c822021-08-26 12:36:03 -0700415 SendSuperstructureGoal();
416}
417
milind upadhyay5e589d72021-03-27 13:47:18 -0700418void AutonomousActor::RetractIntake() {
419 set_intake_goal(-0.89);
Austin Schuhd0e9e062021-10-24 17:40:58 -0700420 set_roller_voltage(6.0);
milind upadhyay5e589d72021-03-27 13:47:18 -0700421 SendSuperstructureGoal();
422}
423
Austin Schuhd0e9e062021-10-24 17:40:58 -0700424int AutonomousActor::Balls() {
Ravago Jones1f32d622021-08-26 12:20:36 -0700425 superstructure_status_fetcher_.Fetch();
426 CHECK(superstructure_status_fetcher_.get() != nullptr);
Austin Schuhd0e9e062021-10-24 17:40:58 -0700427 return superstructure_status_fetcher_->shooter()->balls_shot();
428}
Ravago Jones1f32d622021-08-26 12:20:36 -0700429
Austin Schuhd0e9e062021-10-24 17:40:58 -0700430bool AutonomousActor::WaitUntilAbsoluteBallsShot(int absolute_balls) {
Ravago Jones1f32d622021-08-26 12:20:36 -0700431 ::aos::time::PhasedLoop phased_loop(frc971::controls::kLoopFrequency,
432 event_loop()->monotonic_now(),
Yash Chainania6fe97b2021-12-15 21:01:11 -0800433 ActorBase::kLoopOffset);
milind-u0e203782021-10-30 21:57:20 -0700434 superstructure_status_fetcher_.Fetch();
435 CHECK(superstructure_status_fetcher_.get() != nullptr);
436 int last_balls = superstructure_status_fetcher_->shooter()->balls_shot();
437 LOG(INFO) << "Waiting for balls, started with " << absolute_balls;
Ravago Jones1f32d622021-08-26 12:20:36 -0700438 while (true) {
439 if (ShouldCancel()) {
440 return false;
441 }
442 phased_loop.SleepUntilNext();
443 superstructure_status_fetcher_.Fetch();
Austin Schuhd0e9e062021-10-24 17:40:58 -0700444 CHECK(superstructure_status_fetcher_.get() != nullptr);
milind-u0e203782021-10-30 21:57:20 -0700445 if (superstructure_status_fetcher_->shooter()->balls_shot() != last_balls) {
446 LOG(INFO) << "Shot "
447 << superstructure_status_fetcher_->shooter()->balls_shot() -
448 last_balls
449 << " balls, now at "
450 << superstructure_status_fetcher_->shooter()->balls_shot();
451 }
Austin Schuhd0e9e062021-10-24 17:40:58 -0700452 if (superstructure_status_fetcher_->shooter()->balls_shot() >=
453 absolute_balls) {
Ravago Jones1f32d622021-08-26 12:20:36 -0700454 return true;
455 }
milind-u0e203782021-10-30 21:57:20 -0700456
457 last_balls = superstructure_status_fetcher_->shooter()->balls_shot();
Ravago Jones1f32d622021-08-26 12:20:36 -0700458 }
459}
460
Austin Schuhd0e9e062021-10-24 17:40:58 -0700461bool AutonomousActor::WaitForBallsShot(int num_wanted) {
462 return WaitUntilAbsoluteBallsShot(Balls() + num_wanted);
463}
464
Stephan Massaltd021f972020-01-05 20:41:23 -0800465} // namespace actors
466} // namespace y2020