3#include "math/eigen_interface.h"
5#include "math/systems/linear_system.h"
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
44 :
KalmanFilter(plant.A(), plant.B(), plant.C(), plant.D(), state_stddevs, measurement_stddevs) {}
57 const StateMatrix &A,
const InputMatrix &B,
const EMat<OUTPUTS, STATES> &C,
const EMat<OUTPUTS, INPUTS> &D,
58 const StateVector &state_stddevs,
const OutputVector &measurement_stddevs
65 Q_ = state_stddevs.asDiagonal();
66 Q_ = Q_ * Q_.transpose();
67 R_ = measurement_stddevs.asDiagonal();
68 R_ = R_ * R_.transpose();
76 StateMatrix
P()
const {
return P_; }
83 void set_P(
const StateMatrix &
P) { P_ =
P; }
88 const StateVector &
xhat()
const {
return xhat_; }
95 double xhat(
int i)
const {
return xhat_(i); }
107 void set_xhat(
int i,
double value) { xhat_(i) = value; }
123 void predict(
const InputVector &u,
const double &dt) {
125 EMat<STATES, STATES> Q = Q_ * dt;
126 auto [A, B] = discretize_AB(A_, B_, dt);
129 xhat_ = A * xhat_ + B * u;
132 P_ = A * P_ * A.transpose() + Q;
152 void correct(
const OutputVector &y,
const InputVector &u,
const EMat<OUTPUTS, OUTPUTS> &R) {
170 const EVec<ROWS> &y,
const InputVector &u,
const EMat<ROWS, STATES> &C,
const EMat<ROWS, INPUTS> &D,
171 const EMat<ROWS, ROWS> &R
177 EMat<ROWS, ROWS> Py = C * P_ * C.transpose() + R;
183 EMat<STATES, ROWS> K = Py.transpose().ldlt().solve(C * P_.transpose()).transpose();
189 xhat_ += K * (y - (C * xhat_ + D * u));
195 P_ = (EMat<STATES, STATES>::Identity() - K * C) * P_ * (EMat<STATES, STATES>::Identity() - K * C).transpose() +
196 K * R * K.transpose();
204 EMat<OUTPUTS, OUTPUTS> R_;
207 EMat<STATES, INPUTS> B_;
208 EMat<OUTPUTS, STATES> C_;
209 EMat<OUTPUTS, INPUTS> D_;
Definition kalman_filter.h:24
StateMatrix P() const
Definition kalman_filter.h:76
void set_P(const StateMatrix &P)
Definition kalman_filter.h:83
const StateVector & xhat() const
Definition kalman_filter.h:88
void correct(const OutputVector &y, const InputVector &u)
Definition kalman_filter.h:141
double xhat(int i) const
Definition kalman_filter.h:95
void reset()
Definition kalman_filter.h:112
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:56
void set_xhat(int i, double value)
Definition kalman_filter.h:107
void set_xhat(const StateVector &xhat)
Definition kalman_filter.h:100
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:169
void correct(const OutputVector &y, const InputVector &u, const EMat< OUTPUTS, OUTPUTS > &R)
Definition kalman_filter.h:152
void predict(const InputVector &u, const double &dt)
Definition kalman_filter.h:123
Definition linear_system.h:17