5#include <unsupported/Eigen/MatrixFunctions>
22Eigen::Matrix<double, size, size>
37template <
int numStates>
53template <
int numStates,
int numInputs>
74template <
int numStates,
int numInputs>
82 M.template block<numStates, numStates>(0, 0) = A;
83 M.template block<numStates, numInputs>(0, numStates) = B;
87 A =
exp.template block<numStates, numStates>(0, 0);
88 B =
exp.template block<numStates, numInputs>(0, numStates);
99template <
int numStates>
103 return (contA * dt).
exp();
118template <
int numStates>
127 M.template block<numStates, numStates>(0, 0) = -contA;
128 M.template block<numStates, numStates>(0, numStates) = contQ;
129 M.template block<numStates, numStates>(numStates, 0).
setZero();
130 M.template block<numStates, numStates>(numStates, numStates) = contA.
transpose();
136 G.block(0, numStates, numStates, numStates);
137 discA = G.block(numStates, numStates, numStates, numStates).
transpose();
152template <
int numStates>
170template <
int numStates>
196template <
int numStates>
212 mat_t I = mat_t::Identity();
216 for (
int i = 0; maxIter < 0 || i < maxIter; i++) {
221 mat_t AIGHinv = lastA * (I + lastG * lastP).inverse();
223 currA = AIGHinv * lastA;
224 currG = lastG + AIGHinv * lastG * lastA.transpose();
225 currP = lastP + lastA.transpose() * lastP * (I + lastG * lastP).inverse() * lastA;
227 double error = (currP - lastP).
norm() / currP.norm();
228 if (
error > tolerance){
249template <
int stateDim,
int size,
int paramSize>
class NoiseCovMat {
254 static_assert(stateDim > 0 &&
size > 0 && paramSize > 0,
"Positive sizes are required!");
271 : func([mat](const state_t& x, const param_t& param) {
return mat; }) {}
284 const param_t&)>& func)
299 return func(x, param);
303 std::function<Eigen::Matrix<double, size, size>(
const state_t&,
const param_t&)> func;
316class NoiseCovMat<-1, -1, -1> {
318 const int stateDim,
size, paramDim;
326 NoiseCovMat(
const Eigen::VectorXd& stdDevs,
int stateDim,
int paramSize);
333 NoiseCovMat(
const Eigen::MatrixXd& mat,
int stateDim,
int paramSize);
345 NoiseCovMat(
const std::function<Eigen::MatrixXd(
const Eigen::VectorXd&,
346 const Eigen::VectorXd&)>& func,
347 int stateDim,
int size,
int paramSize);
361 Eigen::MatrixXd
get(
const Eigen::VectorXd& x,
const Eigen::VectorXd& param)
const;
364 std::function<Eigen::MatrixXd(
const Eigen::VectorXd&,
const Eigen::VectorXd&)> func;
367using NoiseCovMatX = NoiseCovMat<-1, -1, -1>;
TransposeReturnType transpose()
const DiagonalWrapper< const Derived > asDiagonal() const
ArrayWrapper< Derived > array()
const MatrixLogarithmReturnValue< Derived > log() const
const MatrixExponentialReturnValue< Derived > exp() const
const Inverse< Derived > inverse() const
static const IdentityReturnType Identity()
Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > & setZero(Index size)
Eigen::Matrix< double, size, size > get(const state_t &x, const param_t ¶m)
Gets the noise covariance matrix, given the current state and additonal parameter.
Definition StateSpaceUtil.h:298
NoiseCovMat(const std::function< Eigen::Matrix< double, size, size >(const state_t &, const param_t &)> &func)
Create a time-varying noise covariance matrix.
Definition StateSpaceUtil.h:283
NoiseCovMat(const Eigen::Matrix< double, size, 1 > &stdDevs)
Create a time-invariant noise covariance matrix modelling independent noise with the given standard d...
Definition StateSpaceUtil.h:262
NoiseCovMat(const Eigen::Matrix< double, size, size > &mat)
Create a time-invariant noise covariance matrix equal to the given matrix.
Definition StateSpaceUtil.h:270
void exp(InputArray src, OutputArray dst)
double norm(InputArray src1, int normType=NORM_L2, InputArray mask=noArray())
void error(int _code, const String &_err, const char *_func, const char *_file, int _line)
Collection of utility methods for use with state space applications.
Definition StateSpaceUtil.cpp:5
Eigen::Matrix< double, numStates, numStates > discreteToContinuous(const Eigen::Matrix< double, numStates, numStates > &A, double dt)
Convert a discrete time system matrix to continuous time.
Definition StateSpaceUtil.h:39
Eigen::Matrix< double, numStates, numStates > discretizeQ(const Eigen::Matrix< double, numStates, numStates > &contA, const Eigen::Matrix< double, numStates, numStates > &contQ, double dt)
Discretizes a continuous time additive process noise covariance matrix.
Definition StateSpaceUtil.h:154
Eigen::Matrix< double, size, size > createCovarianceMatrix(const Eigen::Matrix< double, size, 1 > &stdDevs)
Create a covariance matrix modelling independent variables with the given standard deviations.
Definition StateSpaceUtil.h:23
void discretizeAQ(const Eigen::Matrix< double, numStates, numStates > &contA, const Eigen::Matrix< double, numStates, numStates > &contQ, Eigen::Matrix< double, numStates, numStates > &discA, Eigen::Matrix< double, numStates, numStates > &discQ, double dt)
Convert a continuous time system matrix and additive process noise matrix to discrete time.
Definition StateSpaceUtil.h:119
void continuousToDiscrete(Eigen::Matrix< double, numStates, numStates > &A, Eigen::Matrix< double, numStates, numInputs > &B, double dt)
Convert continuous time system and input matrices to discrete time.
Definition StateSpaceUtil.h:75
Eigen::Matrix< double, numStates, numStates > discretizeA(const Eigen::Matrix< double, numStates, numStates > &contA, double dt)
Convert a continuous time system matrix to discrete time.
Definition StateSpaceUtil.h:101
Eigen::Matrix< double, numStates, numStates > discretizeR(const Eigen::Matrix< double, numStates, numStates > &contR, double dt)
Discretizes a continuous time additive output noise covariance matrix.
Definition StateSpaceUtil.h:172