diff --git a/src/constraint_imu.h b/src/constraint_imu.h index bd1683c6a2de6dafd40272177e91e7610e1c1fd4..8956a3257d2152a4bebbbac0b4a4adb133f40daa 100644 --- a/src/constraint_imu.h +++ b/src/constraint_imu.h @@ -40,31 +40,33 @@ class ConstraintIMU : public ConstraintSparse<9, 3, 4, 3, 3, 3, 3, 4, 3> * Vector3s _v2 : velocity in current frame * Matrix<10,1, wolf::Scalar> _expectation : to retrieve resulting expectation (PVQ) */ - template<typename T> - void expectation(const T* const _p1, const T* const _q1, const T* const _v1, const T* const _ab, const T* _wb, - const T* const _p2, const T* const _q2, const T* const _v2,//const T* const _lmk_hmg, - T* _expectation) const; + template<typename D1> + void expectation(const Eigen::MatrixBase<D1> & _p1, const Eigen::QuaternionBase<D1> & _q1, const Eigen::MatrixBase<D1> & _v1, const Eigen::MatrixBase<D1> & _ab, const Eigen::MatrixBase<D1> & _wb, + const Eigen::MatrixBase<D1> & _p2, const Eigen::MatrixBase<D1> & _q2, const Eigen::MatrixBase<D1> & _v2, const Eigen::Matrix<D1,10,1> & _result) const; Eigen::VectorXs expectation() const { - Eigen::VectorXs exp(10); + Eigen::Matrix<wolf::Scalar, 10, 1> exp; FrameBasePtr frm_current = getFeaturePtr()->getCapturePtr()->getFramePtr(); FrameBasePtr frm_imu = getFrameOtherPtr(); - const Scalar * const frame_imu_pos = frm_imu->getPPtr()->getVector().data(); - const Scalar * const frame_imu_ori = frm_imu->getOPtr()->getVector().data(); - const Scalar * const frame_imu_vel = frm_imu->getVPtr()->getVector().data(); - const Scalar * const frame_imu_ab = frm_current->getAccBiasPtr()->getVector().data(); - const Scalar * const frame_imu_wb = frm_current->getGyroBiasPtr()->getVector().data(); - const Scalar * const frame_current_pos = frm_current->getPPtr()->getVector().data(); - const Scalar * const frame_current_ori = frm_current->getOPtr()->getVector().data(); - const Scalar * const frame_current_vel = frm_current->getVPtr()->getVector().data(); - //const Scalar * const lmk_pos_hmg = lmk->getPPtr()->getVector().data(); - expectation(frame_imu_pos, frame_imu_ori, frame_imu_vel, frame_imu_ab, frame_imu_wb, - frame_current_pos, frame_current_ori, frame_current_vel, exp.data()); + //get information on current_frame in the constraintIMU + const Eigen::Vector3s frame_current_pos = dp_preint_; + const Eigen::Quaternions frame_current_ori = dq_preint_; + const Eigen::Vector3s frame_current_vel = dv_preint_; + const Eigen::Vector3s frame_current_ab = acc_bias_preint_; + const Eigen::Vector3s frame_current_wb = gyro_bias_preint_; + const Eigen::VectorXs frame_imu_pos = (frm_imu->getPPtr()->getVector()); + const Eigen::VectorXs frame_imu_ori = (frm_imu->getOPtr()->getVector()); + const Eigen::VectorXs frame_imu_vel = (frm_imu->getVPtr()->getVector()); + + //expectation(frame_current_pos, frame_current_ori, frame_current_vel, frame_current_ab, frame_current_wb, + // frame_imu_pos, frame_imu_ori, frame_imu_vel, exp); std::cout << frame_current_pos << std::endl; - std::cout << frame_current_ori << std::endl; + std::cout << frame_current_ori.w() << std::endl; std::cout << frame_current_vel << std::endl; + std::cout << frame_current_ab << std::endl; + std::cout << frame_current_wb << std::endl; std::cout << frame_imu_pos << std::endl; std::cout << frame_imu_ori << std::endl; std::cout << frame_imu_vel << std::endl; @@ -134,7 +136,8 @@ inline bool ConstraintIMU::operator ()(const T* const _p1, const T* const _q1, c { // MAPS Eigen::Map<const Eigen::Matrix<T,3,1> > p1(_p1); - Eigen::Map<const Eigen::Quaternion<T> > q1(_q1); + const Eigen::Quaternion<T> q1(_q1); + //Eigen::Map<const Eigen::Quaternion<T> > q1(_q1); Eigen::Map<const Eigen::Matrix<T,3,1> > v1(_v1); Eigen::Map<const Eigen::Matrix<T,3,1> > ab(_ab); Eigen::Map<const Eigen::Matrix<T,3,1> > wb(_wb); @@ -171,32 +174,32 @@ inline bool ConstraintIMU::operator ()(const T* const _p1, const T* const _q1, c return true; } -template<typename T> -inline void ConstraintIMU::expectation(const T* const _p1, const T* const _q1, const T* const _v1, const T* const _ab, const T* _wb, - const T* const _p2, const T* const _q2, const T* const _v2,//const T* const _lmk_hmg, - T* _expectation) const +template<typename D1> +inline void ConstraintIMU::expectation(const Eigen::MatrixBase<D1> & _p1, const Eigen::QuaternionBase<D1> & _q1, const Eigen::MatrixBase<D1> & _v1, const Eigen::MatrixBase<D1> & _ab, const Eigen::MatrixBase<D1> & _wb, + const Eigen::MatrixBase<D1> & _p2, const Eigen::MatrixBase<D1> & _q2, const Eigen::MatrixBase<D1> & _v2, const Eigen::Matrix<D1,10,1> & _result) const { // MAPS - Eigen::Map<const Eigen::Matrix<T,3,1> > p1(_p1); - Eigen::Map<const Eigen::Quaternion<T> > q1(_q1); - Eigen::Map<const Eigen::Matrix<T,3,1> > v1(_v1); - Eigen::Map<const Eigen::Matrix<T,3,1> > ab(_ab); - Eigen::Map<const Eigen::Matrix<T,3,1> > wb(_wb); - - Eigen::Map<const Eigen::Matrix<T,3,1> > p2(_p2); - Eigen::Map<const Eigen::Quaternion<T> > q2(_q2); - Eigen::Map<const Eigen::Matrix<T,3,1> > v2(_v2); - Eigen::Map<Eigen::Matrix<T,10,1> > expectation(_expectation); + Eigen::Map<const Eigen::Matrix<D1,3,1> > p1(_p1); + Eigen::Map<const Eigen::Quaternion<D1> > q1(_q1); + Eigen::Map<const Eigen::Matrix<D1,3,1> > v1(_v1); + Eigen::Map<const Eigen::Matrix<D1,3,1> > ab(_ab); + Eigen::Map<const Eigen::Matrix<D1,3,1> > wb(_wb); + Eigen::Map<const Eigen::Matrix<D1,3,1> > p2(_p2); + Eigen::Map<const Eigen::Quaternion<D1> > q2(_q2); + Eigen::Map<const Eigen::Matrix<D1,3,1> > v2(_v2); + + //Eigen::Map<Eigen::Matrix<D1,10,1> > result(_result); + // Predict delta: d_pred = x2 (-) x1 - Eigen::Matrix<T,3,1> dp_predict = q1.conjugate() * ( p2 - p1 - v1 * (T)dt_ - (T)0.5 * g_.cast<T>() * (T)dt_2_ ); - Eigen::Matrix<T,3,1> dv_predict = q1.conjugate() * ( v2 - v1 - g_.cast<T>() * (T)dt_ ); - Eigen::Quaternion<T> dq_predict = q1.conjugate() * q2; + Eigen::Matrix<D1,3,1> dp_predict = q1.conjugate() * ( p2 - p1 - v1 * (D1)dt_ - (D1)0.5 * g_.cast<D1>() * (D1)dt_2_ ); + Eigen::Matrix<D1,3,1> dv_predict = q1.conjugate() * ( v2 - v1 - g_.cast<D1>() * (D1)dt_ ); + Eigen::Quaternion<D1> dq_predict = q1.conjugate() * q2; - expectation.head(3) = dp_predict; - expectation.segment(3,4) = dq_predict; - expectation.tail(3) = dv_predict; + const_cast< Eigen::MatrixBase<D1> > (_result).head(3) = dp_predict; + const_cast< Eigen::MatrixBase<D1> > (_result).segment(3,4) = dq_predict; + const_cast< Eigen::MatrixBase<D1> > (_result).tail(3) = dv_predict; } /*Eigen::VectorXs ConstraintIMU::expectation(void) const