GCOP
1.0
|
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