blob: f07d8403eb301dffefa860dcfc33dd75402b1174 [file] [log] [blame]
Comran Morshed5323ecb2015-12-26 20:50:55 +00001#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_H_
2#define FRC971_CONTROL_LOOPS_DRIVETRAIN_H_
3
4#include "Eigen/Dense"
5
John Park33858a32018-09-28 23:05:48 -07006#include "aos/controls/control_loop.h"
7#include "aos/controls/polytope.h"
8#include "aos/util/log_interval.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +00009#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Austin Schuh093535c2016-03-05 23:21:00 -080010#include "frc971/control_loops/drivetrain/drivetrain_config.h"
11#include "frc971/control_loops/drivetrain/gear.h"
James Kuszmaul3431d622019-02-17 17:07:44 -080012#include "frc971/control_loops/drivetrain/localizer.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +000013#include "frc971/control_loops/drivetrain/polydrivetrain.h"
14#include "frc971/control_loops/drivetrain/ssdrivetrain.h"
James Kuszmaule39cbcf2019-02-27 20:48:34 -080015#include "frc971/control_loops/drivetrain/line_follow_drivetrain.h"
James Kuszmaulef428a02019-03-02 22:19:41 -080016#include "frc971/control_loops/drivetrain/localizer.q.h"
Alex Perry731b4602019-02-02 22:13:01 -080017#include "frc971/control_loops/drivetrain/splinedrivetrain.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +000018
19namespace frc971 {
20namespace control_loops {
21namespace drivetrain {
22
23class DrivetrainLoop : public aos::controls::ControlLoop<
24 ::frc971::control_loops::DrivetrainQueue> {
25 public:
26 // Constructs a control loop which can take a Drivetrain or defaults to the
27 // drivetrain at frc971::control_loops::drivetrain
Adam Snaiderbc918b62016-02-27 21:03:39 -080028 explicit DrivetrainLoop(
Austin Schuh55a13dc2019-01-27 22:39:03 -080029 const DrivetrainConfig<double> &dt_config, ::aos::EventLoop *event_loop,
James Kuszmaul3431d622019-02-17 17:07:44 -080030 LocalizerInterface *localizer,
Austin Schuh55a13dc2019-01-27 22:39:03 -080031 const ::std::string &name = ".frc971.control_loops.drivetrain_queue");
Comran Morshed5323ecb2015-12-26 20:50:55 +000032
Austin Schuh093535c2016-03-05 23:21:00 -080033 int ControllerIndexFromGears();
34
Comran Morshed5323ecb2015-12-26 20:50:55 +000035 protected:
36 // Executes one cycle of the control loop.
Adam Snaiderbc918b62016-02-27 21:03:39 -080037 void RunIteration(
Comran Morshed5323ecb2015-12-26 20:50:55 +000038 const ::frc971::control_loops::DrivetrainQueue::Goal *goal,
39 const ::frc971::control_loops::DrivetrainQueue::Position *position,
40 ::frc971::control_loops::DrivetrainQueue::Output *output,
Adam Snaiderbc918b62016-02-27 21:03:39 -080041 ::frc971::control_loops::DrivetrainQueue::Status *status) override;
42
43 void Zero(::frc971::control_loops::DrivetrainQueue::Output *output) override;
Comran Morshed5323ecb2015-12-26 20:50:55 +000044
Comran Morshed5323ecb2015-12-26 20:50:55 +000045 double last_gyro_rate_ = 0.0;
46
Austin Schuhbcce26a2018-03-26 23:41:24 -070047 const DrivetrainConfig<double> dt_config_;
Comran Morshed5323ecb2015-12-26 20:50:55 +000048
James Kuszmaulef428a02019-03-02 22:19:41 -080049 ::aos::Fetcher<LocalizerControl> localizer_control_fetcher_;
James Kuszmaul3431d622019-02-17 17:07:44 -080050 LocalizerInterface *localizer_;
51
Diana Burgessd0180f12018-03-21 21:24:17 -070052 StateFeedbackLoop<7, 2, 4> kf_;
Austin Schuhbcce26a2018-03-26 23:41:24 -070053 PolyDrivetrain<double> dt_openloop_;
Austin Schuh41565602016-02-28 20:10:49 -080054 DrivetrainMotorsSS dt_closedloop_;
Alex Perry731b4602019-02-02 22:13:01 -080055 SplineDrivetrain dt_spline_;
James Kuszmaule39cbcf2019-02-27 20:48:34 -080056 LineFollowDrivetrain dt_line_follow_;
Austin Schuh9993fb32017-03-15 20:17:46 -070057 ::aos::monotonic_clock::time_point last_gyro_time_ =
58 ::aos::monotonic_clock::min_time;
Comran Morshed5323ecb2015-12-26 20:50:55 +000059
Austin Schuh05c5a612016-04-02 15:10:25 -070060 StateFeedbackLoop<2, 1, 1> down_estimator_;
61 Eigen::Matrix<double, 1, 1> down_U_;
62
Austin Schuh093535c2016-03-05 23:21:00 -080063 // Current gears for each drive side.
64 Gear left_gear_;
65 Gear right_gear_;
66
Comran Morshed5323ecb2015-12-26 20:50:55 +000067 double last_left_voltage_ = 0;
68 double last_right_voltage_ = 0;
James Kuszmaulf3add3c2019-03-02 14:55:00 -080069 // The left/right voltages previous to last_*_voltage_.
70 double last_last_left_voltage_ = 0;
71 double last_last_right_voltage_ = 0;
Comran Morshed5323ecb2015-12-26 20:50:55 +000072
Austin Schuh093535c2016-03-05 23:21:00 -080073 bool left_high_requested_;
74 bool right_high_requested_;
Austin Schuh5900d142016-04-03 21:35:12 -070075
76 bool has_been_enabled_ = false;
Diana Burgessd0180f12018-03-21 21:24:17 -070077
78 double last_accel_ = 0.0;
Austin Schuh3a378462019-01-04 21:48:04 -080079
Austin Schuh3a378462019-01-04 21:48:04 -080080 // Last kalman filter state.
81 ::Eigen::Matrix<double, 7, 1> last_state_ =
82 ::Eigen::Matrix<double, 7, 1>::Zero();
Comran Morshed5323ecb2015-12-26 20:50:55 +000083};
84
85} // namespace drivetrain
86} // namespace control_loops
87} // namespace frc971
88
89#endif // FRC971_CONTROL_LOOPS_DRIVETRAIN_H_