GCOP  1.0
kalmanpredictor.h
Go to the documentation of this file.
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