11#include <Eigen/Cholesky>
50template <
int States,
int Inputs,
int Outputs>
88 const auto& C = plant.
C();
91 std::string msg = fmt::format(
92 "The system passed to the Kalman filter is undetectable!\n\n"
97 throw std::invalid_argument(msg);
117 m_K =
S.transpose().ldlt().solve(C * P.value().transpose()).transpose();
121 fmt::format(
"{}\n\nQ =\n{}\n",
to_string(P.error()), discQ);
124 throw std::invalid_argument(msg);
128 fmt::format(
"{}\n\nR =\n{}\n",
to_string(P.error()), discR);
131 throw std::invalid_argument(msg);
133 std::string msg = fmt::format(
134 "The (A, C) pair is not detectable.\n\nA =\n{}\nC =\n{}\n",
138 throw std::invalid_argument(msg);
140 std::string msg = fmt::format(
"{}\n\nA =\n{}\nQ =\n{}\n",
144 throw std::invalid_argument(msg);
164 double K(
int i,
int j)
const {
return m_K(i, j); }
176 double Xhat(
int i)
const {
return m_xHat(i); }
191 void SetXhat(
int i,
double value) { m_xHat(i) = value; }
205 m_xHat = m_plant->CalculateX(m_xHat, u, dt);
215 const auto& C = m_plant->C();
216 const auto& D = m_plant->D();
219 m_xHat += m_K * (y - (C * m_xHat + D * u));
237 SteadyStateKalmanFilter<1, 1, 1>;
239 SteadyStateKalmanFilter<2, 1, 1>;
#define WPILIB_DLLEXPORT
Definition SymbolExports.h:36
#define EXPORT_TEMPLATE_DECLARE(export)
Definition SymbolExports.hpp:92
A plant defined using state-space notation.
Definition LinearSystem.h:35
constexpr const Matrixd< Outputs, States > & C() const
Returns the output matrix C.
Definition LinearSystem.h:130
constexpr const Matrixd< States, States > & A() const
Returns the system matrix A.
Definition LinearSystem.h:104
A Kalman filter combines predictions from a model and measurements to give an estimate of the true sy...
Definition SteadyStateKalmanFilter.h:51
void SetXhat(const StateVector &xHat)
Set initial state estimate x-hat.
Definition SteadyStateKalmanFilter.h:183
SteadyStateKalmanFilter & operator=(SteadyStateKalmanFilter &&)=default
SteadyStateKalmanFilter(LinearSystem< States, Inputs, Outputs > &plant, const StateArray &stateStdDevs, const OutputArray &measurementStdDevs, units::second_t dt)
Constructs a steady-state Kalman filter with the given plant.
Definition SteadyStateKalmanFilter.h:73
void Correct(const InputVector &u, const OutputVector &y)
Correct the state estimate x-hat using the measurements in y.
Definition SteadyStateKalmanFilter.h:214
void Predict(const InputVector &u, units::second_t dt)
Project the model into the future with a new control input u.
Definition SteadyStateKalmanFilter.h:204
void Reset()
Resets the observer.
Definition SteadyStateKalmanFilter.h:196
void SetXhat(int i, double value)
Set an element of the initial state estimate x-hat.
Definition SteadyStateKalmanFilter.h:191
double K(int i, int j) const
Returns an element of the steady-state Kalman gain matrix K.
Definition SteadyStateKalmanFilter.h:164
double Xhat(int i) const
Returns an element of the state estimate x-hat.
Definition SteadyStateKalmanFilter.h:176
const Matrixd< States, Outputs > & K() const
Returns the steady-state Kalman gain matrix K.
Definition SteadyStateKalmanFilter.h:156
Vectord< Outputs > OutputVector
Definition SteadyStateKalmanFilter.h:55
SteadyStateKalmanFilter(SteadyStateKalmanFilter &&)=default
Vectord< Inputs > InputVector
Definition SteadyStateKalmanFilter.h:54
const StateVector & Xhat() const
Returns the state estimate x-hat.
Definition SteadyStateKalmanFilter.h:169
Vectord< States > StateVector
Definition SteadyStateKalmanFilter.h:53
This class is a wrapper around std::array that does compile time size checking.
Definition array.h:26
static void ReportError(const S &format, Args &&... args)
Definition MathShared.h:62
void DiscretizeAQ(const Matrixd< States, States > &contA, const Matrixd< States, States > &contQ, units::second_t dt, Matrixd< States, States > *discA, Matrixd< States, States > *discQ)
Discretizes the given continuous A and Q matrices.
Definition Discretization.h:71
Eigen::Matrix< double, Rows, Cols, Options, MaxRows, MaxCols > Matrixd
Definition EigenCore.h:21
Eigen::Vector< double, Size > Vectord
Definition EigenCore.h:12
Matrixd< Outputs, Outputs > DiscretizeR(const Matrixd< Outputs, Outputs > &R, units::second_t dt)
Returns a discretized version of the provided continuous measurement noise covariance matrix.
Definition Discretization.h:113
constexpr Matrixd< sizeof...(Ts), sizeof...(Ts)> MakeCovMatrix(Ts... stdDevs)
Creates a covariance matrix from the given vector for use with Kalman filters.
Definition StateSpaceUtil.h:75
wpi::expected< Eigen::Matrix< double, States, States >, DAREError > DARE(const Eigen::Matrix< double, States, States > &A, const Eigen::Matrix< double, States, Inputs > &B, const Eigen::Matrix< double, States, States > &Q, const Eigen::Matrix< double, Inputs, Inputs > &R, bool checkPreconditions=true)
Computes the unique stabilizing solution X to the discrete-time algebraic Riccati equation:
Definition DARE.h:165
constexpr std::string_view to_string(const DAREError &error)
Converts the given DAREError enum to a string.
Definition DARE.h:39
@ QNotPositiveSemidefinite
Q was not positive semidefinite.
@ RNotSymmetric
R was not symmetric.
@ QNotSymmetric
Q was not symmetric.
@ ACNotDetectable
(A, C) pair where Q = CᵀC was not detectable.
@ RNotPositiveDefinite
R was not positive definite.
@ ABNotStabilizable
(A, B) pair was not stabilizable.
bool IsDetectable(const Matrixd< States, States > &A, const Matrixd< Outputs, States > &C)
Returns true if (A, C) is a detectable pair.
Definition StateSpaceUtil.h:309
#define S(label, offset, message)
Definition Errors.h:113