13#include "../vendor/eigen/unsupported/Eigen/MatrixFunctions"
15#include "core/math/eigen_interface.h"
16#include "core/math/systems/dare_solver.h"
17#include "core/math/systems/discretization.h"
18#include "core/math/systems/linear_system.h"
35 EMat<DIM, DIM> Q = EMat<DIM, DIM>::Zero();
36 for (
int i = 0; i < DIM; i++) {
37 Q(i, i) = 1.0 / (tolerances(i) * tolerances(i));
59template <
int STATES,
int INPUTS>
63 using MatrixA = EMat<STATES, STATES>;
64 using MatrixB = EMat<STATES, INPUTS>;
65 using VectorX = EVec<STATES>;
66 using VectorU = EVec<INPUTS>;
77 template <
int OUTPUTS>
79 const VectorU& Rtolerances,
const units::Time& dt)
92 const VectorU& Rtolerances,
const units::Time& dt)
105 const EMat<INPUTS, INPUTS>& R,
const units::Time& dt) {
106 constexpr auto [Ad, Bd] = discretize_AB(A, B, dt);
108 constexpr MatrixA S = DARE<STATES, INPUTS>(Ad, Bd, Q, R);
111 K_ = (Bd.transpose() * S * Bd + R).llt().solve(Bd.transpose() * S * Ad);
116 this->state_ = VectorX();
117 this->reference_ = VectorX();
118 this->output_ = VectorU();
130 VectorU
update(
const VectorX& x,
const VectorX& r,
const units::Time& dt = 10_ms)
override {
132 this->reference_ = r;
133 this->output_ = K_ * (this->reference_ - this->state_);
134 return this->output_;
147 template <
int OUTPUTS>
149 const units::Time& input_delay) {
150 constexpr auto [Ad, Bd] = discretize_AB(plant.
A(), plant.
B(), dt);
153 K_ = K_ * (Ad - Bd * K_).pow(input_delay / dt);
157 EMat<INPUTS, STATES> K_;
pure virtual class for generic feedback control loops.
Definition feedback.h:21
void latency_compensate(LinearSystem< STATES, INPUTS, OUTPUTS > &plant, const units::Time &dt, const units::Time &input_delay)
Definition linear_quadratic_regulator.h:148
void reset() override
Resets the internal state of the LQR.
Definition linear_quadratic_regulator.h:115
VectorU update(const VectorX &x, const VectorX &r, const units::Time &dt=10_ms) override
Definition linear_quadratic_regulator.h:130
LinearQuadraticRegulator(LinearSystem< STATES, INPUTS, OUTPUTS > &plant, const VectorX &Qtolerances, const VectorU &Rtolerances, const units::Time &dt)
Definition linear_quadratic_regulator.h:78
LinearQuadraticRegulator(const MatrixA &A, const MatrixB &B, const VectorX &Qtolerances, const VectorU &Rtolerances, const units::Time &dt)
Definition linear_quadratic_regulator.h:91
LinearQuadraticRegulator(const MatrixA &A, const MatrixB &B, const EMat< STATES, STATES > &Q, const EMat< INPUTS, INPUTS > &R, const units::Time &dt)
Definition linear_quadratic_regulator.h:104
Definition linear_system.h:16
MatrixB B()
Returns the continuous input matrix B.
Definition linear_system.h:42
MatrixA A()
Returns the continuous system matrix A.
Definition linear_system.h:39
A pure virual class to function as an interface for all feedback control loops.
EMat< DIM, DIM > cost_matrix(const EVec< DIM > &tolerances)
Definition linear_quadratic_regulator.h:34