blob: fdf7ada70b81951ffafc69ff670a351000ce5ecc [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"
11#include "y2020/control_loops/drivetrain/drivetrain_base.h"
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080012#include "y2020/actors/auto_splines.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()),
27 localizer_control_sender_(event_loop->MakeSender<
28 ::frc971::control_loops::drivetrain::LocalizerControl>(
James Kuszmaulddd2ba62020-03-08 22:17:13 -070029 "/drivetrain")),
30 joystick_state_fetcher_(
milind upadhyay47a0ab32020-11-25 19:34:41 -080031 event_loop->MakeFetcher<aos::JoystickState>("/aos")) {
32 set_max_drivetrain_voltage(2.0);
33}
Stephan Massaltd021f972020-01-05 20:41:23 -080034
35void AutonomousActor::Reset() {
36 InitializeEncoders();
37 ResetDrivetrain();
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080038
James Kuszmaulddd2ba62020-03-08 22:17:13 -070039 joystick_state_fetcher_.Fetch();
40 CHECK(joystick_state_fetcher_.get() != nullptr)
41 << "Expect at least one JoystickState message before running auto...";
42 alliance_ = joystick_state_fetcher_->alliance();
43 // Set up the starting position for the blue alliance.
44 // Currently just arbitrarily chosen for testing purposes, such that the
45 // robot starts on the side of the field nearest where it would score
46 // (although I do not know if this is actually a legal starting position).
Austin Schuhfd1715f2021-01-30 16:58:24 -080047 Eigen::Vector2d starting_position(0.0, 0.0);
James Kuszmaulddd2ba62020-03-08 22:17:13 -070048 double starting_heading = 0.0;
49 if (alliance_ == aos::Alliance::kRed) {
50 starting_position *= -1.0;
51 starting_heading = aos::math::NormalizeAngle(starting_heading + M_PI);
52 }
Austin Schuh6fb0a6d2021-01-23 15:43:17 -080053 if (FLAGS_spline_auto) {
54 // TODO(james): Resetting the localizer breaks the left/right statespace
55 // controller. That is a bug, but we can fix that later by not resetting.
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080056 auto builder = localizer_control_sender_.MakeBuilder();
57
58 LocalizerControl::Builder localizer_control_builder =
59 builder.MakeBuilder<LocalizerControl>();
James Kuszmaulddd2ba62020-03-08 22:17:13 -070060 localizer_control_builder.add_x(starting_position.x());
61 localizer_control_builder.add_y(starting_position.y());
62 localizer_control_builder.add_theta(starting_heading);
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080063 localizer_control_builder.add_theta_uncertainty(0.00001);
64 if (!builder.Send(localizer_control_builder.Finish())) {
65 AOS_LOG(ERROR, "Failed to reset localizer.\n");
66 }
67 }
Stephan Massaltd021f972020-01-05 20:41:23 -080068}
69
70bool AutonomousActor::RunAction(
Austin Schuh6fb0a6d2021-01-23 15:43:17 -080071 const ::frc971::autonomous::AutonomousActionParams *params) {
Stephan Massaltd021f972020-01-05 20:41:23 -080072 Reset();
milind upadhyay47a0ab32020-11-25 19:34:41 -080073 AOS_LOG(INFO, "Params are %d\n", params->mode());
James Kuszmaulddd2ba62020-03-08 22:17:13 -070074 if (alliance_ == aos::Alliance::kInvalid) {
75 AOS_LOG(INFO, "Aborting autonomous due to invalid alliance selection.");
76 return false;
77 }
milind upadhyay47a0ab32020-11-25 19:34:41 -080078 if (FLAGS_spline_auto) {
79 SplineAuto();
80 } else {
81 return DriveFwd();
82 }
83 return true;
84}
Stephan Massaltd021f972020-01-05 20:41:23 -080085
milind upadhyay47a0ab32020-11-25 19:34:41 -080086void AutonomousActor::SplineAuto() {
James Kuszmaulddd2ba62020-03-08 22:17:13 -070087 SplineHandle spline1 = PlanSpline(std::bind(AutonomousSplines::BasicSSpline,
88 std::placeholders::_1, alliance_),
89 SplineDirection::kForward);
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080090
milind upadhyay47a0ab32020-11-25 19:34:41 -080091 if (!spline1.WaitForPlan()) return;
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080092 spline1.Start();
93
milind upadhyay47a0ab32020-11-25 19:34:41 -080094 if (!spline1.WaitForSplineDistanceRemaining(0.02)) return;
Stephan Massaltd021f972020-01-05 20:41:23 -080095}
96
milind upadhyay47a0ab32020-11-25 19:34:41 -080097ProfileParametersT MakeProfileParametersT(const float max_velocity,
98 const float max_acceleration) {
99 ProfileParametersT params;
100 params.max_velocity = max_velocity;
101 params.max_acceleration = max_acceleration;
102 return params;
103}
104
105bool AutonomousActor::DriveFwd() {
Austin Schuhfd1715f2021-01-30 16:58:24 -0800106 const ProfileParametersT kDrive = MakeProfileParametersT(0.3f, 1.0f);
milind upadhyay47a0ab32020-11-25 19:34:41 -0800107 const ProfileParametersT kTurn = MakeProfileParametersT(5.0f, 15.0f);
Austin Schuhfd1715f2021-01-30 16:58:24 -0800108 StartDrive(1.0, 0.0, kDrive, kTurn);
milind upadhyay47a0ab32020-11-25 19:34:41 -0800109 return WaitForDriveDone();
110}
Stephan Massaltd021f972020-01-05 20:41:23 -0800111} // namespace actors
112} // namespace y2020