blob: 2a79df6e127ea14eeabd054b93fe0e3333b864df [file] [log] [blame]
Alex Perry731b4602019-02-02 22:13:01 -08001#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_
2#define FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_
3
Alex Perrya71badb2019-02-06 19:40:41 -08004#include "Eigen/Dense"
5
Alex Perry731b4602019-02-02 22:13:01 -08006#include "frc971/control_loops/drivetrain/distance_spline.h"
7#include "frc971/control_loops/drivetrain/drivetrain.q.h"
8#include "frc971/control_loops/drivetrain/drivetrain_config.h"
9#include "frc971/control_loops/drivetrain/spline.h"
10#include "frc971/control_loops/drivetrain/trajectory.h"
11
12namespace frc971 {
13namespace control_loops {
14namespace drivetrain {
15
16class SplineDrivetrain {
17 public:
18 SplineDrivetrain(const DrivetrainConfig<double> &dt_config);
19
20 void SetGoal(const ::frc971::control_loops::DrivetrainQueue::Goal &goal);
21
Alex Perrye32eabc2019-02-08 19:51:19 -080022 void Update(bool enabled, const ::Eigen::Matrix<double, 5, 1> &state);
Alex Perrya71badb2019-02-06 19:40:41 -080023
Alex Perry731b4602019-02-02 22:13:01 -080024 void SetOutput(
25 ::frc971::control_loops::DrivetrainQueue::Output *output);
26 // TODO(alex): What status do we need?
27 void PopulateStatus(
28 ::frc971::control_loops::DrivetrainQueue::Status *status) const;
James Kuszmaul1057ce82019-02-09 17:58:24 -080029
30 // Accessor for the current goal state, pretty much only present for debugging
31 // purposes.
32 Eigen::Matrix<double, 5, 1> CurrentGoalState() const {
33 return current_trajectory_->GoalState(current_xva_(0), current_xva_(1));
34 }
35
36 bool IsAtEnd() const {
37 return current_trajectory_->is_at_end(current_state_);
38 }
Alex Perry731b4602019-02-02 22:13:01 -080039 private:
Alex Perrye32eabc2019-02-08 19:51:19 -080040 void ScaleCapU(Eigen::Matrix<double, 2, 1> *U);
41
Alex Perry731b4602019-02-02 22:13:01 -080042 const DrivetrainConfig<double> dt_config_;
43
44 uint32_t current_spline_handle_; // Current spline told to excecute.
45 uint32_t current_spline_idx_; // Current excecuting spline.
46 ::std::unique_ptr<DistanceSpline> distance_spline_;
47 ::std::unique_ptr<Trajectory> current_trajectory_;
Alex Perrya71badb2019-02-06 19:40:41 -080048 ::Eigen::Matrix<double, 3, 1> current_xva_, next_xva_;
49 ::Eigen::Matrix<double, 2, 1> current_state_;
Alex Perrye32eabc2019-02-08 19:51:19 -080050 ::Eigen::Matrix<double, 2, 1> next_U_;
51 ::Eigen::Matrix<double, 2, 1> uncapped_U_;
52
53 bool enable_;
54
55 // TODO(alex): pull this out of dt_config.
56 const ::Eigen::DiagonalMatrix<double, 5> Q =
57 (::Eigen::DiagonalMatrix<double, 5>().diagonal()
58 << 1.0 / ::std::pow(0.05, 2),
59 1.0 / ::std::pow(0.05, 2), 1.0 / ::std::pow(0.2, 2),
60 1.0 / ::std::pow(0.5, 2), 1.0 / ::std::pow(0.5, 2))
61 .finished()
62 .asDiagonal();
63 const ::Eigen::DiagonalMatrix<double, 2> R =
64 (::Eigen::DiagonalMatrix<double, 2>().diagonal()
65 << 1.0 / ::std::pow(12.0, 2),
66 1.0 / ::std::pow(12.0, 2))
67 .finished()
68 .asDiagonal();
Alex Perry731b4602019-02-02 22:13:01 -080069};
70
71} // namespace drivetrain
72} // namespace control_loops
73} // namespace frc971
74
75#endif // FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_