GCOP  1.0
imusensor.h
Go to the documentation of this file.
00001 #ifndef GCOP_IMUSENSOR_H
00002 #define GCOP_IMUSENSOR_H
00003 
00004 #include <Eigen/Dense>
00005 #include "sensor.h"
00006 #include "imu.h"
00007 
00008 namespace gcop {
00009   
00010   using namespace Eigen;
00011   
00018   template<int _nz = 6, int _nu = 3, int _np = Dynamic>
00019     class ImuSensor : public Sensor<ImuState, 9, _nu, _np, Matrix<double, _nz, 1>, _nz> {
00020     
00021   public:  
00022   
00023   typedef Matrix<double, _nz, 1> Vectorzd;
00024   typedef Matrix<double, _nu, 1> Vectorcd;
00025   typedef Matrix<double, _np, 1> Vectormd;
00026 
00027   typedef Matrix<double, _nz, _nu> Matrixzcd;
00028   typedef Matrix<double, _nz, 6> Matrixz6d;
00029   typedef Matrix<double, _nz, 9> Matrixz9d;
00030   typedef Matrix<double, _nz, _np> Matrixzmd;
00031   
00032   ImuSensor();
00033 
00034   bool operator()(Vectorzd &y, double t, const ImuState &x, const Vectorcd &u,
00035                   const Vectormd *p = 0, 
00036                   Matrixz9d *dydx = 0, Matrixzcd *dydu = 0,
00037                   Matrixzmd *dydp = 0) {
00038     
00039     y.template head<3>() = x.R.transpose()*a0 - x.ba;
00040 
00041     if (_nz == 6)
00042       y.template tail<3>() = x.R.transpose()*m0;
00043     
00044     if (dydx){
00045       dydx->setZero();
00046       Matrix3d A;
00047       SO3::Instance().hat(A, y.template head<3>());
00048       dydx->template topLeftCorner<3,3>() = A;
00049       dydx->template topRightCorner<3,3>().diagonal().setConstant(-1);
00050       
00051       // for magnetometer measurements
00052       if (_nz == 6) {
00053         SO3::Instance().hat(A, y.template tail<3>());
00054         dydx->template bottomLeftCorner<3,3>() = A;
00055       }
00056     }
00057     
00058     return true;    
00059   }
00060   
00061   Vector3d a0;   
00062   Vector3d m0;   
00063   
00064   double sra;   
00065   double srm;   
00066   };
00067   
00068   
00069   template<int _nz, int _nu, int _np>
00070     ImuSensor<_nz, _nu, _np>::ImuSensor() : 
00071     Sensor<ImuState, 9, _nu, _np, Matrix<double, _nz, 1>, _nz>(Rn<_nz>::Instance()) {
00072     
00073     a0 << 0, 0, -9.81; 
00074     m0 << 1, 0, 0;     
00075     
00076     sra = 0.01;       
00077     srm = 0.01;       
00078 
00079     this->R.template topLeftCorner<3,3>().diagonal().setConstant(sra*sra);
00080     if (_nz == 6)
00081       this->R.template bottomRightCorner<3,3>().diagonal().setConstant(srm*srm);
00082 
00083   }
00084 }
00085 
00086 #endif
00087