blob: 752ba95758724cce216fb12c19e1437f7be9df2c [file] [log] [blame]
Stephan Massaltd021f972020-01-05 20:41:23 -08001#include "y2020/actors/autonomous_actor.h"
2
3#include <inttypes.h>
4
5#include <chrono>
6#include <cmath>
7
8#include "aos/logging/logging.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"
Ravago Jonesc2a08022021-02-06 17:40:54 -080012#include "y2020/control_loops/drivetrain/drivetrain_base.h"
Stephan Massaltd021f972020-01-05 20:41:23 -080013
Austin Schuhfd1715f2021-01-30 16:58:24 -080014DEFINE_bool(spline_auto, true, "If true, define a spline autonomous mode");
milind upadhyay47a0ab32020-11-25 19:34:41 -080015
Stephan Massaltd021f972020-01-05 20:41:23 -080016namespace y2020 {
17namespace actors {
18
19using ::aos::monotonic_clock;
20using ::frc971::ProfileParametersT;
21using frc971::control_loops::drivetrain::LocalizerControl;
22namespace chrono = ::std::chrono;
23
24AutonomousActor::AutonomousActor(::aos::EventLoop *event_loop)
25 : frc971::autonomous::BaseAutonomousActor(
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080026 event_loop, control_loops::drivetrain::GetDrivetrainConfig()),
Ravago Jonesc2a08022021-02-06 17:40:54 -080027 localizer_control_sender_(
28 event_loop->MakeSender<
29 ::frc971::control_loops::drivetrain::LocalizerControl>(
30 "/drivetrain")),
James Kuszmaulddd2ba62020-03-08 22:17:13 -070031 joystick_state_fetcher_(
Ravago Jonesc2a08022021-02-06 17:40:54 -080032 event_loop->MakeFetcher<aos::JoystickState>("/aos")),
33 auto_splines_() {
milind upadhyay47a0ab32020-11-25 19:34:41 -080034 set_max_drivetrain_voltage(2.0);
35}
Stephan Massaltd021f972020-01-05 20:41:23 -080036
37void AutonomousActor::Reset() {
38 InitializeEncoders();
39 ResetDrivetrain();
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080040
James Kuszmaulddd2ba62020-03-08 22:17:13 -070041 joystick_state_fetcher_.Fetch();
42 CHECK(joystick_state_fetcher_.get() != nullptr)
43 << "Expect at least one JoystickState message before running auto...";
44 alliance_ = joystick_state_fetcher_->alliance();
45 // Set up the starting position for the blue alliance.
46 // Currently just arbitrarily chosen for testing purposes, such that the
47 // robot starts on the side of the field nearest where it would score
48 // (although I do not know if this is actually a legal starting position).
Austin Schuhfd1715f2021-01-30 16:58:24 -080049 Eigen::Vector2d starting_position(0.0, 0.0);
James Kuszmaulddd2ba62020-03-08 22:17:13 -070050 double starting_heading = 0.0;
51 if (alliance_ == aos::Alliance::kRed) {
52 starting_position *= -1.0;
53 starting_heading = aos::math::NormalizeAngle(starting_heading + M_PI);
54 }
Austin Schuh6fb0a6d2021-01-23 15:43:17 -080055 if (FLAGS_spline_auto) {
56 // TODO(james): Resetting the localizer breaks the left/right statespace
57 // controller. That is a bug, but we can fix that later by not resetting.
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080058 auto builder = localizer_control_sender_.MakeBuilder();
59
60 LocalizerControl::Builder localizer_control_builder =
61 builder.MakeBuilder<LocalizerControl>();
James Kuszmaulddd2ba62020-03-08 22:17:13 -070062 localizer_control_builder.add_x(starting_position.x());
63 localizer_control_builder.add_y(starting_position.y());
64 localizer_control_builder.add_theta(starting_heading);
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080065 localizer_control_builder.add_theta_uncertainty(0.00001);
66 if (!builder.Send(localizer_control_builder.Finish())) {
67 AOS_LOG(ERROR, "Failed to reset localizer.\n");
68 }
69 }
Stephan Massaltd021f972020-01-05 20:41:23 -080070}
71
72bool AutonomousActor::RunAction(
Austin Schuh6fb0a6d2021-01-23 15:43:17 -080073 const ::frc971::autonomous::AutonomousActionParams *params) {
Stephan Massaltd021f972020-01-05 20:41:23 -080074 Reset();
milind upadhyay47a0ab32020-11-25 19:34:41 -080075 AOS_LOG(INFO, "Params are %d\n", params->mode());
James Kuszmaulddd2ba62020-03-08 22:17:13 -070076 if (alliance_ == aos::Alliance::kInvalid) {
77 AOS_LOG(INFO, "Aborting autonomous due to invalid alliance selection.");
78 return false;
79 }
milind upadhyay47a0ab32020-11-25 19:34:41 -080080 if (FLAGS_spline_auto) {
81 SplineAuto();
82 } else {
83 return DriveFwd();
84 }
85 return true;
86}
Stephan Massaltd021f972020-01-05 20:41:23 -080087
milind upadhyay47a0ab32020-11-25 19:34:41 -080088void AutonomousActor::SplineAuto() {
Ravago Jonesc2a08022021-02-06 17:40:54 -080089 SplineHandle spline1 = PlanSpline(
90 [this](aos::Sender<frc971::control_loops::drivetrain::Goal>::Builder
91 *builder) { return auto_splines_.TestSpline(builder); },
92 SplineDirection::kForward);
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080093
milind upadhyay47a0ab32020-11-25 19:34:41 -080094 if (!spline1.WaitForPlan()) return;
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080095 spline1.Start();
96
milind upadhyay47a0ab32020-11-25 19:34:41 -080097 if (!spline1.WaitForSplineDistanceRemaining(0.02)) return;
Stephan Massaltd021f972020-01-05 20:41:23 -080098}
99
milind upadhyay47a0ab32020-11-25 19:34:41 -0800100ProfileParametersT MakeProfileParametersT(const float max_velocity,
101 const float max_acceleration) {
102 ProfileParametersT params;
103 params.max_velocity = max_velocity;
104 params.max_acceleration = max_acceleration;
105 return params;
106}
107
108bool AutonomousActor::DriveFwd() {
Austin Schuhfd1715f2021-01-30 16:58:24 -0800109 const ProfileParametersT kDrive = MakeProfileParametersT(0.3f, 1.0f);
milind upadhyay47a0ab32020-11-25 19:34:41 -0800110 const ProfileParametersT kTurn = MakeProfileParametersT(5.0f, 15.0f);
Austin Schuhfd1715f2021-01-30 16:58:24 -0800111 StartDrive(1.0, 0.0, kDrive, kTurn);
milind upadhyay47a0ab32020-11-25 19:34:41 -0800112 return WaitForDriveDone();
113}
Stephan Massaltd021f972020-01-05 20:41:23 -0800114} // namespace actors
115} // namespace y2020