GCOP
1.0
|
00001 #ifndef GCOP_KALMANPREDICTOR_H 00002 #define GCOP_KALMANPREDICTOR_H 00003 00004 #include "predictor.h" 00005 00006 namespace gcop { 00007 00008 template <typename T = VectorXd, 00009 int _nx = Dynamic, 00010 int _nu = Dynamic, 00011 int _np = Dynamic> class KalmanPredictor : public Predictor<T, _nx, _nu, _np> { 00012 public: 00013 00014 typedef Matrix<double, _nx, 1> Vectornd; 00015 typedef Matrix<double, _nu, 1> Vectorcd; 00016 typedef Matrix<double, _np, 1> Vectormd; 00017 00018 typedef Matrix<double, _nx, _nx> Matrixnd; 00019 typedef Matrix<double, _nx, _nu> Matrixncd; 00020 typedef Matrix<double, _nu, _nx> Matrixcnd; 00021 typedef Matrix<double, _nu, _nu> Matrixcd; 00022 00023 typedef Matrix<double, _np, _np> Matrixmd; 00024 typedef Matrix<double, _nx, _np> Matrixnmd; 00025 typedef Matrix<double, _np, _nx> Matrixmnd; 00026 00027 // typedef pair<T, Matrixnd > Belief; ///< belief state 00028 00029 KalmanPredictor(System<T, _nx, _nu, _np> &sys); 00030 00031 virtual ~KalmanPredictor(); 00032 00033 virtual bool Predict(T& xb, double t, const T &xa, 00034 const Vectorcd &u, double h, 00035 const Vectormd *p = 0, bool cov = true); 00036 00037 Matrixnd A; 00038 Matrixnd Q; 00039 }; 00040 00041 00042 template <typename T, int _nx, int _nu, int _np> 00043 KalmanPredictor<T, _nx, _nu, _np>::KalmanPredictor(System<T, _nx, _nu, _np> &sys) : 00044 Predictor<T, _nx, _nu, _np>(sys) { 00045 00046 if (_nx == Dynamic) { 00047 A.resize(sys.X.n, sys.X.n); 00048 Q.resize(sys.X.n, sys.X.n); 00049 } 00050 A.setZero(); 00051 Q.setZero(); 00052 } 00053 00054 template <typename T, int _nx, int _nu, int _np> 00055 KalmanPredictor<T, _nx, _nu, _np>::~KalmanPredictor() { 00056 } 00057 00058 template <typename T, int _nx, int _nu, int _np> 00059 bool KalmanPredictor<T, _nx, _nu, _np>::Predict(T& xb, double t, const T &xa, 00060 const Vectorcd &u, double h, 00061 const Vectormd *p, bool cov) { 00062 this->sys.Step(xb, t, xa, u, h, p, &A); 00063 if (cov) { 00064 this->sys.Noise(Q, t, xa, u, h, p); 00065 xb.P = A*xa.P*A.transpose() + Q; 00066 } 00067 return true; 00068 } 00069 } 00070 00071 00072 #endif