3#include "KalmanFilterBase.h"
4#include "StateSpaceUtil.h"
28template <
int stateDim,
int inputDim,
int outputDim,
int processNoiseDim,
int outputNoiseDim>
34 using statefunc_t = std::function<state_t(
36 using outputfunc_t = std::function<output_t(
54 : stateFunc(stateFunc), outputFunc(outputFunc), Q(processNoise), R(outputNoise),
59 getStateFuncJacobianX(stateFunc, this->xHat, input);
61 Q.get(this->xHat, input);
64 getStateFuncJacobianW(stateFunc, this->xHat, input);
66 this->xHat = stateFunc(this->xHat, input, processnoise_t::Zero());
79 getOutputFuncJacobianX(outputFunc, this->xHat);
82 R.get(this->xHat, measurement);
84 getOutputFuncJacobianV(outputFunc, this->xHat);
91 output_t y = measurement -
92 outputFunc(this->xHat, outputnoise_t::Zero());
94 this->xHat = this->xHat + K * y;
103 std::function<Eigen::Matrix<double, stateDim, stateDim>(
const state_t&,
const input_t&,
104 const processnoise_t&)>
111 std::function<Eigen::Matrix<double, stateDim, processNoiseDim>(
112 const state_t&,
const input_t&,
const processnoise_t&)>
119 std::function<Eigen::Matrix<double, outputDim, stateDim>(
const state_t&,
120 const outputnoise_t&)>
127 std::function<Eigen::Matrix<double, outputDim, outputNoiseDim>(
const state_t&,
128 const outputnoise_t&)>
132 statefunc_t stateFunc;
133 outputfunc_t outputFunc;
138 static constexpr double epsilon = 1e-5;
141 getStateFuncJacobianX(
const statefunc_t& f,
const state_t& x,
const input_t& u)
const {
142 processnoise_t w = processnoise_t::Zero();
148 for (
int i = 0; i < stateDim; i++) {
149 state_t delta = state_t::Zero();
151 state_t derivative = (f(x + delta, u, w) - f(x - delta, u, w)) / (2 * epsilon);
152 jacobian.col(i) = derivative;
159 getStateFuncJacobianW(
const statefunc_t& f,
const state_t& x,
const input_t& u)
const {
160 processnoise_t w = processnoise_t::Zero();
166 for (
int i = 0; i < processNoiseDim; i++) {
167 processnoise_t delta = processnoise_t::Zero();
169 state_t derivative = (f(x, u, w + delta) - f(x, u, w - delta)) / (2 * epsilon);
170 jacobian.col(i) = derivative;
176 Eigen::Matrix<double, outputDim, stateDim> getOutputFuncJacobianX(
const outputfunc_t& f,
177 const state_t& x)
const {
178 outputnoise_t
v = outputnoise_t::Zero();
183 Eigen::Matrix<double, outputDim, stateDim> jacobian;
184 for (
int i = 0; i < stateDim; i++) {
187 output_t derivative = (f(x + delta,
v) - f(x - delta,
v)) / (2 * epsilon);
188 jacobian.col(i) = derivative;
194 Eigen::Matrix<double, outputDim, outputNoiseDim>
195 getOutputFuncJacobianV(
const outputfunc_t& f,
const state_t& x)
const {
196 outputnoise_t
v = outputnoise_t::Zero();
201 Eigen::Matrix<double, outputDim, outputNoiseDim> jacobian;
202 for (
int i = 0; i < outputNoiseDim; i++) {
203 outputnoise_t delta = outputnoise_t::Zero();
205 output_t derivative = (f(x,
v + delta) - f(x,
v - delta)) / (2 * epsilon);
206 jacobian.col(i) = derivative;
static const ConstantReturnType Zero()
TransposeReturnType transpose()
static const IdentityReturnType Identity()
std::function< Eigen::Matrix< double, stateDim, stateDim >(const state_t &, const input_t &, const processnoise_t &)> stateFuncJacobianX
Set this to provide an analytic solution to df/dx.
Definition ExtendedKalmanFilter.h:105
void correct(const Eigen::Matrix< double, outputDim, 1 > &measurement)
Correct the state estimate with measurement data.
Definition ExtendedKalmanFilter.h:77
std::function< Eigen::Matrix< double, outputDim, outputNoiseDim >(const state_t &, const outputnoise_t &)> outputFuncJacobianV
Set this to provide an analytic solution to dh/dv.
Definition ExtendedKalmanFilter.h:129
std::function< Eigen::Matrix< double, outputDim, stateDim >(const state_t &, const outputnoise_t &)> outputFuncJacobianX
Set this to provide an analytic solution to dh/dx.
Definition ExtendedKalmanFilter.h:121
std::function< Eigen::Matrix< double, stateDim, processNoiseDim >(const state_t &, const input_t &, const processnoise_t &)> stateFuncJacobianW
Set this to provide an analytic solution to df/dw.
Definition ExtendedKalmanFilter.h:113
void predict(const Eigen::Matrix< double, inputDim, 1 > &input) override
Use the model to predict the next system state, given the current inputs.
Definition ExtendedKalmanFilter.h:57
ExtendedKalmanFilter(const statefunc_t &stateFunc, const outputfunc_t &outputFunc, const statespace::NoiseCovMat< stateDim, processNoiseDim, inputDim > &processNoise, const statespace::NoiseCovMat< stateDim, outputNoiseDim, outputDim > &outputNoise, double dt)
Create a new discrete-time EKF.
Definition ExtendedKalmanFilter.h:50
Represents a square noise covariance matrix.
Definition StateSpaceUtil.h:249