blob: ea2a74b2c3fe176db80ee680167027710aed4d01 [file] [log] [blame]
Austin Schuh47017412013-03-10 11:50:46 -07001#include "stdio.h"
2
Austin Schuh47017412013-03-10 11:50:46 -07003#include "aos/common/control_loop/Timing.h"
4#include "aos/common/time.h"
Austin Schuh6be011a2013-03-19 10:07:02 +00005#include "aos/common/util/trapezoid_profile.h"
Brian Silverman598800f2013-05-09 17:08:42 -07006#include "aos/common/logging/logging.h"
Brian Silverman96d9cea2013-11-12 21:10:50 -08007#include "aos/common/network/team_number.h"
Brian Silverman598800f2013-05-09 17:08:42 -07008
9#include "frc971/autonomous/auto.q.h"
Austin Schuh6be011a2013-03-19 10:07:02 +000010#include "frc971/constants.h"
11#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Austin Schuh47017412013-03-10 11:50:46 -070012
13using ::aos::time::Time;
14
15namespace frc971 {
16namespace autonomous {
17
Brian Silverman3b89ed82013-03-22 18:59:16 -070018static double left_initial_position, right_initial_position;
19
Austin Schuh6be011a2013-03-19 10:07:02 +000020bool ShouldExitAuto() {
21 ::frc971::autonomous::autonomous.FetchLatest();
22 bool ans = !::frc971::autonomous::autonomous->run_auto;
23 if (ans) {
24 LOG(INFO, "Time to exit auto mode\n");
25 }
26 return ans;
27}
28
Austin Schuh6be011a2013-03-19 10:07:02 +000029void StopDrivetrain() {
30 LOG(INFO, "Stopping the drivetrain\n");
Austin Schuh47017412013-03-10 11:50:46 -070031 control_loops::drivetrain.goal.MakeWithBuilder()
Brian Silverman3b89ed82013-03-22 18:59:16 -070032 .control_loop_driving(true)
Brian Silvermance86bac2013-03-31 19:07:24 -070033 .left_goal(left_initial_position)
34 .left_velocity_goal(0)
35 .right_goal(right_initial_position)
36 .right_velocity_goal(0)
37 .quickturn(false)
38 .Send();
39}
40
41void ResetDrivetrain() {
42 LOG(INFO, "resetting the drivetrain\n");
43 control_loops::drivetrain.goal.MakeWithBuilder()
44 .control_loop_driving(false)
Austin Schuh6be011a2013-03-19 10:07:02 +000045 .highgear(false)
46 .steering(0.0)
47 .throttle(0.0)
Austin Schuh6be011a2013-03-19 10:07:02 +000048 .Send();
49}
50
Brian Silvermaned2cbde2013-03-31 01:56:14 -070051void SetDriveGoal(double yoffset, double maximum_velocity = 1.5) {
Austin Schuh6be011a2013-03-19 10:07:02 +000052 LOG(INFO, "Going to move %f\n", yoffset);
53
54 // Measured conversion to get the distance right.
Austin Schuh6be011a2013-03-19 10:07:02 +000055 ::aos::util::TrapezoidProfile profile(::aos::time::Time::InMS(10));
56 ::Eigen::Matrix<double, 2, 1> driveTrainState;
57 const double goal_velocity = 0.0;
58 const double epsilon = 0.01;
59
Austin Schuhfae53362013-03-23 04:39:48 +000060 profile.set_maximum_acceleration(2.0);
Brian Silvermaned2cbde2013-03-31 01:56:14 -070061 profile.set_maximum_velocity(maximum_velocity);
Austin Schuh6be011a2013-03-19 10:07:02 +000062
Austin Schuh6be011a2013-03-19 10:07:02 +000063 while (true) {
Brian Silverman7f09f972013-03-22 23:11:39 -070064 ::aos::time::PhasedLoop10MS(5000); // wait until next 10ms tick
Austin Schuh6be011a2013-03-19 10:07:02 +000065 driveTrainState = profile.Update(yoffset, goal_velocity);
66
Brian Silverman3b89ed82013-03-22 18:59:16 -070067 if (::std::abs(driveTrainState(0, 0) - yoffset) < epsilon) break;
Austin Schuh6be011a2013-03-19 10:07:02 +000068 if (ShouldExitAuto()) return;
69
70 LOG(DEBUG, "Driving left to %f, right to %f\n",
71 driveTrainState(0, 0) + left_initial_position,
72 driveTrainState(0, 0) + right_initial_position);
73 control_loops::drivetrain.goal.MakeWithBuilder()
74 .control_loop_driving(true)
75 .highgear(false)
76 .left_goal(driveTrainState(0, 0) + left_initial_position)
77 .right_goal(driveTrainState(0, 0) + right_initial_position)
78 .left_velocity_goal(driveTrainState(1, 0))
79 .right_velocity_goal(driveTrainState(1, 0))
80 .Send();
81 }
Brian Silverman3b89ed82013-03-22 18:59:16 -070082 left_initial_position += yoffset;
83 right_initial_position += yoffset;
Austin Schuh6be011a2013-03-19 10:07:02 +000084 LOG(INFO, "Done moving\n");
85}
86
Brian Silverman3b89ed82013-03-22 18:59:16 -070087void DriveSpin(double radians) {
88 LOG(INFO, "going to spin %f\n", radians);
89
90 ::aos::util::TrapezoidProfile profile(::aos::time::Time::InMS(10));
91 ::Eigen::Matrix<double, 2, 1> driveTrainState;
92 const double goal_velocity = 0.0;
93 const double epsilon = 0.01;
Brian Silverman13be6682013-03-22 21:02:07 -070094 // in drivetrain "meters"
Brian Silverman3b89ed82013-03-22 18:59:16 -070095 const double kRobotWidth = 0.4544;
96
Brian Silverman7992d6e2013-03-24 19:20:54 -070097 profile.set_maximum_acceleration(1.5);
98 profile.set_maximum_velocity(0.8);
Brian Silverman3b89ed82013-03-22 18:59:16 -070099
100 const double side_offset = kRobotWidth * radians / 2.0;
101
102 while (true) {
Brian Silverman7f09f972013-03-22 23:11:39 -0700103 ::aos::time::PhasedLoop10MS(5000); // wait until next 10ms tick
Brian Silverman3b89ed82013-03-22 18:59:16 -0700104 driveTrainState = profile.Update(side_offset, goal_velocity);
105
106 if (::std::abs(driveTrainState(0, 0) - side_offset) < epsilon) break;
107 if (ShouldExitAuto()) return;
108
109 LOG(DEBUG, "Driving left to %f, right to %f\n",
Brian Silverman7992d6e2013-03-24 19:20:54 -0700110 left_initial_position - driveTrainState(0, 0),
111 right_initial_position + driveTrainState(0, 0));
Brian Silverman3b89ed82013-03-22 18:59:16 -0700112 control_loops::drivetrain.goal.MakeWithBuilder()
113 .control_loop_driving(true)
114 .highgear(false)
Brian Silverman7992d6e2013-03-24 19:20:54 -0700115 .left_goal(left_initial_position - driveTrainState(0, 0))
116 .right_goal(right_initial_position + driveTrainState(0, 0))
117 .left_velocity_goal(-driveTrainState(1, 0))
118 .right_velocity_goal(driveTrainState(1, 0))
Brian Silverman3b89ed82013-03-22 18:59:16 -0700119 .Send();
120 }
Brian Silverman7992d6e2013-03-24 19:20:54 -0700121 left_initial_position -= side_offset;
122 right_initial_position += side_offset;
Brian Silverman3b89ed82013-03-22 18:59:16 -0700123 LOG(INFO, "Done moving\n");
124}
125
Austin Schuh6be011a2013-03-19 10:07:02 +0000126void HandleAuto() {
127 LOG(INFO, "Handling auto mode\n");
Brian Silvermance86bac2013-03-31 19:07:24 -0700128
Brian Silvermance86bac2013-03-31 19:07:24 -0700129 ResetDrivetrain();
130
Brian Silvermance86bac2013-03-31 19:07:24 -0700131 if (ShouldExitAuto()) return;
Austin Schuh6be011a2013-03-19 10:07:02 +0000132
Brian Silverman3b89ed82013-03-22 18:59:16 -0700133 control_loops::drivetrain.position.FetchLatest();
134 while (!control_loops::drivetrain.position.get()) {
135 LOG(WARNING, "No previous drivetrain position packet, trying to fetch again\n");
136 control_loops::drivetrain.position.FetchNextBlocking();
137 }
138 left_initial_position =
139 control_loops::drivetrain.position->left_encoder;
140 right_initial_position =
141 control_loops::drivetrain.position->right_encoder;
142
Brian Silverman3b89ed82013-03-22 18:59:16 -0700143 StopDrivetrain();
Austin Schuh47017412013-03-10 11:50:46 -0700144}
145
146} // namespace autonomous
147} // namespace frc971