blob: 2a79df6e127ea14eeabd054b93fe0e3333b864df [file] [log] [blame]
#ifndef FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_
#define FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_
#include "Eigen/Dense"
#include "frc971/control_loops/drivetrain/distance_spline.h"
#include "frc971/control_loops/drivetrain/drivetrain.q.h"
#include "frc971/control_loops/drivetrain/drivetrain_config.h"
#include "frc971/control_loops/drivetrain/spline.h"
#include "frc971/control_loops/drivetrain/trajectory.h"
namespace frc971 {
namespace control_loops {
namespace drivetrain {
class SplineDrivetrain {
public:
SplineDrivetrain(const DrivetrainConfig<double> &dt_config);
void SetGoal(const ::frc971::control_loops::DrivetrainQueue::Goal &goal);
void Update(bool enabled, const ::Eigen::Matrix<double, 5, 1> &state);
void SetOutput(
::frc971::control_loops::DrivetrainQueue::Output *output);
// TODO(alex): What status do we need?
void PopulateStatus(
::frc971::control_loops::DrivetrainQueue::Status *status) const;
// Accessor for the current goal state, pretty much only present for debugging
// purposes.
Eigen::Matrix<double, 5, 1> CurrentGoalState() const {
return current_trajectory_->GoalState(current_xva_(0), current_xva_(1));
}
bool IsAtEnd() const {
return current_trajectory_->is_at_end(current_state_);
}
private:
void ScaleCapU(Eigen::Matrix<double, 2, 1> *U);
const DrivetrainConfig<double> dt_config_;
uint32_t current_spline_handle_; // Current spline told to excecute.
uint32_t current_spline_idx_; // Current excecuting spline.
::std::unique_ptr<DistanceSpline> distance_spline_;
::std::unique_ptr<Trajectory> current_trajectory_;
::Eigen::Matrix<double, 3, 1> current_xva_, next_xva_;
::Eigen::Matrix<double, 2, 1> current_state_;
::Eigen::Matrix<double, 2, 1> next_U_;
::Eigen::Matrix<double, 2, 1> uncapped_U_;
bool enable_;
// TODO(alex): pull this out of dt_config.
const ::Eigen::DiagonalMatrix<double, 5> Q =
(::Eigen::DiagonalMatrix<double, 5>().diagonal()
<< 1.0 / ::std::pow(0.05, 2),
1.0 / ::std::pow(0.05, 2), 1.0 / ::std::pow(0.2, 2),
1.0 / ::std::pow(0.5, 2), 1.0 / ::std::pow(0.5, 2))
.finished()
.asDiagonal();
const ::Eigen::DiagonalMatrix<double, 2> R =
(::Eigen::DiagonalMatrix<double, 2>().diagonal()
<< 1.0 / ::std::pow(12.0, 2),
1.0 / ::std::pow(12.0, 2))
.finished()
.asDiagonal();
};
} // namespace drivetrain
} // namespace control_loops
} // namespace frc971
#endif // FRC971_CONTROL_LOOPS_DRIVETRAIN_SPLINEDRIVETRAIN_H_