blob: f0ea383a4e8bf3dca681df6704ec4d05a372b36b [file] [log] [blame]
Austin Schuh6ab08b82015-02-22 21:41:05 -08001#include "frc971/actors/pickup_actor.h"
2
3#include <math.h>
4
5#include "aos/common/logging/logging.h"
6#include "aos/common/controls/control_loop.h"
7#include "aos/common/util/phased_loop.h"
8#include "aos/common/time.h"
9#include "frc971/actors/fridge_profile_actor.h"
10#include "frc971/constants.h"
11#include "frc971/control_loops/claw/claw.q.h"
12
13namespace frc971 {
14namespace actors {
Austin Schuhe4e59ef2015-03-01 00:05:37 -080015namespace {
16constexpr double kClawPickupVelocity = 3.00;
17constexpr double kClawPickupAcceleration = 4.0;
18constexpr double kClawMoveVelocity = 3.00;
19constexpr double kClawMoveAcceleration = 8.0;
20} // namespace
Austin Schuh6ab08b82015-02-22 21:41:05 -080021
22PickupActor::PickupActor(PickupActionQueueGroup* queues)
23 : aos::common::actions::ActorBase<PickupActionQueueGroup>(queues) {}
24
25bool PickupActor::RunAction(const PickupParams& params) {
Austin Schuhe4e59ef2015-03-01 00:05:37 -080026 constexpr double kAngleEpsilon = 0.10;
Austin Schuh6ab08b82015-02-22 21:41:05 -080027 {
28 auto message = control_loops::claw_queue.goal.MakeMessage();
29 message->angle = params.pickup_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080030 message->max_velocity = kClawPickupVelocity;
31 message->max_acceleration = kClawPickupAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080032 message->angular_velocity = 0.0;
33 message->intake = 0.0;
34 message->rollers_closed = true;
35
36 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
37 message.Send();
38 }
39 while (true) {
40 control_loops::claw_queue.status.FetchAnother();
41 if (ShouldCancel()) return true;
42 const double current_angle = control_loops::claw_queue.status->angle;
43 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
44
45 if (current_angle > params.suck_angle ||
46 ::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
47 break;
48 }
49 }
50
51 {
52 auto message = control_loops::claw_queue.goal.MakeMessage();
53 message->angle = params.pickup_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080054 message->max_velocity = kClawPickupVelocity;
55 message->max_acceleration = kClawPickupAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080056 message->angular_velocity = 0.0;
57 message->intake = params.intake_voltage;
58 message->rollers_closed = true;
59
60 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
61 message.Send();
62 }
63
64 while (true) {
65 control_loops::claw_queue.status.FetchAnother();
66 if (ShouldCancel()) return true;
67 const double current_angle = control_loops::claw_queue.status->angle;
68 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
69
70 if (::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
71 break;
72 }
73 }
74
75 {
76 auto message = control_loops::claw_queue.goal.MakeMessage();
Austin Schuhe4e59ef2015-03-01 00:05:37 -080077 message->angle = params.suck_angle_finish;
78 message->max_velocity = kClawMoveVelocity;
79 message->max_acceleration = kClawMoveAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080080 message->angular_velocity = 0.0;
81 message->intake = params.intake_voltage;
82 message->rollers_closed = true;
83
84 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
85 message.Send();
86 }
87
88 ::aos::time::Time end_time =
89 ::aos::time::Time::Now() + aos::time::Time::InSeconds(params.intake_time);
90 while ( ::aos::time::Time::Now() <= end_time) {
91 ::aos::time::PhasedLoopXMS(::aos::controls::kLoopFrequency.ToMSec(), 2500);
92 if (ShouldCancel()) return true;
93 }
94
95 {
96 auto message = control_loops::claw_queue.goal.MakeMessage();
97 message->angle = params.pickup_finish_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080098 message->max_velocity = kClawMoveVelocity;
99 message->max_acceleration = kClawMoveAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -0800100 message->angular_velocity = 0.0;
101 message->intake = 0.0;
102 message->rollers_closed = true;
103
104 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
105 message.Send();
106 }
107
108 while (true) {
109 control_loops::claw_queue.status.FetchAnother();
110 if (ShouldCancel()) return true;
111 const double current_angle = control_loops::claw_queue.status->angle;
112 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
113
114 if (::std::abs(current_angle - params.pickup_finish_angle) <
115 kAngleEpsilon) {
116 break;
117 }
118 }
119
120 return true;
121}
122
123::std::unique_ptr<PickupAction> MakePickupAction(const PickupParams& params) {
124 return ::std::unique_ptr<PickupAction>(
125 new PickupAction(&::frc971::actors::pickup_action, params));
126}
127
128} // namespace actors
129} // namespace frc971