blob: 4ae988e34ef43f4536e190101ad968349d535da3 [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) {
Austin Schuh214e9c12016-11-25 17:26:20 -080095 ::aos::time::PhasedLoopXMS(
96 ::std::chrono::duration_cast<::std::chrono::milliseconds>(
97 ::aos::controls::kLoopFrequency).count(),
98 2500);
Austin Schuh6ab08b82015-02-22 21:41:05 -080099 if (ShouldCancel()) return true;
100 }
101
Austin Schuha2ea71a2015-04-18 22:55:28 -0700102 // Lift the claw back up to pack the box back in.
Austin Schuh6ab08b82015-02-22 21:41:05 -0800103 {
104 auto message = control_loops::claw_queue.goal.MakeMessage();
105 message->angle = params.pickup_finish_angle;
Austin Schuha2ea71a2015-04-18 22:55:28 -0700106 message->max_velocity = kClawMoveUpVelocity;
107 message->max_acceleration = kClawMoveUpAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -0800108 message->angular_velocity = 0.0;
Austin Schuha2ea71a2015-04-18 22:55:28 -0700109 message->intake = params.intake_voltage;
Austin Schuh6ab08b82015-02-22 21:41:05 -0800110 message->rollers_closed = true;
111
112 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
113 message.Send();
114 }
115
116 while (true) {
117 control_loops::claw_queue.status.FetchAnother();
118 if (ShouldCancel()) return true;
119 const double current_angle = control_loops::claw_queue.status->angle;
120 LOG_STRUCT(DEBUG, "Got claw status", *control_loops::claw_queue.status);
121
122 if (::std::abs(current_angle - params.pickup_finish_angle) <
123 kAngleEpsilon) {
124 break;
125 }
126 }
127
Austin Schuha2ea71a2015-04-18 22:55:28 -0700128 // Stop the motors...
129 {
130 auto message = control_loops::claw_queue.goal.MakeMessage();
131 message->angle = params.pickup_finish_angle;
132 message->max_velocity = kClawMoveUpVelocity;
133 message->max_acceleration = kClawMoveUpAcceleration;
134 message->angular_velocity = 0.0;
135 message->intake = 0.0;
136 message->rollers_closed = true;
137
138 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
139 message.Send();
140 }
141
142
Austin Schuh6ab08b82015-02-22 21:41:05 -0800143 return true;
144}
145
146::std::unique_ptr<PickupAction> MakePickupAction(const PickupParams& params) {
147 return ::std::unique_ptr<PickupAction>(
148 new PickupAction(&::frc971::actors::pickup_action, params));
149}
150
151} // namespace actors
152} // namespace frc971