blob: 0dd7ef40aabb90c840e59eb98b0a445b81ca474a [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"
Daniel Petti3b1e48f2015-02-15 15:57:53 -080014#include "frc971/actors/drivetrain_actor.h"
Austin Schuh47017412013-03-10 11:50:46 -070015
16using ::aos::time::Time;
17
18namespace frc971 {
19namespace autonomous {
20
Austin Schuh80ff2e12014-03-08 12:06:19 -080021namespace time = ::aos::time;
22
Brian Silverman3b89ed82013-03-22 18:59:16 -070023static double left_initial_position, right_initial_position;
24
Austin Schuh6be011a2013-03-19 10:07:02 +000025bool ShouldExitAuto() {
26 ::frc971::autonomous::autonomous.FetchLatest();
27 bool ans = !::frc971::autonomous::autonomous->run_auto;
28 if (ans) {
29 LOG(INFO, "Time to exit auto mode\n");
30 }
31 return ans;
32}
33
Austin Schuh6be011a2013-03-19 10:07:02 +000034void StopDrivetrain() {
35 LOG(INFO, "Stopping the drivetrain\n");
Brian Silvermanada5f2c2015-02-01 02:41:14 -050036 control_loops::drivetrain_queue.goal.MakeWithBuilder()
Brian Silverman3b89ed82013-03-22 18:59:16 -070037 .control_loop_driving(true)
Brian Silvermance86bac2013-03-31 19:07:24 -070038 .left_goal(left_initial_position)
39 .left_velocity_goal(0)
40 .right_goal(right_initial_position)
41 .right_velocity_goal(0)
42 .quickturn(false)
43 .Send();
44}
45
46void ResetDrivetrain() {
47 LOG(INFO, "resetting the drivetrain\n");
Brian Silvermanada5f2c2015-02-01 02:41:14 -050048 control_loops::drivetrain_queue.goal.MakeWithBuilder()
Brian Silvermance86bac2013-03-31 19:07:24 -070049 .control_loop_driving(false)
Brian Silverman93335ae2015-01-26 20:43:39 -050050 //.highgear(false)
Austin Schuh6be011a2013-03-19 10:07:02 +000051 .steering(0.0)
52 .throttle(0.0)
Brian Silverman38ea9bf2014-04-19 22:57:54 -070053 .left_goal(left_initial_position)
54 .left_velocity_goal(0)
55 .right_goal(right_initial_position)
56 .right_velocity_goal(0)
Austin Schuh6be011a2013-03-19 10:07:02 +000057 .Send();
58}
59
Brian Silverman3b89ed82013-03-22 18:59:16 -070060void DriveSpin(double radians) {
61 LOG(INFO, "going to spin %f\n", radians);
62
Ben Fredrickson9fb2ab12015-02-16 16:42:08 -080063 // TODO(sensors): update this time thing maybe?
Brian Silverman3b89ed82013-03-22 18:59:16 -070064 ::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 Silverman547abb32015-02-16 00:37:48 -050077 ::aos::time::PhasedLoopXMS(5, 2500);
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 Silvermanada5f2c2015-02-01 02:41:14 -050086 control_loops::drivetrain_queue.goal.MakeWithBuilder()
Brian Silverman3b89ed82013-03-22 18:59:16 -070087 .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
Ben Fredricksond69f38b2015-01-28 20:06:15 -0800100void WaitUntilDoneOrCanceled(aos::common::actions::Action *action) {
Austin Schuh80ff2e12014-03-08 12:06:19 -0800101 while (true) {
102 // Poll the running bit and auto done bits.
Brian Silverman547abb32015-02-16 00:37:48 -0500103 ::aos::time::PhasedLoopXMS(5, 2500);
Austin Schuh80ff2e12014-03-08 12:06:19 -0800104 if (!action->Running() || ShouldExitAuto()) {
105 return;
106 }
107 }
108}
109
Ben Fredrickson9fb2ab12015-02-16 16:42:08 -0800110::std::unique_ptr<::frc971::actors::DrivetrainAction> SetDriveGoal(
111 double distance, bool slow_acceleration, double maximum_velocity = 1.7,
112 double theta = 0) {
Austin Schuha4faacc2014-03-09 00:50:50 -0800113 LOG(INFO, "Driving to %f\n", distance);
Ben Fredrickson9fb2ab12015-02-16 16:42:08 -0800114
115 ::frc971::actors::DrivetrainActionParams params;
116 params.left_initial_position = left_initial_position;
117 params.right_initial_position = right_initial_position;
118 params.y_offset = distance;
119 params.theta_offset = theta;
120 params.maximum_velocity = maximum_velocity;
121 params.maximum_acceleration = slow_acceleration ? 2.5 : 3.0;
122 auto drivetrain_action = actors::MakeDrivetrainAction(params);
123
Austin Schuh80ff2e12014-03-08 12:06:19 -0800124 drivetrain_action->Start();
Brian Silvermanad9e0002014-04-13 14:55:57 -0700125 left_initial_position +=
126 distance - theta * constants::GetValues().turn_width / 2.0;
127 right_initial_position +=
Daniel Pettib0733be2014-11-14 22:44:03 -0800128 distance + theta * constants::GetValues().turn_width / 2.0;
Austin Schuh80ff2e12014-03-08 12:06:19 -0800129 return ::std::move(drivetrain_action);
130}
131
132void InitializeEncoders() {
Brian Silvermanada5f2c2015-02-01 02:41:14 -0500133 control_loops::drivetrain_queue.status.FetchLatest();
134 while (!control_loops::drivetrain_queue.status.get()) {
Brian Silverman2c1e0342014-04-11 16:15:01 -0700135 LOG(WARNING,
136 "No previous drivetrain position packet, trying to fetch again\n");
Brian Silvermanada5f2c2015-02-01 02:41:14 -0500137 control_loops::drivetrain_queue.status.FetchNextBlocking();
Brian Silverman3b89ed82013-03-22 18:59:16 -0700138 }
139 left_initial_position =
Brian Silvermanada5f2c2015-02-01 02:41:14 -0500140 control_loops::drivetrain_queue.status->filtered_left_position;
Brian Silverman3b89ed82013-03-22 18:59:16 -0700141 right_initial_position =
Brian Silvermanada5f2c2015-02-01 02:41:14 -0500142 control_loops::drivetrain_queue.status->filtered_right_position;
Austin Schuh80ff2e12014-03-08 12:06:19 -0800143}
144
145void HandleAuto() {
Austin Schuh577edf62014-04-13 10:33:05 -0700146 ::aos::time::Time start_time = ::aos::time::Time::Now();
Brian Silverman20141f92015-01-05 17:39:01 -0800147 LOG(INFO, "Handling auto mode at %f\n", start_time.ToSeconds());
Brian Silverman6f621542014-04-06 16:00:41 -0700148
Austin Schuh80ff2e12014-03-08 12:06:19 -0800149 ResetDrivetrain();
150
151 if (ShouldExitAuto()) return;
152 InitializeEncoders();
Austin Schuh47017412013-03-10 11:50:46 -0700153}
154
155} // namespace autonomous
156} // namespace frc971