5 #ifndef LODESTAR_CONTINUOUSSAMPLEDEKF_HPP
6 #define LODESTAR_CONTINUOUSSAMPLEDEKF_HPP
11 #include <type_traits>
13 #include "Lodestar/primitives/integrators/IntegratorsEnum.hpp"
14 #include "Lodestar/primitives/integrators/BogackiShampine.hpp"
15 #include "Lodestar/primitives/integrators/RungeKuttaFehlberg45.hpp"
16 #include "Lodestar/primitives/integrators/RungeKuttaFehlberg78.hpp"
24 using integrators = ls::primitives::IntegratorsEnum;
26 template<ls::primitives::IntegratorsEnum TIntegrator = ls::primitives::IntegratorsEnum::RungeKuttaFehlberg45,
typename TScalar =
double,
int TStateDim = Eigen::Dynamic,
int TInputDim = Eigen::Dynamic,
int TOutputDim = Eigen::Dynamic>
28 const ls::primitives::IntegratorsEnum kIntegrator = TIntegrator;
29 using scalar_type = TScalar;
30 const int kStateDim = TStateDim;
31 const int kInputDim = TInputDim;
32 const int kOutputDim = TOutputDim;
34 typedef Eigen::Matrix<TScalar, TStateDim, TStateDim> TDStateMatrix;
35 typedef Eigen::Matrix<TScalar, TStateDim, 1> TDStateVector;
36 typedef Eigen::Matrix<TScalar, TStateDim, TInputDim> TDInputMatrix;
37 typedef Eigen::Matrix<TScalar, TInputDim, 1> TDInputVector;
38 typedef Eigen::Matrix<TScalar, TOutputDim, TStateDim> TDOutputMatrix;
39 typedef Eigen::Matrix<TScalar, TOutputDim, 1> TDOutputVector;
40 typedef Eigen::Matrix<TScalar, TOutputDim, TInputDim> TDFeedforwardMatrix;
42 typedef Eigen::Matrix<TScalar, TStateDim, TOutputDim> TDKalmanGain;
44 typedef TDStateMatrix TDProcessCovarianceMatrix;
45 typedef Eigen::Matrix<TScalar, TOutputDim, TOutputDim> TDObservationCovarianceMatrix;
47 typedef ls::primitives::IntegratorsEnum TDIntegratorsEnum;
49 typedef std::function<TDStateVector(TScalar,
const TDStateVector &,
const TDInputVector &)> TDOde;
50 typedef std::function<TDStateMatrix(TScalar,
const TDStateMatrix &,
const TDStateVector &,
52 typedef std::function<TDStateMatrix(
const TDStateVector &,
const TDInputVector &)>
TDStateJacobian;
54 typedef std::function<TDOutputVector(
const TDStateVector &)>
TDOutputMap;
56 typedef std::function<TDStateVector(TScalar,
const TDStateVector &)>
TDOdeFunc;
57 typedef std::function<TDStateMatrix(TScalar,
const TDStateMatrix &)> TDMatrixOdeFunc;
59 void initEquations(
const TDOde &ordinaryDiffEq,
const TDStateJacobian &stateJacobianEq,
63 stateJacobian = stateJacobianEq;
64 outputJacobian = outputJacobianEq;
65 outputMap = outputMapEq;
67 Pdot = [&](TScalar t,
const TDStateMatrix &P,
const TDStateVector &x,
const TDInputVector &u) {
68 const auto F = stateJacobian(x, u);
69 std::cout <<
"F at t = " << t <<
": " << F << std::endl;
70 std::cout <<
"P at t = " << t <<
": " << P << std::endl;
71 std::cout <<
"Pdot at t = " << t <<
": " << F * P + P * F.transpose() + Q << std::endl;
76 ret = F * P + P * F.transpose() + Q;
83 initParams(
const TDStateVector &x0,
const TDStateMatrix &P0 = TDStateMatrix::Zero(), TScalar t0 = 0)
95 TDProcessCovarianceMatrix Q;
96 TDObservationCovarianceMatrix R;
109 template<TDIntegratorsEnum T_TIntegrator = TIntegrator>
110 typename std::enable_if<T_TIntegrator == TDIntegratorsEnum::BogackiShampine, void>::type
111 predict(TDStateVector &xout, TDStateMatrix &Pout,
const TDStateVector &x,
const TDInputVector &u,
115 auto f = std::bind(ode, std::placeholders::_1, std::placeholders::_2, u);
119 auto F = std::bind(Pdot, std::placeholders::_1, std::placeholders::_2, x, u);
128 template<TDIntegratorsEnum T_TIntegrator = TIntegrator>
129 typename std::enable_if<T_TIntegrator == TDIntegratorsEnum::RungeKuttaFehlberg45, void>::type
130 predict(TDStateVector &xout, TDStateMatrix &Pout,
const TDStateVector &x,
const TDInputVector &u,
134 auto f = std::bind(ode, std::placeholders::_1, std::placeholders::_2, u);
138 auto F = std::bind(Pdot, std::placeholders::_1, std::placeholders::_2, x, u);
147 template<TDIntegratorsEnum T_TIntegrator = TIntegrator>
148 typename std::enable_if<T_TIntegrator == TDIntegratorsEnum::RungeKuttaFehlberg78, void>::type
149 predict(TDStateVector &xout, TDStateMatrix &Pout,
const TDStateVector &x,
const TDInputVector &u,
153 auto f = std::bind(ode, std::placeholders::_1, std::placeholders::_2, u);
154 std::function<TDStateVector(TScalar,
const TDStateVector &)> func = [&](TScalar t,
const TDStateVector &x)
161 auto F = std::bind(Pdot, std::placeholders::_1, std::placeholders::_2, x, u);
162 std::function<TDStateMatrix (TScalar,
const TDStateMatrix &)> Func = [&](TScalar t,
const TDStateMatrix &P)
164 return Pdot(t, P, x, u);
174 void update(TDStateVector &x,
const TDOutputVector &z)
176 const TDOutputMatrix H = outputJacobian(x);
177 const TDKalmanGain K = P * H.transpose() * (H * P * H.transpose() + R).completeOrthogonalDecomposition().pseudoInverse();
178 x = x + K * (z - outputMap(x));
179 P = (TDStateMatrix::Identity() - K * H) * P;
182 void step(
const TDInputVector &u,
const TDOutputVector &z,
const TScalar h)
187 predict(xnew, Pnew, xhat, u, h);
191 std::cout <<
"xnew " << xnew << std::endl;
192 std::cout <<
"Pnew " << Pnew << std::endl;
199 void setCovarianceMatrices(
const TDProcessCovarianceMatrix &QMatrix,
const TDObservationCovarianceMatrix &RMatrix)
205 const TDStateVector &getStateEstimate()
const
210 TScalar getCurrentTime()
const
220 #endif //LODESTAR_CONTINUOUSSAMPLEDEKF_HPP