blob: 25f6a6a2946f1ee3805cb88dec106cc649ffbacd [file] [log] [blame]
Sabina Davisedf89472020-02-17 15:27:37 -08001#include "y2020/control_loops/superstructure/shooter/shooter.h"
2
3#include <chrono>
4
5#include "aos/logging/logging.h"
6#include "y2020/control_loops/superstructure/accelerator/accelerator_plant.h"
7#include "y2020/control_loops/superstructure/finisher/finisher_plant.h"
8
9namespace y2020 {
10namespace control_loops {
11namespace superstructure {
12namespace shooter {
13
Sabina Davis0f31d3f2020-02-20 20:41:00 -080014namespace {
15const double kVelocityTolerance = 0.01;
16} // namespace
17
Sabina Davisedf89472020-02-17 15:27:37 -080018Shooter::Shooter()
19 : finisher_(finisher::MakeIntegralFinisherLoop()),
20 accelerator_left_(accelerator::MakeIntegralAcceleratorLoop()),
21 accelerator_right_(accelerator::MakeIntegralAcceleratorLoop()) {}
22
Sabina Davis0f31d3f2020-02-20 20:41:00 -080023bool Shooter::UpToSpeed(const ShooterGoal *goal) {
24 return (
25 std::abs(goal->velocity_finisher() - finisher_.avg_angular_velocity()) <
26 kVelocityTolerance &&
27 std::abs(goal->velocity_accelerator() -
28 accelerator_left_.avg_angular_velocity()) < kVelocityTolerance &&
29 std::abs(goal->velocity_accelerator() -
30 accelerator_right_.avg_angular_velocity()) < kVelocityTolerance &&
31 std::abs(goal->velocity_finisher() - finisher_.velocity()) < kVelocityTolerance &&
32 std::abs(goal->velocity_accelerator() - accelerator_left_.velocity()) <
33 kVelocityTolerance &&
34 std::abs(goal->velocity_accelerator() - accelerator_right_.velocity()) <
35 kVelocityTolerance);
36}
37
Sabina Davisedf89472020-02-17 15:27:37 -080038flatbuffers::Offset<ShooterStatus> Shooter::RunIteration(
39 const ShooterGoal *goal, const ShooterPosition *position,
Sabina Davis0f31d3f2020-02-20 20:41:00 -080040 flatbuffers::FlatBufferBuilder *fbb, OutputT *output,
41 const aos::monotonic_clock::time_point position_timestamp) {
42 // Update position, output, and status for our two shooter sides.
43 finisher_.set_position(position->theta_finisher(), position_timestamp);
44 accelerator_left_.set_position(position->theta_accelerator_left(),
45 position_timestamp);
46 accelerator_right_.set_position(position->theta_accelerator_right(),
47 position_timestamp);
Sabina Davisedf89472020-02-17 15:27:37 -080048
49 finisher_.Update(output == nullptr);
50 accelerator_left_.Update(output == nullptr);
51 accelerator_right_.Update(output == nullptr);
52
Sabina Davis0f31d3f2020-02-20 20:41:00 -080053 // Update goal.
54 if (goal) {
55 finisher_.set_goal(goal->velocity_finisher());
56 accelerator_left_.set_goal(goal->velocity_accelerator());
57 accelerator_right_.set_goal(goal->velocity_accelerator());
58
59 if (UpToSpeed(goal) && goal->velocity_finisher() > kVelocityTolerance &&
60 goal->velocity_accelerator() > kVelocityTolerance) {
61 ready_ = true;
62 } else {
63 ready_ = false;
64 }
65 }
66
Sabina Davisedf89472020-02-17 15:27:37 -080067 flatbuffers::Offset<FlywheelControllerStatus> finisher_status_offset =
68 finisher_.SetStatus(fbb);
69 flatbuffers::Offset<FlywheelControllerStatus> accelerator_left_status_offset =
70 accelerator_left_.SetStatus(fbb);
71 flatbuffers::Offset<FlywheelControllerStatus>
72 accelerator_right_status_offset = accelerator_right_.SetStatus(fbb);
73
74 ShooterStatusBuilder status_builder(*fbb);
75
76 status_builder.add_finisher(finisher_status_offset);
77 status_builder.add_accelerator_left(accelerator_left_status_offset);
78 status_builder.add_accelerator_right(accelerator_right_status_offset);
79
80 if (output) {
81 output->finisher_voltage = finisher_.voltage();
82 output->accelerator_left_voltage = accelerator_left_.voltage();
83 output->accelerator_right_voltage = accelerator_right_.voltage();
84 }
85
86 return status_builder.Finish();
87}
88
89} // namespace shooter
90} // namespace superstructure
91} // namespace control_loops
92} // namespace y2020