blob: 489b4cad62612912da7153cde48e00c90c4e37f6 [file] [log] [blame]
Brian Silverman17f503e2015-08-02 18:17:18 -07001#ifndef Y2014_CONTROL_LOOPS_DRIVETRAIN_H_
2#define Y2014_CONTROL_LOOPS_DRIVETRAIN_H_
3
4#include "Eigen/Dense"
5
6#include "aos/common/controls/polytope.h"
7#include "aos/common/controls/control_loop.h"
8#include "aos/common/controls/polytope.h"
9#include "y2014/control_loops/drivetrain/drivetrain.q.h"
Austin Schuh64ebab22015-11-26 13:28:30 -080010#include "y2014/control_loops/drivetrain/polydrivetrain.h"
11#include "y2014/control_loops/drivetrain/ssdrivetrain.h"
Brian Silverman17f503e2015-08-02 18:17:18 -070012#include "aos/common/util/log_interval.h"
13
Austin Schuh6197a182015-11-28 16:04:40 -080014namespace y2014 {
Brian Silverman17f503e2015-08-02 18:17:18 -070015namespace control_loops {
Austin Schuh6197a182015-11-28 16:04:40 -080016namespace drivetrain {
Brian Silverman17f503e2015-08-02 18:17:18 -070017
Brian Silvermanb601d892015-12-20 18:24:38 -050018class DrivetrainLoop : public aos::controls::ControlLoop<
19 ::y2014::control_loops::DrivetrainQueue> {
Brian Silverman17f503e2015-08-02 18:17:18 -070020 public:
21 // Constructs a control loop which can take a Drivetrain or defaults to the
Brian Silvermanb601d892015-12-20 18:24:38 -050022 // drivetrain at y2014::control_loops::drivetrain
Austin Schuh6197a182015-11-28 16:04:40 -080023 explicit DrivetrainLoop(
Brian Silvermanb601d892015-12-20 18:24:38 -050024 ::y2014::control_loops::DrivetrainQueue *my_drivetrain =
25 &::y2014::control_loops::drivetrain_queue);
Brian Silverman17f503e2015-08-02 18:17:18 -070026
27 protected:
28 // Executes one cycle of the control loop.
29 virtual void RunIteration(
Brian Silvermanb601d892015-12-20 18:24:38 -050030 const ::y2014::control_loops::DrivetrainQueue::Goal *goal,
31 const ::y2014::control_loops::DrivetrainQueue::Position *position,
32 ::y2014::control_loops::DrivetrainQueue::Output *output,
33 ::y2014::control_loops::DrivetrainQueue::Status *status);
Brian Silverman17f503e2015-08-02 18:17:18 -070034
35 typedef ::aos::util::SimpleLogInterval SimpleLogInterval;
36 SimpleLogInterval no_position_ = SimpleLogInterval(
37 ::aos::time::Time::InSeconds(0.25), WARNING, "no position");
Austin Schuh209f1702015-11-29 17:03:00 -080038 double last_gyro_heading_ = 0.0;
39 double last_gyro_rate_ = 0.0;
Austin Schuh64ebab22015-11-26 13:28:30 -080040
Austin Schuh6613a072016-01-06 19:54:48 -080041 StateFeedbackLoop<7, 2, 3> kf_;
Austin Schuh64ebab22015-11-26 13:28:30 -080042 PolyDrivetrain dt_openloop_;
43 DrivetrainMotorsSS dt_closedloop_;
Austin Schuh209f1702015-11-29 17:03:00 -080044
45 double last_left_voltage_ = 0;
46 double last_right_voltage_ = 0;
47
48 double integrated_kf_heading_ = 0;
Brian Silverman17f503e2015-08-02 18:17:18 -070049};
50
Austin Schuh6197a182015-11-28 16:04:40 -080051} // namespace drivetrain
Brian Silverman17f503e2015-08-02 18:17:18 -070052} // namespace control_loops
Austin Schuh6197a182015-11-28 16:04:40 -080053} // namespace y2014
Brian Silverman17f503e2015-08-02 18:17:18 -070054
55#endif // Y2014_CONTROL_LOOPS_DRIVETRAIN_H_