blob: e1cfddc7c4dda83731f716e7049cb84cd849985e [file] [log] [blame]
Austin Schuh80ff2e12014-03-08 12:06:19 -08001#include <stdio.h>
2
3#include <memory>
Austin Schuh47017412013-03-10 11:50:46 -07004
Brian3afd6fc2014-04-02 20:41:49 -07005#include "aos/common/util/phased_loop.h"
Austin Schuh47017412013-03-10 11:50:46 -07006#include "aos/common/time.h"
Austin Schuh6be011a2013-03-19 10:07:02 +00007#include "aos/common/util/trapezoid_profile.h"
Brian Silverman598800f2013-05-09 17:08:42 -07008#include "aos/common/logging/logging.h"
Brian Silverman6f621542014-04-06 16:00:41 -07009#include "aos/common/logging/queue_logging.h"
Brian Silverman598800f2013-05-09 17:08:42 -070010
11#include "frc971/autonomous/auto.q.h"
Austin Schuh6be011a2013-03-19 10:07:02 +000012#include "frc971/constants.h"
13#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Austin Schuh80ff2e12014-03-08 12:06:19 -080014#include "frc971/actions/action_client.h"
Austin Schuh80ff2e12014-03-08 12:06:19 -080015#include "frc971/actions/drivetrain_action.h"
Austin Schuh47017412013-03-10 11:50:46 -070016
17using ::aos::time::Time;
18
19namespace frc971 {
20namespace autonomous {
21
Austin Schuh80ff2e12014-03-08 12:06:19 -080022namespace time = ::aos::time;
23
Brian Silverman3b89ed82013-03-22 18:59:16 -070024static double left_initial_position, right_initial_position;
25
Austin Schuh6be011a2013-03-19 10:07:02 +000026bool ShouldExitAuto() {
27 ::frc971::autonomous::autonomous.FetchLatest();
28 bool ans = !::frc971::autonomous::autonomous->run_auto;
29 if (ans) {
30 LOG(INFO, "Time to exit auto mode\n");
31 }
32 return ans;
33}
34
Austin Schuh6be011a2013-03-19 10:07:02 +000035void StopDrivetrain() {
36 LOG(INFO, "Stopping the drivetrain\n");
Austin Schuh47017412013-03-10 11:50:46 -070037 control_loops::drivetrain.goal.MakeWithBuilder()
Brian Silverman3b89ed82013-03-22 18:59:16 -070038 .control_loop_driving(true)
Brian Silvermance86bac2013-03-31 19:07:24 -070039 .left_goal(left_initial_position)
40 .left_velocity_goal(0)
41 .right_goal(right_initial_position)
42 .right_velocity_goal(0)
43 .quickturn(false)
44 .Send();
45}
46
47void ResetDrivetrain() {
48 LOG(INFO, "resetting the drivetrain\n");
49 control_loops::drivetrain.goal.MakeWithBuilder()
50 .control_loop_driving(false)
Brian Silverman93335ae2015-01-26 20:43:39 -050051 //.highgear(false)
Austin Schuh6be011a2013-03-19 10:07:02 +000052 .steering(0.0)
53 .throttle(0.0)
Brian Silverman38ea9bf2014-04-19 22:57:54 -070054 .left_goal(left_initial_position)
55 .left_velocity_goal(0)
56 .right_goal(right_initial_position)
57 .right_velocity_goal(0)
Austin Schuh6be011a2013-03-19 10:07:02 +000058 .Send();
59}
60
Brian Silverman3b89ed82013-03-22 18:59:16 -070061void DriveSpin(double radians) {
62 LOG(INFO, "going to spin %f\n", radians);
63
64 ::aos::util::TrapezoidProfile profile(::aos::time::Time::InMS(10));
65 ::Eigen::Matrix<double, 2, 1> driveTrainState;
66 const double goal_velocity = 0.0;
67 const double epsilon = 0.01;
Brian Silverman13be6682013-03-22 21:02:07 -070068 // in drivetrain "meters"
Brian Silverman3b89ed82013-03-22 18:59:16 -070069 const double kRobotWidth = 0.4544;
70
Brian Silverman7992d6e2013-03-24 19:20:54 -070071 profile.set_maximum_acceleration(1.5);
72 profile.set_maximum_velocity(0.8);
Brian Silverman3b89ed82013-03-22 18:59:16 -070073
74 const double side_offset = kRobotWidth * radians / 2.0;
75
76 while (true) {
Brian Silverman7f09f972013-03-22 23:11:39 -070077 ::aos::time::PhasedLoop10MS(5000); // wait until next 10ms tick
Brian Silverman3b89ed82013-03-22 18:59:16 -070078 driveTrainState = profile.Update(side_offset, goal_velocity);
79
80 if (::std::abs(driveTrainState(0, 0) - side_offset) < epsilon) break;
81 if (ShouldExitAuto()) return;
82
83 LOG(DEBUG, "Driving left to %f, right to %f\n",
Brian Silverman7992d6e2013-03-24 19:20:54 -070084 left_initial_position - driveTrainState(0, 0),
85 right_initial_position + driveTrainState(0, 0));
Brian Silverman3b89ed82013-03-22 18:59:16 -070086 control_loops::drivetrain.goal.MakeWithBuilder()
87 .control_loop_driving(true)
Brian Silverman93335ae2015-01-26 20:43:39 -050088 //.highgear(false)
Brian Silverman7992d6e2013-03-24 19:20:54 -070089 .left_goal(left_initial_position - driveTrainState(0, 0))
90 .right_goal(right_initial_position + driveTrainState(0, 0))
91 .left_velocity_goal(-driveTrainState(1, 0))
92 .right_velocity_goal(driveTrainState(1, 0))
Brian Silverman3b89ed82013-03-22 18:59:16 -070093 .Send();
94 }
Brian Silverman7992d6e2013-03-24 19:20:54 -070095 left_initial_position -= side_offset;
96 right_initial_position += side_offset;
Brian Silverman3b89ed82013-03-22 18:59:16 -070097 LOG(INFO, "Done moving\n");
98}
99
Austin Schuh80ff2e12014-03-08 12:06:19 -0800100void WaitUntilDoneOrCanceled(Action *action) {
101 while (true) {
102 // Poll the running bit and auto done bits.
103 ::aos::time::PhasedLoop10MS(5000);
104 if (!action->Running() || ShouldExitAuto()) {
105 return;
106 }
107 }
108}
109
Austin Schuh80ff2e12014-03-08 12:06:19 -0800110::std::unique_ptr<TypedAction< ::frc971::actions::DrivetrainActionQueueGroup>>
Natalia Frumkind1fa52f2014-06-21 15:24:25 -0700111SetDriveGoal(double distance, bool slow_acceleration,
112 double maximum_velocity = 1.7, double theta = 0) {
Austin Schuha4faacc2014-03-09 00:50:50 -0800113 LOG(INFO, "Driving to %f\n", distance);
Austin Schuh80ff2e12014-03-08 12:06:19 -0800114 auto drivetrain_action = actions::MakeDrivetrainAction();
115 drivetrain_action->GetGoal()->left_initial_position = left_initial_position;
116 drivetrain_action->GetGoal()->right_initial_position = right_initial_position;
117 drivetrain_action->GetGoal()->y_offset = distance;
Brian Silvermanad9e0002014-04-13 14:55:57 -0700118 drivetrain_action->GetGoal()->theta_offset = theta;
Austin Schuh80ff2e12014-03-08 12:06:19 -0800119 drivetrain_action->GetGoal()->maximum_velocity = maximum_velocity;
Natalia Frumkind1fa52f2014-06-21 15:24:25 -0700120 drivetrain_action->GetGoal()->maximum_acceleration =
121 slow_acceleration ? 2.5 : 3.0;
Austin Schuh80ff2e12014-03-08 12:06:19 -0800122 drivetrain_action->Start();
Brian Silvermanad9e0002014-04-13 14:55:57 -0700123 left_initial_position +=
124 distance - theta * constants::GetValues().turn_width / 2.0;
125 right_initial_position +=
Daniel Pettib0733be2014-11-14 22:44:03 -0800126 distance + theta * constants::GetValues().turn_width / 2.0;
Austin Schuh80ff2e12014-03-08 12:06:19 -0800127 return ::std::move(drivetrain_action);
128}
129
130void InitializeEncoders() {
Austin Schuh577edf62014-04-13 10:33:05 -0700131 control_loops::drivetrain.status.FetchLatest();
132 while (!control_loops::drivetrain.status.get()) {
Brian Silverman2c1e0342014-04-11 16:15:01 -0700133 LOG(WARNING,
134 "No previous drivetrain position packet, trying to fetch again\n");
Austin Schuh577edf62014-04-13 10:33:05 -0700135 control_loops::drivetrain.status.FetchNextBlocking();
Brian Silverman3b89ed82013-03-22 18:59:16 -0700136 }
137 left_initial_position =
Austin Schuh577edf62014-04-13 10:33:05 -0700138 control_loops::drivetrain.status->filtered_left_position;
Brian Silverman3b89ed82013-03-22 18:59:16 -0700139 right_initial_position =
Austin Schuh577edf62014-04-13 10:33:05 -0700140 control_loops::drivetrain.status->filtered_right_position;
Brian Silverman3b89ed82013-03-22 18:59:16 -0700141
Austin Schuh80ff2e12014-03-08 12:06:19 -0800142}
143
144void HandleAuto() {
Austin Schuh577edf62014-04-13 10:33:05 -0700145 ::aos::time::Time start_time = ::aos::time::Time::Now();
Brian Silverman20141f92015-01-05 17:39:01 -0800146 LOG(INFO, "Handling auto mode at %f\n", start_time.ToSeconds());
Brian Silverman6f621542014-04-06 16:00:41 -0700147
Austin Schuh80ff2e12014-03-08 12:06:19 -0800148 ResetDrivetrain();
149
150 if (ShouldExitAuto()) return;
151 InitializeEncoders();
Austin Schuh47017412013-03-10 11:50:46 -0700152}
153
154} // namespace autonomous
155} // namespace frc971