blob: 0863ba622373eeb8b55e9692114fae30fe98790a [file] [log] [blame]
Brian Silvermanb691f5e2015-08-02 11:37:55 -07001#include "y2015/actors/pickup_actor.h"
Austin Schuh6ab08b82015-02-22 21:41:05 -08002
Austin Schuh6e242ac2015-03-07 17:08:21 -08003#include <cmath>
Austin Schuh6ab08b82015-02-22 21:41:05 -08004
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"
Brian Silvermanb691f5e2015-08-02 11:37:55 -07009#include "y2015/control_loops/claw/claw.q.h"
Austin Schuh6ab08b82015-02-22 21:41:05 -080010
11namespace frc971 {
12namespace actors {
Austin Schuhe4e59ef2015-03-01 00:05:37 -080013namespace {
14constexpr double kClawPickupVelocity = 3.00;
Austin Schuh9c414f42015-04-19 20:01:56 -070015constexpr double kClawPickupAcceleration = 3.5;
Austin Schuha2ea71a2015-04-18 22:55:28 -070016constexpr double kClawMoveDownVelocity = 7.00;
17constexpr double kClawMoveDownAcceleration = 15.0;
18constexpr double kClawMoveUpVelocity = 8.0;
Austin Schuh9c414f42015-04-19 20:01:56 -070019constexpr double kClawMoveUpAcceleration = 25.0;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080020} // 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 Schuha2ea71a2015-04-18 22:55:28 -070027 // Start lifting the tote.
Austin Schuh6ab08b82015-02-22 21:41:05 -080028 {
29 auto message = control_loops::claw_queue.goal.MakeMessage();
30 message->angle = params.pickup_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080031 message->max_velocity = kClawPickupVelocity;
32 message->max_acceleration = kClawPickupAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080033 message->angular_velocity = 0.0;
34 message->intake = 0.0;
35 message->rollers_closed = true;
36
37 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
38 message.Send();
39 }
40 while (true) {
41 control_loops::claw_queue.status.FetchAnother();
42 if (ShouldCancel()) return true;
43 const double current_angle = control_loops::claw_queue.status->angle;
44 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
45
46 if (current_angle > params.suck_angle ||
47 ::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
48 break;
49 }
50 }
51
Austin Schuha2ea71a2015-04-18 22:55:28 -070052 // Once above params.suck_angle, start sucking while lifting.
Austin Schuh6ab08b82015-02-22 21:41:05 -080053 {
54 auto message = control_loops::claw_queue.goal.MakeMessage();
55 message->angle = params.pickup_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080056 message->max_velocity = kClawPickupVelocity;
57 message->max_acceleration = kClawPickupAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080058 message->angular_velocity = 0.0;
59 message->intake = params.intake_voltage;
60 message->rollers_closed = true;
61
62 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
63 message.Send();
64 }
65
66 while (true) {
67 control_loops::claw_queue.status.FetchAnother();
68 if (ShouldCancel()) return true;
69 const double current_angle = control_loops::claw_queue.status->angle;
70 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
71
72 if (::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
73 break;
74 }
75 }
76
Austin Schuha2ea71a2015-04-18 22:55:28 -070077 // Now that we have reached the upper height, come back down while intaking.
Austin Schuh6ab08b82015-02-22 21:41:05 -080078 {
79 auto message = control_loops::claw_queue.goal.MakeMessage();
Austin Schuhe4e59ef2015-03-01 00:05:37 -080080 message->angle = params.suck_angle_finish;
Austin Schuha2ea71a2015-04-18 22:55:28 -070081 message->max_velocity = kClawMoveDownVelocity;
82 message->max_acceleration = kClawMoveDownAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080083 message->angular_velocity = 0.0;
84 message->intake = params.intake_voltage;
85 message->rollers_closed = true;
86
87 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
88 message.Send();
89 }
90
Austin Schuha2ea71a2015-04-18 22:55:28 -070091 // Pull in for params.intake_time.
Austin Schuh6ab08b82015-02-22 21:41:05 -080092 ::aos::time::Time end_time =
93 ::aos::time::Time::Now() + aos::time::Time::InSeconds(params.intake_time);
94 while ( ::aos::time::Time::Now() <= end_time) {
95 ::aos::time::PhasedLoopXMS(::aos::controls::kLoopFrequency.ToMSec(), 2500);
96 if (ShouldCancel()) return true;
97 }
98
Austin Schuha2ea71a2015-04-18 22:55:28 -070099 // Lift the claw back up to pack the box back in.
Austin Schuh6ab08b82015-02-22 21:41:05 -0800100 {
101 auto message = control_loops::claw_queue.goal.MakeMessage();
102 message->angle = params.pickup_finish_angle;
Austin Schuha2ea71a2015-04-18 22:55:28 -0700103 message->max_velocity = kClawMoveUpVelocity;
104 message->max_acceleration = kClawMoveUpAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -0800105 message->angular_velocity = 0.0;
Austin Schuha2ea71a2015-04-18 22:55:28 -0700106 message->intake = params.intake_voltage;
Austin Schuh6ab08b82015-02-22 21:41:05 -0800107 message->rollers_closed = true;
108
109 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
110 message.Send();
111 }
112
113 while (true) {
114 control_loops::claw_queue.status.FetchAnother();
115 if (ShouldCancel()) return true;
116 const double current_angle = control_loops::claw_queue.status->angle;
117 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
118
119 if (::std::abs(current_angle - params.pickup_finish_angle) <
120 kAngleEpsilon) {
121 break;
122 }
123 }
124
Austin Schuha2ea71a2015-04-18 22:55:28 -0700125 // Stop the motors...
126 {
127 auto message = control_loops::claw_queue.goal.MakeMessage();
128 message->angle = params.pickup_finish_angle;
129 message->max_velocity = kClawMoveUpVelocity;
130 message->max_acceleration = kClawMoveUpAcceleration;
131 message->angular_velocity = 0.0;
132 message->intake = 0.0;
133 message->rollers_closed = true;
134
135 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
136 message.Send();
137 }
138
139
Austin Schuh6ab08b82015-02-22 21:41:05 -0800140 return true;
141}
142
143::std::unique_ptr<PickupAction> MakePickupAction(const PickupParams& params) {
144 return ::std::unique_ptr<PickupAction>(
145 new PickupAction(&::frc971::actors::pickup_action, params));
146}
147
148} // namespace actors
149} // namespace frc971