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