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