blob: 3280c69e218cac649419c1b11c9215c47e97c1ea [file] [log] [blame]
Sabina Davisedf89472020-02-17 15:27:37 -08001#ifndef Y2020_CONTROL_LOOPS_SHOOTER_SHOOTER_H_
2#define Y2020_CONTROL_LOOPS_SHOOTER_SHOOTER_H_
3
James Kuszmaul61750662021-06-21 21:32:33 -07004#include "frc971/control_loops/control_loop.h"
Maxwell Henderson34242992024-01-07 12:39:11 -08005#include "frc971/control_loops/flywheel/flywheel_controller.h"
Sabina Davisedf89472020-02-17 15:27:37 -08006#include "frc971/control_loops/state_feedback_loop.h"
Sabina Davisedf89472020-02-17 15:27:37 -08007#include "y2020/control_loops/superstructure/superstructure_goal_generated.h"
8#include "y2020/control_loops/superstructure/superstructure_output_generated.h"
9#include "y2020/control_loops/superstructure/superstructure_position_generated.h"
10#include "y2020/control_loops/superstructure/superstructure_status_generated.h"
11
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080012namespace y2020::control_loops::superstructure::shooter {
Sabina Davisedf89472020-02-17 15:27:37 -080013
14// Handles all flywheels together.
15class Shooter {
16 public:
milind-u78f21b72021-10-10 13:47:28 -070017 static constexpr double kVelocityToleranceFinisher = 3.0;
18 static constexpr double kVelocityToleranceAccelerator = 4.0;
19
Sabina Davisedf89472020-02-17 15:27:37 -080020 Shooter();
21
22 flatbuffers::Offset<ShooterStatus> RunIteration(
23 const ShooterGoal *goal, const ShooterPosition *position,
Sabina Davis0f31d3f2020-02-20 20:41:00 -080024 flatbuffers::FlatBufferBuilder *fbb, OutputT *output,
25 const aos::monotonic_clock::time_point position_timestamp);
26
Austin Schuh01d81c32021-11-06 22:59:56 -070027 bool ready() const { return finisher_ready() && accelerator_ready(); }
milind-u0beb7dc2021-10-16 19:31:33 -070028 bool finisher_ready() const { return finisher_ready_; }
29 bool accelerator_ready() const { return accelerator_ready_; }
Sabina Davisedf89472020-02-17 15:27:37 -080030
Austin Schuh263dead2021-04-04 21:19:19 -070031 float finisher_goal() const { return finisher_.goal(); }
32 float accelerator_goal() const { return accelerator_left_.goal(); }
33
Sabina Davisedf89472020-02-17 15:27:37 -080034 private:
milind-u7baf7342021-08-25 18:31:26 -070035 // Minumum difference between the last local maximum finisher angular velocity
36 // and the current finisher angular velocity when we have a ball in the
37 // flywheel, in radians/s. This arises because the flywheel slows down when
38 // there is a ball in it. We can use this to determine when a ball is in the
39 // flywheel and when it gets shot.
40 static constexpr double kMinFinisherVelocityDipWithBall = 5.0;
41
Maxwell Henderson34242992024-01-07 12:39:11 -080042 frc971::control_loops::flywheel::FlywheelController finisher_,
43 accelerator_left_, accelerator_right_;
Sabina Davisedf89472020-02-17 15:27:37 -080044
Austin Schuh01d81c32021-11-06 22:59:56 -070045 void UpToSpeed(const ShooterGoal *goal);
milind-u0beb7dc2021-10-16 19:31:33 -070046 bool finisher_ready_ = false;
47 bool accelerator_ready_ = false;
Sabina Davis0f31d3f2020-02-20 20:41:00 -080048
milind-u7baf7342021-08-25 18:31:26 -070049 int balls_shot_ = 0;
50 bool finisher_goal_changed_ = false;
51 bool ball_in_finisher_ = false;
52 // Last local maximum in the finisher angular velocity
53 double last_finisher_velocity_max_ = 0.0;
54 // True if the finisher's average acceleration over the last dt is positive
55 bool finisher_accelerating_ = false;
56
Sabina Davisedf89472020-02-17 15:27:37 -080057 DISALLOW_COPY_AND_ASSIGN(Shooter);
58};
59
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080060} // namespace y2020::control_loops::superstructure::shooter
Sabina Davisedf89472020-02-17 15:27:37 -080061
62#endif // Y2020_CONTROL_LOOPS_SHOOTER_SHOOTER_H_