diff --git a/src/test/gtest_IMU.cpp b/src/test/gtest_IMU.cpp index 7dddffacde11f45a982134d2a9ffb5097fd5c58e..a656fdcd108a5014a85d6e39536eef510a7a998b 100644 --- a/src/test/gtest_IMU.cpp +++ b/src/test/gtest_IMU.cpp @@ -68,6 +68,10 @@ class Process_Constraint_IMU : public testing::Test VectorXs D_optim_imu, x1_optim_imu; // corrected with imu_tools using optimized bias VectorXs x0_optim; // optimized using constraint_imu + // Trajectory matrices + MatrixXs Trj_D_exact, Trj_D_preint_imu, Trj_D_preint_prc, Trj_D_corrected_imu, Trj_D_corrected_prc; + MatrixXs Trj_x_exact, Trj_x_preint_imu, Trj_x_preint_prc, Trj_x_corrected_imu, Trj_x_corrected_prc; + // Delta correction Jacobian and step Matrix<Scalar,9,6> J_D_bias; // Jacobian of pre-integrated delta w Vector9s step; @@ -235,26 +239,26 @@ class Process_Constraint_IMU : public testing::Test { MotionBuffer trajectory(6, 10, 9, 6); VectorXs Delta(10); - MatrixXs dummy(0,0); + MatrixXs M9(9,9), M6(6,6), J9(9,9), J96(9,6), V10(10,1), V6(6,1); Quaternions q; Delta = imu::identity(); J_D_b .setZero(); q = q0; TimeStamp t(0); +// trajectory.get().push_back(processor_imu->motionZero(t)); for (int n = 0; n < motion.cols(); n++) { t += dt; integrateOneStep(motion.col(n), bias_real, bias_preint, dt, q, Delta, &J_D_b); - trajectory.setCalibrationPreint(bias_preint); - trajectory.get().emplace_back(t, motion.col(n), dummy, dummy, dummy, Delta, dummy, dummy, dummy, J_D_b); + trajectory.get().emplace_back(t, motion.col(n), M6, V10, M9, Delta, M9, J9, J9, J_D_b); } return trajectory; } - void integrateWithProcessor(int N, const TimeStamp& t0, const Quaternions q0, const MatrixXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt, VectorXs& D_preint, VectorXs& D_corrected) + MotionBuffer integrateWithProcessor(int N, const TimeStamp& t0, const Quaternions q0, const MatrixXs& motion, const VectorXs& bias_real, const VectorXs& bias_preint, Scalar dt, VectorXs& D_preint, VectorXs& D_corrected) { Vector6s motion_now; data = imu::motion2data(motion.col(0), q0, bias_real); @@ -279,6 +283,7 @@ class Process_Constraint_IMU : public testing::Test D_preint = processor_imu->getLastPtr()->getDeltaPreint(); D_corrected = processor_imu->getLastPtr()->getDeltaCorrected(bias_real); } + return processor_imu->getBuffer(); } @@ -358,42 +363,87 @@ class Process_Constraint_IMU : public testing::Test // Integrate Trajectories all methods -// virtual void integrateAllTrajectories() -// { -// size_t cols = motion.cols(); -// MatrixXs Trj_D_exact(10,cols), Trj_D_preint_imu(10,cols), Trj_D_preint(10,cols), Trj_D_corrected(10,cols), Trj_D_corrected_imu(10,cols); -// MatrixXs Trj_x_exact(10,cols), Trj_x_preint_imu(10,cols), Trj_x_preint(10,cols), Trj_x_corrected(10,cols), Trj_x_corrected_imu(10,cols); -// // ===================================== INTEGRATE EXACTLY WITH IMU_TOOLS with no bias at all -// if (motion.cols() == 1) -// Trj_D_exact = integrateDelta(num_integrations, q0, motion, bias_null, bias_null, dt); -// else -// Trj_D_exact = integrateDeltaTrajectory(q0, motion, bias_null, bias_null, dt, J_D_bias); -// Trj_x_exact = imu::composeOverState(x0, D_exact, DT ); -// -// -// // ===================================== INTEGRATE USING IMU_TOOLS -// // pre-integrate -// if (motion.cols() == 1) -// Trj_D_preint_imu = integrateDelta(num_integrations, q0, motion, bias_real, bias_preint, dt, J_D_bias); -// else -// Trj_D_preint_imu = integrateDeltaTrajectory(q0, motion, bias_real, bias_preint, dt, J_D_bias); -// -// // correct perturbated -// step = J_D_bias * (bias_real - bias_preint); -// Trj_D_corrected_imu = imu::plus(D_preint_imu, step); -// -// // compose states -// x1_preint_imu = imu::composeOverState(x0, D_preint_imu , DT ); -// x1_corrected_imu = imu::composeOverState(x0, D_corrected_imu , DT ); -// -// // ===================================== INTEGRATE USING PROCESSOR_IMU -// -// integrateWithProcessor(num_integrations, t0, q0, motion, bias_real, bias_preint, dt, D_preint, D_corrected); -// -// // compose states -// x1_preint = imu::composeOverState(x0, D_preint , DT ); -// x1_corrected = imu::composeOverState(x0, D_corrected , DT ); -// } + virtual void integrateAllTrajectories() + { + Size cols = motion.cols(); + Trj_D_exact.resize(10,cols); Trj_D_preint_imu.resize(10,cols); Trj_D_preint_prc.resize(10,cols); Trj_D_corrected_imu.resize(10,cols); Trj_D_corrected_prc.resize(10,cols); + Trj_x_exact.resize(10,cols); Trj_x_preint_imu.resize(10,cols); Trj_x_preint_prc.resize(10,cols); Trj_x_corrected_imu.resize(10,cols); Trj_x_corrected_prc.resize(10,cols); + + + // ===================================== INTEGRATE EXACTLY WITH IMU_TOOLS with no bias at all + MotionBuffer Buf_exact = integrateDeltaTrajectory(q0, motion, bias_null, bias_null, dt, J_D_bias); + + // Build exact trajectories + int col = 0; + for (auto m : Buf_exact.get()) + { + Trj_D_exact.col(col) = m.delta_integr_; + Trj_x_exact.col(col) = imu::composeOverState(x0, m.delta_integr_, DT ); + col ++; + } + + // set + D_exact = Trj_D_exact.col(cols-1); + x1_exact = Trj_x_exact.col(cols-1); + + // ===================================== INTEGRATE USING IMU_TOOLS + // pre-integrate + MotionBuffer Buf_preint_imu = integrateDeltaTrajectory(q0, motion, bias_real, bias_preint, dt, J_D_bias); + + // Build trajectories preintegrated and corrected with imu_tools + col = 0; + for (auto m : Buf_preint_imu.get()) + { + // preint + Trj_D_preint_imu.col(col) = m.delta_integr_; + Trj_x_preint_imu.col(col) = imu::composeOverState(x0, Trj_D_preint_imu.col(col), DT ); + + // corrected + MatrixXs J_D_bias = m.jacobian_calib_; + VectorXs step = J_D_bias * (bias_real - bias_preint); + Trj_D_corrected_imu.col(col) = imu::plus(m.delta_integr_, step) ; + Trj_x_corrected_imu.col(col) = imu::composeOverState(x0, Trj_D_corrected_imu.col(col), DT ); + col ++; + } + + D_preint_imu = Trj_D_preint_imu.col(cols-1); + + // correct perturbated + step = J_D_bias * (bias_real - bias_preint); + D_corrected_imu = imu::plus(D_preint_imu, step); + + // compose states + x1_preint_imu = imu::composeOverState(x0, D_preint_imu , DT ); + x1_corrected_imu = imu::composeOverState(x0, D_corrected_imu , DT ); + + // ===================================== INTEGRATE USING PROCESSOR_IMU + + MotionBuffer Buf_D_preint_prc = integrateWithProcessor(num_integrations, t0, q0, motion, bias_real, bias_preint, dt, D_preint, D_corrected); + + + // Build trajectories preintegrated and corrected with processorIMU + col = -1; + for (auto m : Buf_D_preint_prc.get()) + { + if (col != -1) + { + // preint + Trj_D_preint_prc.col(col) = m.delta_integr_; + Trj_x_preint_prc.col(col) = imu::composeOverState(x0, Trj_D_preint_prc.col(col), DT ); + + // corrected + MatrixXs J_D_bias = m.jacobian_calib_; + VectorXs step = J_D_bias * (bias_real - bias_preint); + Trj_D_corrected_prc.col(col) = imu::plus(m.delta_integr_, step) ; + Trj_x_corrected_prc.col(col) = imu::composeOverState(x0, Trj_D_corrected_prc.col(col), DT ); + } + col ++; + } + + // compose states + x1_preint = imu::composeOverState(x0, D_preint , DT ); + x1_corrected = imu::composeOverState(x0, D_corrected , DT ); + } @@ -1371,6 +1421,9 @@ TEST_F(Process_Constraint_IMU_ODO, MotionRandom_PqV_b__pqV_b) // F_ixed___e_stim a = Matrix<Scalar, 3, 50>::Random(); w = Matrix<Scalar, 3, 50>::Random(); + a = Matrix<Scalar,3,50>::Identity(); + w = Matrix<Scalar,3,50>::Identity(); + // ---------- fix boundaries p0_fixed = true; q0_fixed = false; @@ -1386,7 +1439,7 @@ TEST_F(Process_Constraint_IMU_ODO, MotionRandom_PqV_b__pqV_b) // F_ixed___e_stim // ===================================== RUN ALL string report = runAll(1); - // printAll(report); + printAll(report); assertAll(); @@ -1416,6 +1469,9 @@ TEST_F(Process_Constraint_IMU_ODO, RecoverTrajectory_MotionRandom_PqV_b__pqV_b) a = Matrix<Scalar, 3, 50>::Random(); w = Matrix<Scalar, 3, 50>::Random(); + a = Matrix<Scalar,3,50>::Identity(); + w = Matrix<Scalar,3,50>::Identity(); + // ---------- fix boundaries p0_fixed = true; q0_fixed = false; @@ -1430,11 +1486,12 @@ TEST_F(Process_Constraint_IMU_ODO, RecoverTrajectory_MotionRandom_PqV_b__pqV_b) // ===================================== RUN ALL configureAll(); +// integrateAllTrajectories(); integrateAll(); buildProblem(); string report = solveProblem(1); - // printAll(report); + printAll(report); assertAll(); @@ -1445,7 +1502,7 @@ int main(int argc, char **argv) testing::InitGoogleTest(&argc, argv); // ::testing::GTEST_FLAG(filter) = "Process_Constraint_IMU.*"; // ::testing::GTEST_FLAG(filter) = "Process_Constraint_IMU_ODO.*"; - ::testing::GTEST_FLAG(filter) = "Process_Constraint_IMU_ODO.RecoverTrajectory_MotionRandom_PqV_b__pqV_b"; + ::testing::GTEST_FLAG(filter) = "Process_Constraint_IMU_ODO.*MotionRandom_PqV_b__pqV_b"; return RUN_ALL_TESTS(); }