blob: 9cc515f29e91311dd22fa6e18894761aed74dc64 [file] [log] [blame]
Tyler Chatow2737d2a2017-02-08 21:20:51 -08001#ifndef Y2017_CONTROL_LOOPS_SHOOTER_SHOOTER_H_
2#define Y2017_CONTROL_LOOPS_SHOOTER_SHOOTER_H_
3
Austin Schuh169f5f22017-02-18 16:31:13 -08004#include <array>
Tyler Chatow2737d2a2017-02-08 21:20:51 -08005#include <memory>
6
Alex Perrycb7da4b2019-08-28 19:35:56 -07007#include "Eigen/Dense"
Tyler Chatow2737d2a2017-02-08 21:20:51 -08008
Philipp Schrader790cb542023-07-05 21:06:52 -07009#include "aos/time/time.h"
10#include "frc971/control_loops/control_loop.h"
11#include "frc971/control_loops/state_feedback_loop.h"
Tyler Chatow2737d2a2017-02-08 21:20:51 -080012#include "y2017/control_loops/superstructure/shooter/shooter_integral_plant.h"
Alex Perrycb7da4b2019-08-28 19:35:56 -070013#include "y2017/control_loops/superstructure/superstructure_goal_generated.h"
14#include "y2017/control_loops/superstructure/superstructure_status_generated.h"
Tyler Chatow2737d2a2017-02-08 21:20:51 -080015
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -080016namespace y2017::control_loops::superstructure::shooter {
Tyler Chatow2737d2a2017-02-08 21:20:51 -080017
18class ShooterController {
19 public:
20 ShooterController();
21
22 // Sets the velocity goal in radians/sec
23 void set_goal(double angular_velocity_goal);
24 // Sets the current encoder position in radians
25 void set_position(double current_position);
26
27 // Populates the status structure.
Alex Perrycb7da4b2019-08-28 19:35:56 -070028 flatbuffers::Offset<ShooterStatus> BuildStatus(
29 flatbuffers::FlatBufferBuilder *fbb);
Tyler Chatow2737d2a2017-02-08 21:20:51 -080030
31 // Returns the control loop calculated voltage.
32 double voltage() const;
33
34 // Returns the instantaneous velocity.
Austin Schuhc66b6fc2017-03-25 19:56:59 -070035 double velocity() const { return loop_->X_hat(2, 0); }
36 double voltage_error() const { return loop_->X_hat(3, 0); }
Tyler Chatow2737d2a2017-02-08 21:20:51 -080037
38 double dt_velocity() const { return dt_velocity_; }
39
40 double error() const { return error_; }
41
42 // Executes the control loop for a cycle.
Austin Schuh932a5ce2017-03-05 01:04:18 -080043 void Update(bool disabled, ::std::chrono::nanoseconds dt);
Tyler Chatow2737d2a2017-02-08 21:20:51 -080044
45 // Resets the kalman filter and any other internal state.
46 void Reset();
47
Alex Perrycb7da4b2019-08-28 19:35:56 -070048 bool ready() { return ready_; }
49
Tyler Chatow2737d2a2017-02-08 21:20:51 -080050 private:
51 // The current sensor measurement.
52 Eigen::Matrix<double, 1, 1> Y_;
53 // The control loop.
Austin Schuh20388b62017-11-23 22:40:46 -080054 ::std::unique_ptr<
55 StateFeedbackLoop<4, 1, 1, double, StateFeedbackHybridPlant<4, 1, 1>,
56 HybridKalman<4, 1, 1>>>
Austin Schuh3ad5ed82017-02-25 21:36:19 -080057 loop_;
Tyler Chatow2737d2a2017-02-08 21:20:51 -080058
59 // History array for calculating a filtered angular velocity.
60 static constexpr int kHistoryLength = 5;
61 ::std::array<double, kHistoryLength> history_;
62 ptrdiff_t history_position_ = 0;
63
64 double error_ = 0.0;
Austin Schuh932a5ce2017-03-05 01:04:18 -080065 double dt_position_ = 0.0;
Tyler Chatow2737d2a2017-02-08 21:20:51 -080066 double dt_velocity_ = 0.0;
Austin Schuh932a5ce2017-03-05 01:04:18 -080067 double fixed_dt_velocity_ = 0.0;
Tyler Chatow2737d2a2017-02-08 21:20:51 -080068 double last_position_ = 0.0;
69 double average_angular_velocity_ = 0.0;
70 double min_velocity_ = 0.0;
71 double position_error_ = 0.0;
72
Austin Schuhc66b6fc2017-03-25 19:56:59 -070073 Eigen::Matrix<double, 4, 1> X_hat_current_;
Tyler Chatow2737d2a2017-02-08 21:20:51 -080074
75 bool ready_ = false;
76 bool needs_reset_ = false;
77 bool reset_ = false;
78
79 bool last_ready_ = false;
80 DISALLOW_COPY_AND_ASSIGN(ShooterController);
81};
82
83class Shooter {
84 public:
85 Shooter() {}
86
87 // Iterates the shooter control loop one cycle. position and status must
88 // never be nullptr. goal can be nullptr if no goal exists, and output should
89 // be nullptr if disabled.
Alex Perrycb7da4b2019-08-28 19:35:56 -070090 flatbuffers::Offset<ShooterStatus> Iterate(
91 const ShooterGoalT *goal, const double position,
92 ::aos::monotonic_clock::time_point position_time, double *output,
93 flatbuffers::FlatBufferBuilder *fbb);
Tyler Chatow2737d2a2017-02-08 21:20:51 -080094
95 // Sets the shooter up to reset the kalman filter next time Iterate is called.
96 void Reset();
97
98 private:
99 ShooterController wheel_;
100
101 bool last_ready_ = false;
102 double min_ = 0.0;
Austin Schuh932a5ce2017-03-05 01:04:18 -0800103 ::aos::monotonic_clock::time_point last_time_ =
104 ::aos::monotonic_clock::min_time;
Tyler Chatow2737d2a2017-02-08 21:20:51 -0800105
106 DISALLOW_COPY_AND_ASSIGN(Shooter);
107};
108
Stephan Pleinesd99b1ee2024-02-02 20:56:44 -0800109} // namespace y2017::control_loops::superstructure::shooter
Tyler Chatow2737d2a2017-02-08 21:20:51 -0800110
111#endif // Y2017_CONTROL_LOOPS_SHOOTER_SHOOTER_H_