diff --git a/include/bodydynamics/capture/capture_force_torque_preint.h b/include/bodydynamics/capture/capture_force_torque_preint.h index 3e6a24840bfa8e6f9265b3fb2352e88c14c693e6..3436b5b8acb4b8a6bbea631c46e2b93b8aceaea2 100644 --- a/include/bodydynamics/capture/capture_force_torque_preint.h +++ b/include/bodydynamics/capture/capture_force_torque_preint.h @@ -7,6 +7,8 @@ #include "core/capture/capture_motion.h" #include "bodydynamics/capture/capture_inertial_kinematics.h" +#include <core/state_block/state_composite.h> + namespace wolf { WOLF_PTR_TYPEDEFS(CaptureForceTorquePreint); @@ -39,35 +41,14 @@ class CaptureForceTorquePreint : public CaptureMotion virtual ~CaptureForceTorquePreint(); - virtual VectorXd getCalibration() const override; - - virtual VectorXd correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const override; - CaptureBasePtr getIkinCaptureOther(){ return cap_ikin_other_; } CaptureBasePtr getGyroCaptureOther(){ return cap_gyro_other_;} private: CaptureBasePtr cap_ikin_other_; CaptureBasePtr cap_gyro_other_; - - protected: - SizeEigen computeCalibSize() const override; - - }; -inline SizeEigen CaptureForceTorquePreint::computeCalibSize() const -{ - // Hack: CaptureBase::computeCalibSize will compute a size 0 since no statblock is stored in this capture - // To be able to use setCalib, we need to override this function - return 6; -} - -inline Eigen::VectorXd CaptureForceTorquePreint::correctDelta(const VectorXd& _delta, const VectorXd& _delta_error_biases) const -{ - return bodydynamics::plus(_delta, _delta_error_biases); // deltacorr = plus(deltapreint, J_deltapreint_biases * (biases - biasespreint) -} - } // namespace wolf #endif // CAPTURE_FORCE_TORQUE_PREINT_H diff --git a/include/bodydynamics/processor/processor_force_torque_preint.h b/include/bodydynamics/processor/processor_force_torque_preint.h index 2b54d2b1214bb5366a3dd860e4ef776adb99ba74..c455c6d893b1419daba15a65921da84136f7e4d3 100644 --- a/include/bodydynamics/processor/processor_force_torque_preint.h +++ b/include/bodydynamics/processor/processor_force_torque_preint.h @@ -58,11 +58,16 @@ class ProcessorForceTorquePreint : public ProcessorMotion{ Eigen::VectorXd& _delta_preint_plus_delta, Eigen::MatrixXd& _jacobian_delta_preint, Eigen::MatrixXd& _jacobian_delta) const override; - virtual void statePlusDelta(const Eigen::VectorXd& _x, + virtual void statePlusDelta(const VectorComposite& _x, const Eigen::VectorXd& _delta, const double _dt, - Eigen::VectorXd& _x_plus_delta ) const override; + VectorComposite& _x_plus_delta ) const override; virtual Eigen::VectorXd deltaZero() const override; + virtual Eigen::VectorXd correctDelta(const Eigen::VectorXd& delta_preint, + const Eigen::VectorXd& delta_step) const override; + virtual VectorXd getCalibration (const CaptureBasePtr _capture) const override; + virtual void setCalibration(const CaptureBasePtr _capture, const VectorXd& _calibration) override; + virtual bool voteForKeyFrame() const override; virtual CaptureMotionPtr emplaceCapture(const FrameBasePtr& _frame_own, const SensorBasePtr& _sensor, diff --git a/src/capture/capture_force_torque_preint.cpp b/src/capture/capture_force_torque_preint.cpp index 264faa7be50cd26eb8983ab100dcdccb76f00507..8435c934a2a640f5b1ed41cecca889ac75edfc76 100644 --- a/src/capture/capture_force_torque_preint.cpp +++ b/src/capture/capture_force_torque_preint.cpp @@ -13,7 +13,7 @@ CaptureForceTorquePreint::CaptureForceTorquePreint( const Eigen::Matrix<double, 32, 1>& _data, const Eigen::MatrixXd& _data_cov, // TODO: no uncertainty from kinematics CaptureBasePtr _capture_origin_ptr) : - CaptureMotion("CaptureForceTorquePreint", _init_ts, _sensor_ptr, _data, _data_cov, 13, 12, + CaptureMotion("CaptureForceTorquePreint", _init_ts, _sensor_ptr, _data, _data_cov, _capture_origin_ptr, nullptr, nullptr, nullptr), cap_ikin_other_(_capture_IK_ptr), cap_gyro_other_(_capture_motion_ptr) @@ -25,14 +25,4 @@ CaptureForceTorquePreint::~CaptureForceTorquePreint() } -VectorXd CaptureForceTorquePreint::getCalibration() const -{ - // Needs to be overriden since the calib vector is coming from 2 different stateblocks - // that are NOT in the capture stateblock structure (contrary ti CaptureImu for instance) - Eigen::Vector6d bias_vec; - bias_vec.segment<3>(0) = cap_ikin_other_->getSensorIntrinsic()->getState(); - bias_vec.segment<3>(3) = cap_gyro_other_->getSensorIntrinsic()->getState().tail<3>(); // TODO: only valib for IMU bias sb or any other of the structure [XXXX, gyro_bias] - return bias_vec; -} - } //namespace wolf diff --git a/src/capture/capture_leg_odom.cpp b/src/capture/capture_leg_odom.cpp index e45f6492f2c926422fcb22351ae7c710c9a7c3b0..69319a07d654b67cbe26adf2282851058f370766 100644 --- a/src/capture/capture_leg_odom.cpp +++ b/src/capture/capture_leg_odom.cpp @@ -20,7 +20,7 @@ CaptureLegOdom::CaptureLegOdom(const TimeStamp& _init_ts, double dt) : CaptureMotion("CaptureLegOdom", _init_ts, _sensor_ptr, Eigen::Vector7d::Zero(), Eigen::Matrix6d::Identity(), // dummy data and data covariance filled in the constructor - 7, 6, nullptr, nullptr, nullptr, nullptr), + nullptr, nullptr, nullptr, nullptr), data_kin_(_data_kin) { Vector7d data; diff --git a/src/processor/processor_force_torque_preint.cpp b/src/processor/processor_force_torque_preint.cpp index 35cd62515b9e66a5ea54c6216434944e106dc58f..6cb8586b9db0b016905af79cddf99293fdd3c281 100644 --- a/src/processor/processor_force_torque_preint.cpp +++ b/src/processor/processor_force_torque_preint.cpp @@ -84,8 +84,8 @@ CaptureMotionPtr ProcessorForceTorquePreint::emplaceCapture(const FrameBasePtr& // which is zero in our case since the calibration stateblocks are not actually in the FTPreint sensor/captures auto cap_ftpreint = std::static_pointer_cast<CaptureForceTorquePreint>(cap); - Vector6d calib = cap_ftpreint->getCalibration(); - cap_ftpreint->setCalibration(calib); + Vector6d calib = getCalibration(cap_ftpreint); + setCalibration(cap_ftpreint, calib); cap_ftpreint->setCalibrationPreint(calib); return cap; @@ -102,6 +102,40 @@ FeatureBasePtr ProcessorForceTorquePreint::emplaceFeature(CaptureMotionPtr _capt return feature; } +Eigen::VectorXd ProcessorForceTorquePreint::correctDelta (const Eigen::VectorXd& delta_preint, + const Eigen::VectorXd& delta_step) const +{ + return bodydynamics::plus(delta_preint, delta_step); +} + +VectorXd ProcessorForceTorquePreint::getCalibration (const CaptureBasePtr _capture) const +{ + VectorXd bias_vec(6); + CaptureForceTorquePreintPtr cap_ft(std::static_pointer_cast<CaptureForceTorquePreint>(_capture)); + + // get calib part from Ikin capture + bias_vec.segment<3>(0) = cap_ft->getIkinCaptureOther()->getSensorIntrinsic()->getState(); + + // get calib part from IMU capture + bias_vec.segment<3>(3) = cap_ft->getGyroCaptureOther()->getSensorIntrinsic()->getState().tail<3>(); // TODO: only valib for IMU bias sb or any other of the structure [XXXX, gyro_bias] + + return bias_vec; +} + +void ProcessorForceTorquePreint::setCalibration (const CaptureBasePtr _capture, const VectorXd& _calibration) +{ + CaptureForceTorquePreintPtr cap_ft(std::static_pointer_cast<CaptureForceTorquePreint>(_capture)); + + // set calib part in Ikin capture + cap_ft->getIkinCaptureOther()->getSensorIntrinsic()->setState(_calibration.head<3>()); + + // set calib part in IMU capture + Vector6d calib_imu = cap_ft->getGyroCaptureOther()->getSensorIntrinsic()->getState(); + calib_imu.tail<3>() = _calibration.tail<3>(); + + cap_ft->getGyroCaptureOther()->getSensorIntrinsic()->setState(calib_imu); +} + FactorBasePtr ProcessorForceTorquePreint::emplaceFactor(FeatureBasePtr _feature_motion, CaptureBasePtr _capture_origin) { CaptureForceTorquePreintPtr cap_ftpreint_origin = std::static_pointer_cast<CaptureForceTorquePreint>(_capture_origin); @@ -158,17 +192,21 @@ void ProcessorForceTorquePreint::deltaPlusDelta(const Eigen::VectorXd& _delta_pr _delta_preint_plus_delta = bodydynamics::compose(_delta_preint, _delta, _dt); } -void ProcessorForceTorquePreint::statePlusDelta(const Eigen::VectorXd& _x, +void ProcessorForceTorquePreint::statePlusDelta(const VectorComposite& _x, const Eigen::VectorXd& _delta, const double _dt, - Eigen::VectorXd& _x_plus_delta) const + VectorComposite& _x_plus_delta) const { - assert(_x.size() == 13 && "Wrong _x vector size"); assert(_delta.size() == 13 && "Wrong _delta vector size"); - assert(_x_plus_delta.size() == 13 && "Wrong _x_plus_delta vector size"); assert(_dt >= 0 && "Time interval _dt is negative!"); - _x_plus_delta = bodydynamics::composeOverState(_x, _delta, _dt); + // verbose way : create Eigen vectors, then compute, then convert back to Composite + + auto x = _x.vector("CDLO"); + + VectorXd x_plus_delta = bodydynamics::composeOverState(x, _delta, _dt); + + _x_plus_delta = VectorComposite(x_plus_delta, "CDLO", {3,3,3,3}); } void ProcessorForceTorquePreint::deltaPlusDelta(const Eigen::VectorXd& _delta_preint, diff --git a/test/gtest_factor_force_torque.cpp b/test/gtest_factor_force_torque.cpp index dc0e94a1a1e08be6aad6285360025fada105e204..2adf0d7300248dd368115e565f26f49b8cd128a6 100644 --- a/test/gtest_factor_force_torque.cpp +++ b/test/gtest_factor_force_torque.cpp @@ -148,10 +148,10 @@ void perturbateAllIfUnFixed(const FrameBasePtr& KF) } } -FrameBasePtr createKFWithCDLI(const ProblemPtr& problem, const TimeStamp& t, Vector10d x_origin, +FrameBasePtr createKFWithCDLI(const ProblemPtr& problem, const TimeStamp& t, VectorComposite x_origin, Vector3d c, Vector3d cd, Vector3d Lc, Vector6d bias_imu) { - FrameBasePtr KF = FrameBase::emplace<FrameBase>(problem->getTrajectory(), "POV", 3, wolf::KEY, t, x_origin); + FrameBasePtr KF = FrameBase::emplace<FrameBase>(problem->getTrajectory(), wolf::KEY, t, "POV", x_origin); StateBlockPtr sbc = make_shared<StateBlock>(c); KF->addStateBlock("C", sbc, problem); StateBlockPtr sbd = make_shared<StateBlock>(cd); KF->addStateBlock("D", sbd, problem); StateBlockPtr sbL = make_shared<StateBlock>(Lc); KF->addStateBlock("L", sbL, problem); @@ -168,8 +168,8 @@ class FactorInertialKinematics_2KF : public testing::Test wolf::TimeStamp tB_; ProblemPtr problem_; CeresManagerPtr ceres_manager_; - VectorXd x_origin_; - MatrixXd P_origin_; + VectorComposite x_origin_; // initial state + VectorComposite s_origin_; // initial sigmas for prior SensorInertialKinematicsPtr SIK_; CaptureInertialKinematicsPtr CIKA_, CIKB_; FrameBasePtr KFA_; @@ -219,17 +219,9 @@ class FactorInertialKinematics_2KF : public testing::Test // ======================= INITIALIZATION KFA WITH PRIOR + INERTIAL KINEMATIC FACTOR tA_.set(0); - x_origin_.resize(10); - x_origin_ << 0,0,0, 0,0,0,1, 0,0,0; - P_origin_ = pow(1e-3, 2) * Matrix9d::Identity(); - - // Set origin of the problem - //KFA_ = problem_->setPrior(x_origin_, P_origin_.topLeftCorner<6,6>(), tA_, 0.005); - // Specific factor for origin velocity (not covered by setPrior) - //CaptureBasePtr capV0 = CaptureBase::emplace<CaptureBase>(KFA_, "Vel0", tA_); - //FeatureBasePtr featV0 = FeatureBase::emplace<FeatureBase>(capV0, "Vel0", x_origin_.tail(3), P_origin_.bottomRightCorner<3,3>()); - //FactorBasePtr facV0 = FactorBase::emplace<FactorBlockAbsolute>(featV0, KFA_->getV()); - KFA_ = problem_->setPriorFactor(x_origin_, P_origin_, tA_, 0.005); + x_origin_ = VectorComposite("POV", {Vector3d(0,0,0), Quaterniond::Identity().coeffs(), Vector3d(0,0,0)}); + s_origin_ = VectorComposite("POV", {1e-3*Vector3d(1,1,1), 1e-3*Vector3d(1,1,1), 1e-3*Vector3d(1,1,1)}); + KFA_ = problem_->setPriorFactor(x_origin_, s_origin_, tA_, 0.005); // ADD THE STATEBLOCKS AND SET THEIR DEFAULT VALUES @@ -325,8 +317,6 @@ class FactorInertialKinematics_2KF : public testing::Test FactorForceTorquePtr fac_ftAB = FactorBase::emplace<FactorForceTorque>(FFTAB_, FFTAB_, KFA_, CIKA_->getSensorIntrinsic(), nullptr, false); } - - virtual void TearDown() override {} }; @@ -566,9 +556,9 @@ TEST_F(FactorInertialKinematics_2KF,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); // due to opposite - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); // due to opposite + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), c_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), cd_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), Lc_exp, 1e-5); @@ -596,9 +586,9 @@ TEST_F(FactorInertialKinematics_2KF_foot1turned,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); // due to opposite - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); // due to opposite + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), c_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), cd_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), Lc_exp, 1e-5); @@ -626,9 +616,9 @@ TEST_F(FactorInertialKinematics_2KF_foot2turned,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); // due to opposite - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); // due to opposite + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), c_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), cd_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), Lc_exp, 1e-5); @@ -657,9 +647,9 @@ TEST_F(FactorInertialKinematics_2KF_singleContactFoot1turned,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); // due to opposite - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); // due to opposite + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), c_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), cd_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), Lc_exp, 1e-5); @@ -688,9 +678,9 @@ TEST_F(FactorInertialKinematics_2KF_singleContactFoot2turned,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), c_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), cd_exp, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), Lc_exp, 1e-5); @@ -716,9 +706,9 @@ TEST_F(FactorInertialKinematics_2KF_ForceX,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), zero3, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), zero3, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), zero3, 1e-5); @@ -742,9 +732,9 @@ TEST_F(FactorInertialKinematics_2KF_ForceY,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), zero3, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), zero3, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), zero3, 1e-5); @@ -768,9 +758,9 @@ TEST_F(FactorInertialKinematics_2KF_ForceZ,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), zero3, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), zero3, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), zero3, 1e-5); @@ -794,9 +784,9 @@ TEST_F(FactorInertialKinematics_2KF_ForceZ,ZeroMvt) // // std::cout << report << std::endl; // // problem_->print(4,true,true,true); -// ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); -// // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); -// ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); +// ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); +// // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); +// ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); // ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), zero3, 1e-5); // ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), zero3, 1e-5); // ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), zero3, 1e-5); @@ -824,9 +814,9 @@ TEST_F(FactorInertialKinematics_2KF_ForceX_Odom3d,ZeroMvt) // std::cout << report << std::endl; // problem_->print(4,true,true,true); - ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.head<3>(), 1e-5); - // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.segment<4>(3), 1e-5); - ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.tail<3>(), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getP()->getState(), x_origin_.at("P"), 1e-5); + // ASSERT_MATRIX_APPROX(KFA_->getO()->getState(), x_origin_.at("O"), 1e-5); + ASSERT_MATRIX_APPROX(KFA_->getV()->getState(), x_origin_.at("V"), 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("C")->getState(), zero3, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("D")->getState(), zero3, 1e-5); ASSERT_MATRIX_APPROX(KFA_->getStateBlock("L")->getState(), zero3, 1e-5); diff --git a/test/gtest_factor_inertial_kinematics.cpp b/test/gtest_factor_inertial_kinematics.cpp index 8902156fef0fee818dd1ff4c6e24ba7946e10c14..095e702fac013b2cea83817f0902aca981b02fa7 100644 --- a/test/gtest_factor_inertial_kinematics.cpp +++ b/test/gtest_factor_inertial_kinematics.cpp @@ -58,6 +58,8 @@ using namespace wolf; using namespace Eigen; using namespace std; +const Vector3d ZERO3 = Vector3d::Zero(); +const Vector6d ZERO6 = Vector6d::Zero(); class FactorInertialKinematics_1KF : public testing::Test { @@ -68,15 +70,16 @@ class FactorInertialKinematics_1KF : public testing::Test CeresManagerPtr ceres_manager_; // ProcessorBasePtr processor; // ProcessorImuPtr processor_imu; - VectorXd x_origin_; - MatrixXd P_origin_; + VectorComposite x_origin_; // initial state + VectorComposite s_origin_; // initial sigmas for prior FrameBasePtr KF0_; SensorInertialKinematicsPtr SIK_; CaptureInertialKinematicsPtr CIK0_; Eigen::Matrix3d Qp_, Qv_, Qw_; - Eigen::Vector3d bias_p_, bias_imu_; FeatureInertialKinematicsPtr feat_in_; StateBlockPtr sbbimu_; + Vector3d bias_p_; + Vector6d bias_imu_; virtual void SetUp() { @@ -92,32 +95,20 @@ class FactorInertialKinematics_1KF : public testing::Test ceres_manager_ = std::make_shared<CeresManager>(problem_, ceres_options); //===================================================== INITIALIZATION - x_origin_.resize(10); - x_origin_ << 0,0,0, 0,0,0,1, 0,0,0; - P_origin_ = pow(1e-3, 2) * Eigen::Matrix9d::Identity(); + x_origin_ = VectorComposite("POV", {Vector3d(0,0,0), Quaterniond::Identity().coeffs(), Vector3d(0,0,0)}); + s_origin_ = VectorComposite("POV", {1e-3*Vector3d(1,1,1), 1e-3*Vector3d(1,1,1), 1e-3*Vector3d(1,1,1)}); t_.set(0.0); - - - // Set origin of the problem - //KF0_ = problem_->setPrior(x_origin_, P_origin_.topLeftCorner<6,6>(), t_, 0.005); - // Specific factor for origin velocity (not covered by setPrior) - //CaptureBasePtr capV0 = CaptureBase::emplace<CaptureBase>(KF0_, "Vel0", t_); - //FeatureBasePtr featV0 = FeatureBase::emplace<FeatureBase>(capV0, "Vel0", x_origin_.tail(3), P_origin_.bottomRightCorner<3,3>()); - //FactorBasePtr facV0 = FactorBase::emplace<FactorBlockAbsolute>(featV0, KF0_->getV()); - - KF0_ = problem_->setPriorFactor(x_origin_, P_origin_, t_, 0.005); + KF0_ = problem_->setPriorFactor(x_origin_, s_origin_, t_, 0.005); ParamsSensorInertialKinematicsPtr intr_ik = std::make_shared<ParamsSensorInertialKinematics>(); SIK_ = std::make_shared<SensorInertialKinematics>(Eigen::VectorXd(0), intr_ik); // ADD THE STATEBLOCKS AND SET THEIR DEFAULT VALUES - Vector3d zero3; zero3 << 0,0,0; - Vector6d zero6; zero6 << zero3, zero3; - Vector3d bias_p_ = zero3; - Vector6d bias_imu_ = zero6; - StateBlockPtr sbc = make_shared<StateBlock>(zero3); - StateBlockPtr sbd = make_shared<StateBlock>(zero3); - StateBlockPtr sbL = make_shared<StateBlock>(zero3); + bias_p_ = ZERO3; + bias_imu_ = ZERO6; + StateBlockPtr sbc = make_shared<StateBlock>(ZERO3); + StateBlockPtr sbd = make_shared<StateBlock>(ZERO3); + StateBlockPtr sbL = make_shared<StateBlock>(ZERO3); StateBlockPtr sbb = make_shared<StateBlock>(bias_p_); sbbimu_ = make_shared<StateBlock>(bias_imu_); @@ -131,13 +122,13 @@ class FactorInertialKinematics_1KF : public testing::Test // =============== SET DEFAULT" KIN MEASUREMENT AND COVARIANCE // Measurements - Vector3d pBC_meas = zero3; - Vector3d vBC_meas = zero3; - Vector3d w_meas = zero3; + Vector3d pBC_meas = ZERO3; + Vector3d vBC_meas = ZERO3; + Vector3d w_meas = ZERO3; // momentum parameters Matrix3d Iq; Iq.setIdentity(); - Vector3d Lq = zero3; + Vector3d Lq = ZERO3; Qp_ = pow(1e-2, 2)*Eigen::Matrix3d::Identity(); Qv_ = pow(1e-2, 2)*Eigen::Matrix3d::Identity(); @@ -160,15 +151,15 @@ class FactorInertialKinematics_1KF_Meas0_bpfix : public FactorInertialKinematics // Fix the bp bias CIK0_->getStateBlock("I")->fix(); KF0_->getStateBlock("C")->unfix(); - Eigen::Vector3d zero3 = Eigen::Vector3d::Zero(); + Eigen::Vector3d ZERO3 = Eigen::Vector3d::Zero(); - Eigen::Vector3d pBC_meas = zero3; - Eigen::Vector3d vBC_meas = zero3; - Eigen::Vector3d w_meas = zero3; + Eigen::Vector3d pBC_meas = ZERO3; + Eigen::Vector3d vBC_meas = ZERO3; + Eigen::Vector3d w_meas = ZERO3; Eigen::Vector9d meas; meas << pBC_meas, vBC_meas, w_meas; // momentum parameters Eigen::Matrix3d Iq; Iq.setIdentity(); - Eigen::Vector3d Lq = zero3; + Eigen::Vector3d Lq = ZERO3; // =============== CREATE FEATURE/FACTOR Eigen::Matrix9d Q_ikin_err = computeIKinCov(Qp_, Qv_, Qw_, meas.head<3>()-bias_p_, meas.tail<3>()-bias_imu_.tail<3>(), Iq); @@ -185,15 +176,15 @@ class FactorInertialKinematics_1KF_1p_bpfix : public FactorInertialKinematics_1K // Fix the bp bias CIK0_->getStateBlock("I")->fix(); KF0_->getStateBlock("C")->unfix(); - Eigen::Vector3d zero3 = Eigen::Vector3d::Zero(); + Eigen::Vector3d ZERO3 = Eigen::Vector3d::Zero(); Eigen::Vector3d pBC_meas; pBC_meas << 1,0,0; - Eigen::Vector3d vBC_meas = zero3; - Eigen::Vector3d w_meas = zero3; + Eigen::Vector3d vBC_meas = ZERO3; + Eigen::Vector3d w_meas = ZERO3; Eigen::Vector9d meas; meas << pBC_meas, vBC_meas, w_meas; // momentum parameters Eigen::Matrix3d Iq; Iq.setIdentity(); - Eigen::Vector3d Lq = zero3; + Eigen::Vector3d Lq = ZERO3; // =============== CREATE FEATURE/FACTOR Eigen::Matrix9d Q_ikin_err = computeIKinCov(Qp_, Qv_, Qw_, meas.head<3>()-bias_p_, meas.tail<3>()-bias_imu_.tail<3>(), Iq); @@ -210,16 +201,16 @@ class FactorInertialKinematics_1KF_m1p_pfix : public FactorInertialKinematics_1K // Fix the COM position CIK0_->getStateBlock("I")->unfix(); KF0_->getStateBlock("C")->fix(); - Eigen::Vector3d zero3 = Eigen::Vector3d::Zero(); + Eigen::Vector3d ZERO3 = Eigen::Vector3d::Zero(); Eigen::Vector3d pBC_meas; pBC_meas << 1,0,0; - Eigen::Vector3d vBC_meas = zero3; - Eigen::Vector3d w_meas = zero3; + Eigen::Vector3d vBC_meas = ZERO3; + Eigen::Vector3d w_meas = ZERO3; bias_p_ << 1,0,0; Eigen::Vector9d meas; meas << pBC_meas, vBC_meas, w_meas; // momentum parameters Eigen::Matrix3d Iq; Iq.setIdentity(); - Eigen::Vector3d Lq = zero3; + Eigen::Vector3d Lq = ZERO3; // =============== CREATE FEATURE/FACTOR Eigen::Matrix9d Q_ikin_err = computeIKinCov(Qp_, Qv_, Qw_, meas.head<3>()-bias_p_, meas.tail<3>()-bias_imu_.tail<3>(), Iq); @@ -234,19 +225,19 @@ class FactorInertialKinematics_1KF_1v_bfix : public FactorInertialKinematics_1KF { FactorInertialKinematics_1KF::SetUp(); // Fix the bp bias - Eigen::Vector3d zero3 = Eigen::Vector3d::Zero(); + Eigen::Vector3d ZERO3 = Eigen::Vector3d::Zero(); CIK0_->getStateBlock("I")->fix(); KF0_->getStateBlock("C")->unfix(); - bias_p_ = zero3; + bias_p_ = ZERO3; CIK0_->getStateBlock("I")->setState(bias_p_); - Eigen::Vector3d pBC_meas = zero3; + Eigen::Vector3d pBC_meas = ZERO3; Eigen::Vector3d vBC_meas; vBC_meas << 1,0,0; - Eigen::Vector3d w_meas = zero3; + Eigen::Vector3d w_meas = ZERO3; Eigen::Vector9d meas; meas << pBC_meas, vBC_meas, w_meas; // momentum parameters Eigen::Matrix3d Iq; Iq.setIdentity(); - Eigen::Vector3d Lq = zero3; + Eigen::Vector3d Lq = ZERO3; // =============== CREATE FEATURE/FACTOR Eigen::Matrix9d Q_ikin_err = computeIKinCov(Qp_, Qv_, Qw_, meas.head<3>()-bias_p_, meas.tail<3>()-bias_imu_.tail<3>(), Iq); @@ -313,13 +304,13 @@ class FactorInertialKinematics_1KF_1v_bfix : public FactorInertialKinematics_1KF // // // // ADD THE STATEBLOCKS AND SET THEIR DEFAULT VALUES -// Vector3d zero3; zero3 << 0,0,0; -// Vector6d zero6; zero6 << zero3, zero3; -// Vector3d bias_p_ = zero3; -// Vector6d bias_imu_ = zero6; -// StateBlockPtr sbc = make_shared<StateBlock>(zero3); -// StateBlockPtr sbd = make_shared<StateBlock>(zero3); -// StateBlockPtr sbL = make_shared<StateBlock>(zero3); +// Vector3d ZERO3; ZERO3 << 0,0,0; +// Vector6d ZERO6; ZERO6 << ZERO3, ZERO3; +// Vector3d bias_p_ = ZERO3; +// Vector6d bias_imu_ = ZERO6; +// StateBlockPtr sbc = make_shared<StateBlock>(ZERO3); +// StateBlockPtr sbd = make_shared<StateBlock>(ZERO3); +// StateBlockPtr sbL = make_shared<StateBlock>(ZERO3); // StateBlockPtr sbb = make_shared<StateBlock>(bias_p_); // // KF0_->addStateBlock("C", sbcproblem_); @@ -333,13 +324,13 @@ class FactorInertialKinematics_1KF_1v_bfix : public FactorInertialKinematics_1KF // // // =============== SET DEFAULT" KIN MEASUREMENT AND COVARIANCE // // Measurements -// Vector3d pBC_meas = zero3; -// Vector3d vBC_meas = zero3; -// Vector3d w_meas = zero3; +// Vector3d pBC_meas = ZERO3; +// Vector3d vBC_meas = ZERO3; +// Vector3d w_meas = ZERO3; // // // momentum parameters // Matrix3d Iq; Iq.setIdentity(); -// Vector3d Lq = zero3; +// Vector3d Lq = ZERO3; // // Qp_ = pow(1e-2, 2)*Eigen::Matrix3d::Identity(); // Qv_ = pow(1e-2, 2)*Eigen::Matrix3d::Identity(); @@ -383,7 +374,7 @@ TEST_F(FactorInertialKinematics_1KF_Meas0_bpfix,ZeroMvt) KF0_->perturb(); string report = ceres_manager_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - ASSERT_MATRIX_APPROX(KF0_->getP()->getState(), x_origin_.head(3), 1e-5); + ASSERT_MATRIX_APPROX(KF0_->getP()->getState(), x_origin_.at("P"), 1e-5); ASSERT_MATRIX_APPROX(KF0_->getStateBlock("C")->getState(), c_exp, 1e-5); ASSERT_MATRIX_APPROX(KF0_->getStateBlock("D")->getState(), cd_exp, 1e-5); ASSERT_MATRIX_APPROX(KF0_->getStateBlock("L")->getState(), Lc_exp, 1e-5); diff --git a/test/gtest_processor_force_torque_preint.cpp b/test/gtest_processor_force_torque_preint.cpp index f8c95c9b5ffe5f15cfa4111b6bdebacc38b7684b..b4b4cd15b5a7f245d07c3261152147d44b9d0d55 100644 --- a/test/gtest_processor_force_torque_preint.cpp +++ b/test/gtest_processor_force_torque_preint.cpp @@ -204,7 +204,7 @@ public: // - call setOrigin on processors isMotion setOriginState(); MatrixXd P_origin_ = pow(1e-3, 2) * MatrixXd::Identity(18,18); - KF1_ = problem_->emplaceFrame(KEY, x_origin_, t0_); + KF1_ = problem_->emplaceFrame(KEY, t0_, x_origin_); // Prior pose factor CapturePosePtr pose_prior_capture = CaptureBase::emplace<CapturePose>(KF1_, t0_, nullptr, x_origin_.head(7), P_origin_.topLeftCorner(6, 6)); pose_prior_capture->emplaceFeatureAndFactor(); @@ -560,8 +560,6 @@ TEST_F(Cst2KFZeroMotion, ZeroMotionZeroBias) problem_->perturb(); std::string report = ceres_manager_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // problem_->print(4,true,true,true); - // std::cout << report << std::endl; ASSERT_MATRIX_APPROX(KF1_->getStateBlock("P")->getState(), ZERO3, 1e-6); ASSERT_MATRIX_APPROX(KF1_->getStateBlock("V")->getState(), ZERO3, 1e-6); diff --git a/test/gtest_processor_inertial_kinematics.cpp b/test/gtest_processor_inertial_kinematics.cpp index 510e2c235b695d3e3ff71861a58d2b39c5062f52..3a715897dfafab2acda28d1a991b5e2131d40636 100644 --- a/test/gtest_processor_inertial_kinematics.cpp +++ b/test/gtest_processor_inertial_kinematics.cpp @@ -102,7 +102,7 @@ class FactorInertialKinematics_2KF : public testing::Test // Set origin of the problem // KF0_ = problem_->setPriorFactor(x_origin_, P_origin_, t_, 0.005); - KF0_ = problem_->emplaceFrame(KEY, x_origin_, t_); + KF0_ = problem_->emplaceFrame(KEY, t_, x_origin_); /////////////////////////////////////////////////// // Prior pose factor