blob: 3aa0c1899af1b8f919aec424d1011e0f485c1d76 [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
Austin Schuh88af0852016-12-04 20:31:32 -080011namespace y2015 {
Austin Schuh6ab08b82015-02-22 21:41:05 -080012namespace 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
Austin Schuh88af0852016-12-04 20:31:32 -080022using ::y2015::control_loops::claw_queue;
23
Austin Schuh6ab08b82015-02-22 21:41:05 -080024PickupActor::PickupActor(PickupActionQueueGroup* queues)
25 : aos::common::actions::ActorBase<PickupActionQueueGroup>(queues) {}
26
27bool PickupActor::RunAction(const PickupParams& params) {
Austin Schuhe4e59ef2015-03-01 00:05:37 -080028 constexpr double kAngleEpsilon = 0.10;
Austin Schuha2ea71a2015-04-18 22:55:28 -070029 // Start lifting the tote.
Austin Schuh6ab08b82015-02-22 21:41:05 -080030 {
Austin Schuh88af0852016-12-04 20:31:32 -080031 auto message = claw_queue.goal.MakeMessage();
Austin Schuh6ab08b82015-02-22 21:41:05 -080032 message->angle = params.pickup_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080033 message->max_velocity = kClawPickupVelocity;
34 message->max_acceleration = kClawPickupAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080035 message->angular_velocity = 0.0;
36 message->intake = 0.0;
37 message->rollers_closed = true;
38
39 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
40 message.Send();
41 }
42 while (true) {
Austin Schuh88af0852016-12-04 20:31:32 -080043 claw_queue.status.FetchAnother();
Austin Schuh6ab08b82015-02-22 21:41:05 -080044 if (ShouldCancel()) return true;
Austin Schuh88af0852016-12-04 20:31:32 -080045 const double current_angle = claw_queue.status->angle;
46 LOG_STRUCT(DEBUG, "Got claw status", *claw_queue.status);
Austin Schuh6ab08b82015-02-22 21:41:05 -080047
48 if (current_angle > params.suck_angle ||
49 ::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
50 break;
51 }
52 }
53
Austin Schuha2ea71a2015-04-18 22:55:28 -070054 // Once above params.suck_angle, start sucking while lifting.
Austin Schuh6ab08b82015-02-22 21:41:05 -080055 {
Austin Schuh88af0852016-12-04 20:31:32 -080056 auto message = claw_queue.goal.MakeMessage();
Austin Schuh6ab08b82015-02-22 21:41:05 -080057 message->angle = params.pickup_angle;
Austin Schuhe4e59ef2015-03-01 00:05:37 -080058 message->max_velocity = kClawPickupVelocity;
59 message->max_acceleration = kClawPickupAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080060 message->angular_velocity = 0.0;
61 message->intake = params.intake_voltage;
62 message->rollers_closed = true;
63
64 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
65 message.Send();
66 }
67
68 while (true) {
Austin Schuh88af0852016-12-04 20:31:32 -080069 claw_queue.status.FetchAnother();
Austin Schuh6ab08b82015-02-22 21:41:05 -080070 if (ShouldCancel()) return true;
Austin Schuh88af0852016-12-04 20:31:32 -080071 const double current_angle = claw_queue.status->angle;
72 LOG_STRUCT(DEBUG, "Got claw status", *claw_queue.status);
Austin Schuh6ab08b82015-02-22 21:41:05 -080073
74 if (::std::abs(current_angle - params.pickup_angle) < kAngleEpsilon) {
75 break;
76 }
77 }
78
Austin Schuha2ea71a2015-04-18 22:55:28 -070079 // Now that we have reached the upper height, come back down while intaking.
Austin Schuh6ab08b82015-02-22 21:41:05 -080080 {
Austin Schuh88af0852016-12-04 20:31:32 -080081 auto message = claw_queue.goal.MakeMessage();
Austin Schuhe4e59ef2015-03-01 00:05:37 -080082 message->angle = params.suck_angle_finish;
Austin Schuha2ea71a2015-04-18 22:55:28 -070083 message->max_velocity = kClawMoveDownVelocity;
84 message->max_acceleration = kClawMoveDownAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -080085 message->angular_velocity = 0.0;
86 message->intake = params.intake_voltage;
87 message->rollers_closed = true;
88
89 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
90 message.Send();
91 }
92
Austin Schuha2ea71a2015-04-18 22:55:28 -070093 // Pull in for params.intake_time.
Austin Schuh6ab08b82015-02-22 21:41:05 -080094 ::aos::time::Time end_time =
95 ::aos::time::Time::Now() + aos::time::Time::InSeconds(params.intake_time);
96 while ( ::aos::time::Time::Now() <= end_time) {
Austin Schuh214e9c12016-11-25 17:26:20 -080097 ::aos::time::PhasedLoopXMS(
98 ::std::chrono::duration_cast<::std::chrono::milliseconds>(
99 ::aos::controls::kLoopFrequency).count(),
100 2500);
Austin Schuh6ab08b82015-02-22 21:41:05 -0800101 if (ShouldCancel()) return true;
102 }
103
Austin Schuha2ea71a2015-04-18 22:55:28 -0700104 // Lift the claw back up to pack the box back in.
Austin Schuh6ab08b82015-02-22 21:41:05 -0800105 {
Austin Schuh88af0852016-12-04 20:31:32 -0800106 auto message = claw_queue.goal.MakeMessage();
Austin Schuh6ab08b82015-02-22 21:41:05 -0800107 message->angle = params.pickup_finish_angle;
Austin Schuha2ea71a2015-04-18 22:55:28 -0700108 message->max_velocity = kClawMoveUpVelocity;
109 message->max_acceleration = kClawMoveUpAcceleration;
Austin Schuh6ab08b82015-02-22 21:41:05 -0800110 message->angular_velocity = 0.0;
Austin Schuha2ea71a2015-04-18 22:55:28 -0700111 message->intake = params.intake_voltage;
Austin Schuh6ab08b82015-02-22 21:41:05 -0800112 message->rollers_closed = true;
113
114 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
115 message.Send();
116 }
117
118 while (true) {
Austin Schuh88af0852016-12-04 20:31:32 -0800119 claw_queue.status.FetchAnother();
Austin Schuh6ab08b82015-02-22 21:41:05 -0800120 if (ShouldCancel()) return true;
Austin Schuh88af0852016-12-04 20:31:32 -0800121 const double current_angle = claw_queue.status->angle;
122 LOG_STRUCT(DEBUG, "Got claw status", *claw_queue.status);
Austin Schuh6ab08b82015-02-22 21:41:05 -0800123
124 if (::std::abs(current_angle - params.pickup_finish_angle) <
125 kAngleEpsilon) {
126 break;
127 }
128 }
129
Austin Schuha2ea71a2015-04-18 22:55:28 -0700130 // Stop the motors...
131 {
Austin Schuh88af0852016-12-04 20:31:32 -0800132 auto message = claw_queue.goal.MakeMessage();
Austin Schuha2ea71a2015-04-18 22:55:28 -0700133 message->angle = params.pickup_finish_angle;
134 message->max_velocity = kClawMoveUpVelocity;
135 message->max_acceleration = kClawMoveUpAcceleration;
136 message->angular_velocity = 0.0;
137 message->intake = 0.0;
138 message->rollers_closed = true;
139
140 LOG_STRUCT(DEBUG, "Sending claw goal", *message);
141 message.Send();
142 }
143
144
Austin Schuh6ab08b82015-02-22 21:41:05 -0800145 return true;
146}
147
148::std::unique_ptr<PickupAction> MakePickupAction(const PickupParams& params) {
149 return ::std::unique_ptr<PickupAction>(
Austin Schuh88af0852016-12-04 20:31:32 -0800150 new PickupAction(&::y2015::actors::pickup_action, params));
Austin Schuh6ab08b82015-02-22 21:41:05 -0800151}
152
153} // namespace actors
Austin Schuh88af0852016-12-04 20:31:32 -0800154} // namespace y2015