blob: 76df3fd19ac30491c7f44579a92b1878ef9f3783 [file] [log] [blame]
Brian Silvermanc71537c2016-01-01 13:43:14 -08001#ifndef Y2014_CONTROL_LOOPS_DRIVETRAIN_SSDRIVETRAIN_H_
2#define Y2014_CONTROL_LOOPS_DRIVETRAIN_SSDRIVETRAIN_H_
3
4#include "aos/common/controls/polytope.h"
5#include "aos/common/commonmath.h"
6#include "aos/common/logging/matrix_logging.h"
7
8#include "frc971/control_loops/state_feedback_loop.h"
9#include "frc971/control_loops/coerce_goal.h"
10#include "y2012/control_loops/drivetrain/drivetrain.q.h"
11
12namespace y2012 {
13namespace control_loops {
14namespace drivetrain {
15
16class DrivetrainMotorsSS {
17 public:
18 class LimitedDrivetrainLoop : public StateFeedbackLoop<4, 2, 2> {
19 public:
20 LimitedDrivetrainLoop(StateFeedbackLoop<4, 2, 2> &&loop);
21
22 bool output_was_capped() const {
23 return output_was_capped_;
24 }
25
26 private:
27 void CapU() override;
28
29 const ::aos::controls::HPolytope<2> U_Poly_;
30 Eigen::Matrix<double, 2, 2> T, T_inverse;
31 bool output_was_capped_ = false;;
32 };
33
34 DrivetrainMotorsSS();
35
36 void SetGoal(double left, double left_velocity, double right,
37 double right_velocity);
38
39 void SetRawPosition(double left, double right);
40
41 void SetPosition(double left, double right, double gyro);
42
43 void SetExternalMotors(double left_voltage, double right_voltage);
44
45 void Update(bool stop_motors, bool enable_control_loop);
46
47 double GetEstimatedRobotSpeed() const;
48
49 double GetEstimatedLeftEncoder() const {
50 return loop_->X_hat(0, 0);
51 }
52
53 double left_velocity() const { return loop_->X_hat(1, 0); }
54 double right_velocity() const { return loop_->X_hat(3, 0); }
55
56 double GetEstimatedRightEncoder() const {
57 return loop_->X_hat(2, 0);
58 }
59
60 bool OutputWasCapped() const {
61 return loop_->output_was_capped();
62 }
63
64 void SendMotors(
65 ::y2012::control_loops::DrivetrainQueue::Output *output) const;
66
67 const LimitedDrivetrainLoop &loop() const { return *loop_; }
68
69 private:
70 ::std::unique_ptr<LimitedDrivetrainLoop> loop_;
71
72 double filtered_offset_;
73 double gyro_;
74 double left_goal_;
75 double right_goal_;
76 double raw_left_;
77 double raw_right_;
78};
79
80} // namespace drivetrain
81} // namespace control_loops
82} // namespace y2012
83
84#endif // Y2014_CONTROL_LOOPS_DRIVETRAIN_SSDRIVETRAIN_H_