blob: 0b2b9c67dc57afa25c2cdc0be09777708ff96ae0 [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
14namespace y2020 {
15namespace actors {
16
17using ::aos::monotonic_clock;
18using ::frc971::ProfileParametersT;
19using frc971::control_loops::drivetrain::LocalizerControl;
20namespace chrono = ::std::chrono;
21
22AutonomousActor::AutonomousActor(::aos::EventLoop *event_loop)
23 : frc971::autonomous::BaseAutonomousActor(
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080024 event_loop, control_loops::drivetrain::GetDrivetrainConfig()),
25 localizer_control_sender_(event_loop->MakeSender<
26 ::frc971::control_loops::drivetrain::LocalizerControl>(
James Kuszmaulddd2ba62020-03-08 22:17:13 -070027 "/drivetrain")),
28 joystick_state_fetcher_(
29 event_loop->MakeFetcher<aos::JoystickState>("/aos")) {}
Stephan Massaltd021f972020-01-05 20:41:23 -080030
31void AutonomousActor::Reset() {
32 InitializeEncoders();
33 ResetDrivetrain();
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080034
James Kuszmaulddd2ba62020-03-08 22:17:13 -070035 joystick_state_fetcher_.Fetch();
36 CHECK(joystick_state_fetcher_.get() != nullptr)
37 << "Expect at least one JoystickState message before running auto...";
38 alliance_ = joystick_state_fetcher_->alliance();
39 // Set up the starting position for the blue alliance.
40 // Currently just arbitrarily chosen for testing purposes, such that the
41 // robot starts on the side of the field nearest where it would score
42 // (although I do not know if this is actually a legal starting position).
43 Eigen::Vector2d starting_position(3.3, -0.7);
44 double starting_heading = 0.0;
45 if (alliance_ == aos::Alliance::kRed) {
46 starting_position *= -1.0;
47 starting_heading = aos::math::NormalizeAngle(starting_heading + M_PI);
48 }
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080049 {
50 auto builder = localizer_control_sender_.MakeBuilder();
51
52 LocalizerControl::Builder localizer_control_builder =
53 builder.MakeBuilder<LocalizerControl>();
James Kuszmaulddd2ba62020-03-08 22:17:13 -070054 localizer_control_builder.add_x(starting_position.x());
55 localizer_control_builder.add_y(starting_position.y());
56 localizer_control_builder.add_theta(starting_heading);
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080057 localizer_control_builder.add_theta_uncertainty(0.00001);
58 if (!builder.Send(localizer_control_builder.Finish())) {
59 AOS_LOG(ERROR, "Failed to reset localizer.\n");
60 }
61 }
Stephan Massaltd021f972020-01-05 20:41:23 -080062}
63
64bool AutonomousActor::RunAction(
65 const ::frc971::autonomous::AutonomousActionParams *params) {
66 Reset();
James Kuszmaulddd2ba62020-03-08 22:17:13 -070067 if (alliance_ == aos::Alliance::kInvalid) {
68 AOS_LOG(INFO, "Aborting autonomous due to invalid alliance selection.");
69 return false;
70 }
Stephan Massaltd021f972020-01-05 20:41:23 -080071
James Kuszmaulddd2ba62020-03-08 22:17:13 -070072 SplineHandle spline1 = PlanSpline(std::bind(AutonomousSplines::BasicSSpline,
73 std::placeholders::_1, alliance_),
74 SplineDirection::kForward);
James Kuszmaul5f6d1d42020-03-01 18:10:07 -080075
76 if (!spline1.WaitForPlan()) return true;
77 spline1.Start();
78
79 if (!spline1.WaitForSplineDistanceRemaining(0.02)) return true;
80
Stephan Massaltd021f972020-01-05 20:41:23 -080081 AOS_LOG(INFO, "Params are %d\n", params->mode());
82 return true;
83}
84
85} // namespace actors
86} // namespace y2020