diff --git a/src/processor/processor_force_torque_inertial_preint_dynamics.cpp b/src/processor/processor_force_torque_inertial_preint_dynamics.cpp index 220ab7d8623c99c6fa97ecac998e3d0ea58493fb..4e8d1b278e302ebe7db8867296432754e893ece5 100644 --- a/src/processor/processor_force_torque_inertial_preint_dynamics.cpp +++ b/src/processor/processor_force_torque_inertial_preint_dynamics.cpp @@ -116,10 +116,14 @@ void ProcessorForceTorqueInertialPreintDynamics::emplaceFeaturesAndFactors(Captu FactorBase::emplace<FactorForceTorqueInertialDynamics>( ftr_fti, ftr_fti, _capture_origin, shared_from_this(), params_->apply_loss_function); - // 2. Feature and factor L -- angular moment - //------------------------------------------- + // 2. Feature and factor L -- angular momentum + //--------------------------------------------- // - feature has the current gyro measurement // - factor relates w_measured, IMU_bias(last capture), L(last capture) and i(sensor) + + // auto measurement_gyro = motion.data_.segment<3>(3); + // auto meas_cov = sensor_fti_->getNoiseCov().block<3,3>(3,3); // ?? + // 3. Feature and factor bias -- IMU bias drift for acc and gyro //--------------------------------------------------------------- @@ -173,12 +177,10 @@ void ProcessorForceTorqueInertialPreintDynamics::configure(SensorBasePtr _sensor auto acc_drift_std = sensor_fti_->getParamsSensorForceTorqueInertial()->acc_drift_std; auto gyro_drift_std = sensor_fti_->getParamsSensorForceTorqueInertial()->gyro_drift_std; - gyro_noise_cov_ = Eigen::Array3d(gyro_noise_std, gyro_noise_std, gyro_noise_std).square().matrix().asDiagonal(); - imu_drift_cov_ = - Eigen::Array<double,6,1>(acc_drift_std, acc_drift_std, acc_drift_std, gyro_drift_std, gyro_drift_std, gyro_drift_std) - .square() - .matrix() - .asDiagonal(); + ArrayXd imu_drift_sigmas(6); + imu_drift_sigmas << acc_drift_std, acc_drift_std, acc_drift_std, gyro_drift_std, gyro_drift_std, gyro_drift_std; + imu_drift_cov_ = imu_drift_sigmas.square().matrix().asDiagonal(); + gyro_noise_cov_ = Array3d(gyro_noise_std, gyro_noise_std, gyro_noise_std).square().matrix().asDiagonal(); } void ProcessorForceTorqueInertialPreintDynamics::data2tangent(const Eigen::VectorXd& _data, diff --git a/test/gtest_solve_problem_force_torque_inertial_dynamics.cpp b/test/gtest_solve_problem_force_torque_inertial_dynamics.cpp index 9944154a1b703fe49aa38c691526b5ca4d771eaf..3c9ef6531c8608f91cca6818deed2fed6e64ad9b 100644 --- a/test/gtest_solve_problem_force_torque_inertial_dynamics.cpp +++ b/test/gtest_solve_problem_force_torque_inertial_dynamics.cpp @@ -101,6 +101,7 @@ TEST_F(Test_SolveProblemForceTorqueInertialPreintDynamics_yaml, mass_only_hoveri S->getStateBlock('C')->fix(); S->getStateBlock('i')->fix(); S->getStateBlock('m')->unfix(); + // S->setStateBlockDynamic('I'); CaptureMotionPtr C0_0 = std::make_shared<CaptureMotion>("CaptureMotion", 0.0, S, data, data_cov, nullptr); CaptureMotionPtr C1_0 = std::make_shared<CaptureMotion>("CaptureMotion", 0.2, S, data, data_cov, nullptr); @@ -145,6 +146,9 @@ TEST_F(Test_SolveProblemForceTorqueInertialPreintDynamics_yaml, mass_only_hoveri WOLF_INFO("-----------------------------"); } + P->print(4, 1, 1, 1); + + ASSERT_NEAR(S->getStateBlock('m')->getState()(0), mass_true, 1e-3); }