3#include "core/math/eigen_interface.h"
4#include "core/math/systems/linear_system.h"
23template <
int STATES,
int INPUTS,
int OUTPUTS>
26 using StateVector = EVec<STATES>;
27 using InputVector = EVec<INPUTS>;
28 using OutputVector = EVec<OUTPUTS>;
30 using StateMatrix = EMat<STATES, STATES>;
31 using InputMatrix = EMat<STATES, INPUTS>;
42 const OutputVector& measurement_stddevs
45 plant.A(), plant.B(), plant.C(), plant.D(), state_stddevs, measurement_stddevs
59 const StateMatrix& A,
const InputMatrix& B,
const EMat<OUTPUTS, STATES>& C,
60 const EMat<OUTPUTS, INPUTS>& D,
const StateVector& state_stddevs,
61 const OutputVector& measurement_stddevs
68 Q_ = state_stddevs.asDiagonal();
69 Q_ = Q_ * Q_.transpose();
70 R_ = measurement_stddevs.asDiagonal();
71 R_ = R_ * R_.transpose();
77 StateMatrix
P()
const {
return P_; }
84 void set_P(
const StateMatrix&
P) { P_ =
P; }
87 const StateVector&
xhat()
const {
return xhat_; }
94 double xhat(
int i)
const {
return xhat_(i); }
104 void set_xhat(
int i,
double value) { xhat_(i) = value; }
118 void predict(
const InputVector& u,
const double& dt) {
120 EMat<STATES, STATES> Q = Q_ * dt;
121 auto [A, B] = discretize_AB(A_, B_, dt);
124 xhat_ = A * xhat_ + B * u;
127 P_ = A * P_ * A.transpose() + Q;
147 void correct(
const OutputVector& y,
const InputVector& u,
const EMat<OUTPUTS, OUTPUTS>& R) {
165 const EVec<ROWS>& y,
const InputVector& u,
const EMat<ROWS, STATES>& C,
166 const EMat<ROWS, INPUTS>& D,
const EMat<ROWS, ROWS>& R
174 EMat<ROWS, ROWS> Py = C * P_ * C.transpose() + R;
181 EMat<STATES, ROWS> K = Py.transpose().ldlt().solve(C * P_.transpose()).transpose();
188 xhat_ += K * (y - (C * xhat_ + D * u));
195 P_ = (EMat<STATES, STATES>::Identity() - K * C) * P_ *
196 (EMat<STATES, STATES>::Identity() - K * C).transpose() +
197 K * R * K.transpose();
205 EMat<OUTPUTS, OUTPUTS> R_;
208 EMat<STATES, INPUTS> B_;
209 EMat<OUTPUTS, STATES> C_;
210 EMat<OUTPUTS, INPUTS> D_;
216template <
int STATES,
int INPUTS,
int OUTPUTS>
Definition kalman_filter.h:24
StateMatrix P() const
Returns the covariance matrix P.
Definition kalman_filter.h:77
void set_P(const StateMatrix &P)
Definition kalman_filter.h:84
const StateVector & xhat() const
Returns the current state estimate x-hat.
Definition kalman_filter.h:87
void correct(const OutputVector &y, const InputVector &u)
Definition kalman_filter.h:136
double xhat(int i) const
Definition kalman_filter.h:94
void reset()
Resets the filter.
Definition kalman_filter.h:107
KalmanFilter(const StateMatrix &A, const InputMatrix &B, const EMat< OUTPUTS, STATES > &C, const EMat< OUTPUTS, INPUTS > &D, const StateVector &state_stddevs, const OutputVector &measurement_stddevs)
Definition kalman_filter.h:58
void set_xhat(int i, double value)
Definition kalman_filter.h:104
void set_xhat(const StateVector &xhat)
Set the current state estimate x-hat.
Definition kalman_filter.h:97
KalmanFilter(LinearSystem< STATES, INPUTS, OUTPUTS > &plant, const StateVector &state_stddevs, const OutputVector &measurement_stddevs)
Definition kalman_filter.h:40
void correct(const EVec< ROWS > &y, const InputVector &u, const EMat< ROWS, STATES > &C, const EMat< ROWS, INPUTS > &D, const EMat< ROWS, ROWS > &R)
Definition kalman_filter.h:164
void correct(const OutputVector &y, const InputVector &u, const EMat< OUTPUTS, OUTPUTS > &R)
Definition kalman_filter.h:147
void predict(const InputVector &u, const double &dt)
Definition kalman_filter.h:118
Definition linear_system.h:16