blob: b315223c89eefb71708c7b8a52ee5d5882657788 [file] [log] [blame]
Comran Morshed6c6a0a92016-01-17 12:45:16 +00001#include "y2016/autonomous/auto.h"
2
Comran Morshed9a9948c2016-01-16 15:58:04 +00003#include <stdio.h>
4
5#include <memory>
6
Comran Morshed6c6a0a92016-01-17 12:45:16 +00007#include "aos/common/actions/actions.h"
Comran Morshed9a9948c2016-01-16 15:58:04 +00008#include "aos/common/logging/logging.h"
9#include "aos/common/logging/queue_logging.h"
Comran Morshed6c6a0a92016-01-17 12:45:16 +000010#include "aos/common/time.h"
11#include "aos/common/util/phased_loop.h"
12#include "aos/common/util/trapezoid_profile.h"
Comran Morshed9a9948c2016-01-16 15:58:04 +000013
14#include "frc971/autonomous/auto.q.h"
Comran Morshed9a9948c2016-01-16 15:58:04 +000015#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Comran Morshed6c6a0a92016-01-17 12:45:16 +000016#include "y2016/actors/drivetrain_actor.h"
17#include "y2016/constants.h"
Austin Schuh3130b372016-02-17 00:34:51 -080018#include "y2016/control_loops/drivetrain/drivetrain_dog_motor_plant.h"
Comran Morshed6c6a0a92016-01-17 12:45:16 +000019#include "y2016/queues/profile_params.q.h"
Comran Morshed9a9948c2016-01-16 15:58:04 +000020
21using ::aos::time::Time;
22
Comran Morshed6c6a0a92016-01-17 12:45:16 +000023namespace y2016 {
Comran Morshed9a9948c2016-01-16 15:58:04 +000024namespace autonomous {
25
26namespace time = ::aos::time;
27
28static double left_initial_position, right_initial_position;
29
30bool ShouldExitAuto() {
31 ::frc971::autonomous::autonomous.FetchLatest();
32 bool ans = !::frc971::autonomous::autonomous->run_auto;
33 if (ans) {
34 LOG(INFO, "Time to exit auto mode\n");
35 }
36 return ans;
37}
38
Comran Morshed9a9948c2016-01-16 15:58:04 +000039void ResetDrivetrain() {
40 LOG(INFO, "resetting the drivetrain\n");
41 ::frc971::control_loops::drivetrain_queue.goal.MakeWithBuilder()
42 .control_loop_driving(false)
43 .highgear(true)
44 .steering(0.0)
45 .throttle(0.0)
46 .left_goal(left_initial_position)
47 .left_velocity_goal(0)
48 .right_goal(right_initial_position)
49 .right_velocity_goal(0)
50 .Send();
51}
52
53void WaitUntilDoneOrCanceled(
54 ::std::unique_ptr<aos::common::actions::Action> action) {
55 if (!action) {
56 LOG(ERROR, "No action, not waiting\n");
57 return;
58 }
59 while (true) {
60 // Poll the running bit and auto done bits.
61 ::aos::time::PhasedLoopXMS(10, 5000);
62 if (!action->Running() || ShouldExitAuto()) {
63 return;
64 }
65 }
66}
67
Comran Morshed9a9948c2016-01-16 15:58:04 +000068const ProfileParams kFastDrive = {3.0, 2.5};
69const ProfileParams kSlowDrive = {2.5, 2.5};
Comran Morshed9a9948c2016-01-16 15:58:04 +000070const ProfileParams kFastTurn = {3.0, 10.0};
71
Comran Morshed6c6a0a92016-01-17 12:45:16 +000072::std::unique_ptr<::y2016::actors::DrivetrainAction> SetDriveGoal(
Comran Morshed9a9948c2016-01-16 15:58:04 +000073 double distance, const ProfileParams drive_params, double theta = 0,
74 const ProfileParams &turn_params = kFastTurn) {
75 LOG(INFO, "Driving to %f\n", distance);
76
Comran Morshed6c6a0a92016-01-17 12:45:16 +000077 ::y2016::actors::DrivetrainActionParams params;
Comran Morshed9a9948c2016-01-16 15:58:04 +000078 params.left_initial_position = left_initial_position;
79 params.right_initial_position = right_initial_position;
80 params.y_offset = distance;
81 params.theta_offset = theta;
82 params.maximum_turn_acceleration = turn_params.acceleration;
83 params.maximum_turn_velocity = turn_params.velocity;
84 params.maximum_velocity = drive_params.velocity;
85 params.maximum_acceleration = drive_params.acceleration;
86 auto drivetrain_action = actors::MakeDrivetrainAction(params);
87 drivetrain_action->Start();
88 left_initial_position +=
Austin Schuh3130b372016-02-17 00:34:51 -080089 distance - theta * control_loops::drivetrain::kRobotRadius;
Comran Morshed9a9948c2016-01-16 15:58:04 +000090 right_initial_position +=
Austin Schuh3130b372016-02-17 00:34:51 -080091 distance + theta * control_loops::drivetrain::kRobotRadius;
Comran Morshed9a9948c2016-01-16 15:58:04 +000092 return ::std::move(drivetrain_action);
93}
94
Comran Morshed9a9948c2016-01-16 15:58:04 +000095void InitializeEncoders() {
96 ::frc971::control_loops::drivetrain_queue.status.FetchAnother();
97 left_initial_position =
98 ::frc971::control_loops::drivetrain_queue.status->filtered_left_position;
99 right_initial_position =
100 ::frc971::control_loops::drivetrain_queue.status->filtered_right_position;
101}
102
Comran Morshed9a9948c2016-01-16 15:58:04 +0000103void HandleAuto() {
Comran Morshed9a9948c2016-01-16 15:58:04 +0000104 LOG(INFO, "Handling auto mode\n");
105
Comran Morshed9a9948c2016-01-16 15:58:04 +0000106 ResetDrivetrain();
Comran Morshed9a9948c2016-01-16 15:58:04 +0000107 InitializeEncoders();
Comran Morshed9a9948c2016-01-16 15:58:04 +0000108}
109
110} // namespace autonomous
Comran Morshed6c6a0a92016-01-17 12:45:16 +0000111} // namespace y2016