blob: 2b4c1f77bc04d5a1352cc784ac4e138873e02955 [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
Comran Morshed5323ecb2015-12-26 20:50:55 +00006#include "aos/common/controls/control_loop.h"
7#include "aos/common/controls/polytope.h"
Austin Schuh093535c2016-03-05 23:21:00 -08008#include "aos/common/controls/polytope.h"
9#include "aos/common/util/log_interval.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +000010#include "frc971/control_loops/drivetrain/drivetrain.q.h"
Austin Schuh093535c2016-03-05 23:21:00 -080011#include "frc971/control_loops/drivetrain/drivetrain_config.h"
12#include "frc971/control_loops/drivetrain/gear.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +000013#include "frc971/control_loops/drivetrain/polydrivetrain.h"
14#include "frc971/control_loops/drivetrain/ssdrivetrain.h"
Comran Morshed5323ecb2015-12-26 20:50:55 +000015
16namespace frc971 {
17namespace control_loops {
18namespace drivetrain {
19
20class DrivetrainLoop : public aos::controls::ControlLoop<
21 ::frc971::control_loops::DrivetrainQueue> {
22 public:
23 // Constructs a control loop which can take a Drivetrain or defaults to the
24 // drivetrain at frc971::control_loops::drivetrain
Adam Snaiderbc918b62016-02-27 21:03:39 -080025 explicit DrivetrainLoop(
26 const DrivetrainConfig &dt_config,
Comran Morshed5323ecb2015-12-26 20:50:55 +000027 ::frc971::control_loops::DrivetrainQueue *my_drivetrain =
28 &::frc971::control_loops::drivetrain_queue);
29
Austin Schuh093535c2016-03-05 23:21:00 -080030 int ControllerIndexFromGears();
31
Comran Morshed5323ecb2015-12-26 20:50:55 +000032 protected:
33 // Executes one cycle of the control loop.
Adam Snaiderbc918b62016-02-27 21:03:39 -080034 void RunIteration(
Comran Morshed5323ecb2015-12-26 20:50:55 +000035 const ::frc971::control_loops::DrivetrainQueue::Goal *goal,
36 const ::frc971::control_loops::DrivetrainQueue::Position *position,
37 ::frc971::control_loops::DrivetrainQueue::Output *output,
Adam Snaiderbc918b62016-02-27 21:03:39 -080038 ::frc971::control_loops::DrivetrainQueue::Status *status) override;
39
40 void Zero(::frc971::control_loops::DrivetrainQueue::Output *output) override;
Comran Morshed5323ecb2015-12-26 20:50:55 +000041
Comran Morshed5323ecb2015-12-26 20:50:55 +000042 double last_gyro_rate_ = 0.0;
43
44 const DrivetrainConfig dt_config_;
45
Comran Morshed5323ecb2015-12-26 20:50:55 +000046 StateFeedbackLoop<7, 2, 3> kf_;
Austin Schuh41565602016-02-28 20:10:49 -080047 PolyDrivetrain dt_openloop_;
48 DrivetrainMotorsSS dt_closedloop_;
Austin Schuh9993fb32017-03-15 20:17:46 -070049 ::aos::monotonic_clock::time_point last_gyro_time_ =
50 ::aos::monotonic_clock::min_time;
Comran Morshed5323ecb2015-12-26 20:50:55 +000051
Austin Schuh05c5a612016-04-02 15:10:25 -070052 StateFeedbackLoop<2, 1, 1> down_estimator_;
53 Eigen::Matrix<double, 1, 1> down_U_;
54
Austin Schuh093535c2016-03-05 23:21:00 -080055 // Current gears for each drive side.
56 Gear left_gear_;
57 Gear right_gear_;
58
Comran Morshed5323ecb2015-12-26 20:50:55 +000059 double last_left_voltage_ = 0;
60 double last_right_voltage_ = 0;
61
62 double integrated_kf_heading_ = 0;
Austin Schuh093535c2016-03-05 23:21:00 -080063
64 bool left_high_requested_;
65 bool right_high_requested_;
Austin Schuh5900d142016-04-03 21:35:12 -070066
67 bool has_been_enabled_ = false;
Comran Morshed5323ecb2015-12-26 20:50:55 +000068};
69
70} // namespace drivetrain
71} // namespace control_loops
72} // namespace frc971
73
74#endif // FRC971_CONTROL_LOOPS_DRIVETRAIN_H_