diff --git a/test/gtest_processor_force_torque_preint.cpp b/test/gtest_processor_force_torque_preint.cpp index 5952b69555d0f5230bf9f7e3519a19e2da6db639..50f96e712de13d3d923461eed39bbbd558a0643a 100644 --- a/test/gtest_processor_force_torque_preint.cpp +++ b/test/gtest_processor_force_torque_preint.cpp @@ -285,14 +285,6 @@ public: } void buildDataVectors(){ - std::cout << "\n\nOOOOOOOOOOOOOOOO" << std::endl; - std::cout << "OOOOOOOOOOOOOOOO" << std::endl; - std::cout << "OOOOOOOOOOOOOOOO" << std::endl; - std::cout << "OOOOOOOOOOOOOOOO" << std::endl; - std::cout << "OOOOOOOOOOOOOOOO" << std::endl; - std::cout << "OOOOOOOOOOOOOOOO" << std::endl; - std::cout << "OOOOOOOOOOOOOOOO" << std::endl; - std::cout << pbc_ << std::endl; pbc_meas_ = pbc_ + bias_pbc_; acc_gyr_meas_ << acc_meas_, w_meas_; diff --git a/test/gtest_processor_inertial_kinematics.cpp b/test/gtest_processor_inertial_kinematics.cpp index 225cf9bbcc849aed32fb1d62230098be6a8694df..89e2c81bd873a3c8edc2e7a10200e3b7894537ab 100644 --- a/test/gtest_processor_inertial_kinematics.cpp +++ b/test/gtest_processor_inertial_kinematics.cpp @@ -18,6 +18,7 @@ #include <core/ceres_wrapper/ceres_manager.h> #include <core/math/rotations.h> #include <core/capture/capture_base.h> +#include <core/capture/capture_pose.h> #include <core/feature/feature_base.h> #include <core/factor/factor_block_absolute.h> @@ -39,6 +40,9 @@ using namespace wolf; using namespace Eigen; using namespace std; +const Eigen::Vector3d ZERO3 = Eigen::Vector3d::Zero(); +const Eigen::Vector6d ZERO6 = Eigen::Vector6d::Zero(); + class FactorInertialKinematics_2KF : public testing::Test { @@ -67,9 +71,7 @@ class FactorInertialKinematics_2KF : public testing::Test //===================================================== INITIALIZATION x_origin_.resize(19); - Eigen::Vector3d zero3 = Eigen::Vector3d::Zero(); - x_origin_ << zero3, 0,0,0,1, zero3, zero3, zero3, zero3; - //P_origin_ = pow(1e-3, 2) * Eigen::Matrix9d::Identity(); + x_origin_ << ZERO3, 0,0,0,1, ZERO3, ZERO3, ZERO3, ZERO3; P_origin_ = pow(1e-3, 2) * Eigen::MatrixXd::Identity(18,18); t_.set(0.0); @@ -79,29 +81,49 @@ class FactorInertialKinematics_2KF : public testing::Test intr_ik->std_vbc = 0.1; VectorXd extr; // default size for dynamic vector is 0-0 -> what we need SensorBasePtr sen_ikin_base = problem_->installSensor("SensorInertialKinematics", "SenIK", extr, intr_ik); - // SensorBasePtr sen_ikin_base = problem_->installSensor("SensorInertialKinematics", "SenIK", extr, bodydynamics_root_dir + "/demos/sensor_inertial_kinematics.yaml"); // TODO: does not work! + // SensorBasePtr sen_ikin_base = problem_->installSensor("SensorInertialKinematics", "SenIK", extr, bodydynamics_root_dir + "/test/sensor_inertial_kinematics.yaml"); // TODO: does not work! sen_ikin_ = std::static_pointer_cast<SensorInertialKinematics>(sen_ikin_base); // SENSOR + PROCESSOR Imu - SensorBasePtr sen_imu_base = problem_->installSensor("SensorImu", "SenImu", (Vector7d()<<0,0,0,0,0,0,1).finished(), bodydynamics_root_dir + "/demos/sensor_imu.yaml"); + SensorBasePtr sen_imu_base = problem_->installSensor("SensorImu", "SenImu", (Vector7d()<<0,0,0,0,0,0,1).finished(), bodydynamics_root_dir + "/test/sensor_imu.yaml"); sen_imu_ = std::static_pointer_cast<SensorImu>(sen_imu_base); - ProcessorBasePtr proc = problem_->installProcessor("ProcessorImu", "Imu pre-integrator", "SenImu", bodydynamics_root_dir + "/demos/processor_imu.yaml"); + ProcessorBasePtr proc = problem_->installProcessor("ProcessorImu", "Imu pre-integrator", "SenImu", bodydynamics_root_dir + "/test/processor_imu.yaml"); // auto processor_imu = std::static_pointer_cast<ProcessorImu>(proc); ParamsProcessorInertialKinematicsPtr params_ik = std::make_shared<ParamsProcessorInertialKinematics>(); params_ik->sensor_angvel_name = "SenImu"; - params_ik->std_bp_drift = 0.01; + params_ik->std_bp_drift = 0.0000001; ProcessorBasePtr proc_ikin_base = problem_->installProcessor("ProcessorInertialKinematics", "PInertialKinematics", sen_ikin_, params_ik); - // ProcessorBasePtr proc_ikin_base = problem_->installProcessor("ProcessorInertialKinematics", "PInertialKinematics", "SenIK", bodydynamics_root_dir + "/demos/processor_inertial_kinematics.yaml"); + // ProcessorBasePtr proc_ikin_base = problem_->installProcessor("ProcessorInertialKinematics", "PInertialKinematics", "SenIK", bodydynamics_root_dir + "/test/processor_inertial_kinematics.yaml"); // auto proc_inkin = std::static_pointer_cast<ProcessorInertialKinematics>(proc_ikin_base); // Set origin of the problem - KF0_ = problem_->setPriorFactor(x_origin_, P_origin_, t_, 0.005); + // KF0_ = problem_->setPriorFactor(x_origin_, P_origin_, t_, 0.005); + KF0_ = problem_->emplaceFrame(KEY, x_origin_, t_); + + /////////////////////////////////////////////////// + // Prior pose factor + CapturePosePtr pose_prior_capture = CaptureBase::emplace<CapturePose>(KF0_, t_, nullptr, x_origin_.head(7), P_origin_.topLeftCorner(6, 6)); + pose_prior_capture->emplaceFeatureAndFactor(); + + /////////////////////////////////////////////////// + // Prior velocity factor + CaptureBasePtr capV0 = CaptureBase::emplace<CaptureBase>(KF0_, "Vel0", t_); + FeatureBasePtr featV0 = FeatureBase::emplace<FeatureBase>(capV0, "Vel0", x_origin_.segment<3>(7), P_origin_.block<3, 3>(6, 6)); + FactorBasePtr facV0 = FactorBase::emplace<FactorBlockAbsolute>(featV0, KF0_->getV(), nullptr, false); // Set origin of processor Imu std::static_pointer_cast<ProcessorImu>(proc)->setOrigin(KF0_); + + //////////////////////////////////////////// + // Add absolute factor on Imu biases to simulate a fix() + Matrix6d Q_bi = 1e-8 * Matrix6d::Identity(); + CaptureBasePtr capbi0 = CaptureBase::emplace<CaptureBase>(KF0_, "bi0", t_); + FeatureBasePtr featbi0 = FeatureBase::emplace<FeatureBase>(capbi0, "bi0", ZERO6, Q_bi); + FactorBasePtr facbi0 = FactorBase::emplace<FactorBlockAbsolute>(featbi0, KF0_->getCaptureOf(sen_imu_)->getSensorIntrinsic(),nullptr,false); + } virtual void TearDown(){} @@ -132,18 +154,18 @@ TEST_F(FactorInertialKinematics_2KF, sensor_and_processors_registration) // sen_imu_->getIntrinsic()->fix(); // T0 + auto CIKin0 = std::make_shared<CaptureInertialKinematics>(t0, sen_ikin_, meas_ikin0, Iq, Lq); + sen_ikin_->process(CIKin0); CaptureImuPtr CImu0 = std::make_shared<CaptureImu>(t0, sen_imu_, acc_gyr_meas, acc_gyr_cov); sen_imu_->process(CImu0); - CImu0->getSensorIntrinsic()->fix(); - auto CIKin0 = std::make_shared<CaptureInertialKinematics>(t0, sen_ikin_, meas_ikin0, Iq, Lq); - sen_ikin_->process(CIKin0); + CIKin0->getSensorIntrinsic()->fix(); // T1 CaptureImuPtr CImu1 = std::make_shared<CaptureImu>(t1, sen_imu_, acc_gyr_meas, acc_gyr_cov); sen_imu_->process(CImu1); - CImu1->getSensorIntrinsic()->fix(); + // CImu1->getSensorIntrinsic()->fix(); auto CIKin1 = std::make_shared<CaptureInertialKinematics>(t1, sen_ikin_, meas_ikin0, Iq, Lq); sen_ikin_->process(CIKin1); @@ -152,7 +174,7 @@ TEST_F(FactorInertialKinematics_2KF, sensor_and_processors_registration) // T2 CaptureImuPtr CImu2 = std::make_shared<CaptureImu>(t2, sen_imu_, acc_gyr_meas, acc_gyr_cov); - CImu2->getSensorIntrinsic()->fix(); + // CImu2->getSensorIntrinsic()->fix(); sen_imu_->process(CImu2); auto CIKin2 = std::make_shared<CaptureInertialKinematics>(t2, sen_ikin_, meas_ikin0, Iq, Lq); @@ -161,23 +183,36 @@ TEST_F(FactorInertialKinematics_2KF, sensor_and_processors_registration) // T3 CaptureImuPtr CImu3 = std::make_shared<CaptureImu>(t3, sen_imu_, acc_gyr_meas, acc_gyr_cov); - CImu3->getSensorIntrinsic()->fix(); + // CImu3->getSensorIntrinsic()->fix(); sen_imu_->process(CImu3); CaptureInertialKinematicsPtr CIKin3 = std::make_shared<CaptureInertialKinematics>(t3, sen_ikin_, meas_ikin0, Iq, Lq); sen_ikin_->process(CIKin3); CIKin3->getSensorIntrinsic()->fix(); + KF0_->perturb(); - KF0_->getStateBlock("C")->setState(Eigen::Vector3d::Random()); - KF0_->getStateBlock("D")->setState(Eigen::Vector3d::Random()); - KF0_->getStateBlock("L")->setState(Eigen::Vector3d::Random()); + std::string report = ceres_manager_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; + std::cout << report << std::endl; + problem_->print(4,true,true,true); + Vector3d pdiff; pdiff << 4.5, 0, 0; + Vector3d vdiff; vdiff << 3, 0, 0; - problem_->print(4,true,true,true); - // std::string report = ceres_manager_->solve(SolverManager::ReportVerbosity::BRIEF); // 0: nothing, 1: BriefReport, 2: FullReport; - // std::cout << report << std::endl; - // problem_->print(4,true,true,true); + FrameBasePtr KF1 = problem_->getTrajectory()->getLastKeyFrame(); + + + ASSERT_MATRIX_APPROX(KF0_->getStateBlock("P")->getState(), ZERO3, 1e-6); + ASSERT_MATRIX_APPROX(KF0_->getStateBlock("V")->getState(), ZERO3, 1e-6); + ASSERT_MATRIX_APPROX(KF0_->getStateBlock("C")->getState(), ZERO3, 1e-6); + ASSERT_MATRIX_APPROX(KF0_->getStateBlock("D")->getState(), ZERO3, 1e-6); + ASSERT_MATRIX_APPROX(KF0_->getStateBlock("L")->getState(), ZERO3, 1e-6); + + ASSERT_MATRIX_APPROX(KF1->getStateBlock("P")->getState(), pdiff, 1e-6); + ASSERT_MATRIX_APPROX(KF1->getStateBlock("V")->getState(), vdiff, 1e-6); + ASSERT_MATRIX_APPROX(KF1->getStateBlock("C")->getState(), pdiff, 1e-6); + ASSERT_MATRIX_APPROX(KF1->getStateBlock("D")->getState(), vdiff, 1e-6); + ASSERT_MATRIX_APPROX(KF1->getStateBlock("L")->getState(), ZERO3, 1e-6); }