diff --git a/test/gtest_imu2d_static_init.cpp b/test/gtest_imu2d_static_init.cpp index b5324fbc9f89b395470479f5249b34ae0d9403ab..863147d289cf33dfe4dc272df02d65a9f3dd70b3 100644 --- a/test/gtest_imu2d_static_init.cpp +++ b/test/gtest_imu2d_static_init.cpp @@ -1,3 +1,10 @@ +/* + * gtest_imu2d_static_init.cpp + * + * Created on: Sept 2021 + * Author: igeer + */ + #include <fstream> #include <core/ceres_wrapper/solver_ceres.h> #include <core/utils/utils_gtest.h> @@ -507,252 +514,18 @@ TEST_F(ProcessorImu2dStaticInitTest, static_bias_zero_initial_guess_random) TestStatic(body_magnitudes, bias_groundtruth, bias_initial_guess, "static_bias_zero_initial_guess_random", 3, false); } -//class ProcessorImu2dStaticInitTest : public testing::Test -//{ -// -// public: //These can be accessed in fixtures -// wolf::ProblemPtr _problem_ptr; -// wolf::SensorBasePtr _sensor_ptr; -// wolf::ProcessorMotionPtr _processor_motion; -// wolf::TimeStamp t; -// wolf::TimeStamp t0; -// double mti_clock, tmp; -// double dt; -// bool second_frame; -// bool third_frame; -// Vector6d data; -// Matrix6d data_cov; -// VectorComposite x0c; // initial state composite -// VectorComposite s0c; // initial sigmas composite -// std::shared_ptr<wolf::CaptureImu> C; -// FrameBasePtr _first_frame; -// FrameBasePtr _last_frame; -// SolverCeresPtr _solver; -// -// //a new of this will be created for each new test -// void SetUp() override -// { -// using namespace Eigen; -// using std::shared_ptr; -// using std::make_shared; -// using std::static_pointer_cast; -// using namespace wolf::Constants; -// -// std::string wolf_root = _WOLF_IMU_ROOT_DIR; -// -// // Wolf problem -// _problem_ptr = Problem::create("POV", 2); -// Vector3d extrinsics = (Vector3d() << 0,0, 0).finished(); -// _sensor_ptr = _problem_ptr->installSensor("SensorImu2d", "Main Imu", extrinsics, wolf_root + "/demos/sensor_imu2d.yaml"); -// ProcessorBasePtr processor_ptr = _problem_ptr->installProcessor("ProcessorImu2d", "Imu pre-integrator", "Main Imu", wolf_root + "/demos/imu2d_static_init.yaml"); -// _processor_motion = std::static_pointer_cast<ProcessorMotion>(processor_ptr); -// -// // Time and data variables -// second_frame = false; -// third_frame = false; -// dt = 0.01; -// t0.set(0); -// t = t0; -// data = Vector6d::Random(); -// data_cov = Matrix6d::Identity(); -// _last_frame = nullptr; -// -// // Create one capture to store the Imu data arriving from (sensor / callback / file / etc.) -// C = make_shared<CaptureImu>(t, _sensor_ptr, data, data_cov, Vector3d::Zero()); -// -// // Create the solver -// _solver = make_shared<SolverCeres>(_problem_ptr); -// } -// -//}; -// -// -///** -// * SET TO TRUE TO PRODUCE CSV FILE -// * SET TO FALSE TO STOP PRODUCING CSV FILE -// */ -//#define WRITE_CSV_FILE true -// -//TEST_F(ProcessorImu2dStaticInitTest, static) -//{ -// // Set the origin -// x0c['P'] = Vector2d(0, 0); -// x0c['O'] = Vector1d(0); -// x0c['V'] = Vector2d(0, 0); -// -// data_cov *= 1e-3; -// data << 1, 2, 3, 4, 5, 6; -// Vector3d bias_groundtruth; -// bias_groundtruth << data(0), data(1), data(5); -// //dt = 0.0001; -// auto KF0 = _problem_ptr->setPriorFix(x0c, t0, dt/2); -// KF0->fix(); -// _processor_motion->setOrigin(KF0); -// -// WOLF_INFO("Data is: \n", data); -// int size = 3; -// second_frame = false; -// _first_frame = nullptr; -// -// #if WRITE_CSV_FILE -// std::fstream file_est; -// file_est.open("./est.csv", std::fstream::out); -// // std::string header_est = "t,px,py,pz,qx,qy,qz,qw,vx,vy,vz,bax_est,bax_preint\n"; -// std::string header_est = "t;px;vx;bax_est;bax_preint\n"; -// file_est << header_est; -// #endif -// -// -// int i = 1; -// int n_frames = 0; -// for(t = t0+dt; t <= t0 + 3.1 + dt/2; t+=dt){ -// WOLF_INFO("Starting iteration ", i, " with timestamp ", t); -// ++i; -// C = std::make_shared<CaptureImu>(t, _sensor_ptr, data, data_cov, Vector3d::Zero()); -// WOLF_INFO("Created new Capture"); -// if(second_frame){ -// //ASSERT_MATRIX_APPROX(_processor_motion->getState().vector("POV"), Vector5d::Zero(), 1e-9); -// } -// WOLF_INFO("Processing capture"); -// C->process(); -// WOLF_INFO("Doing the static initialization stuff"); -// if (not _last_frame) -// { -// n_frames++; -// _last_frame = _processor_motion->getOrigin()->getFrame(); -// _first_frame = _last_frame; -// -// // fix Position and orientation -// _last_frame->getP()->fix(); -// _last_frame->getO()->fix(); -// -// // impose zero velocity -// _last_frame->getV()->setZero(); -// _last_frame->getV()->fix(); -// -// // impose zero odometry -// _processor_motion->setOdometry(_sensor_ptr->getProblem()->stateZero(_processor_motion->getStateStructure())); -// } -// else -// { -// assert(_processor_motion->getOrigin() && "SubscriberImuEnableable::callback: nullptr origin"); -// assert(_processor_motion->getOrigin()->getFrame() && "SubscriberImuEnableable::callback: nullptr origin frame"); -// -// // new frame -// if (_last_frame != _processor_motion->getOrigin()->getFrame()) -// { -// n_frames++; -// second_frame = true; -// _last_frame = _processor_motion->getOrigin()->getFrame(); -// -// // fix Position and orientation -// _last_frame->getP()->fix(); -// _last_frame->getO()->fix(); -// -// // impose zero velocity -// _last_frame->getV()->setZero(); -// _last_frame->getV()->fix(); -// -// // impose zero odometry -// _processor_motion->setOdometry(_sensor_ptr->getProblem()->stateZero(_processor_motion->getStateStructure())); -// -// // add zero displacement and rotation capture & feature & factor with all previous frames -// assert(_sensor_ptr->getProblem()); -// Eigen::VectorXd zero_motion = Eigen::VectorXd::Zero(size); -// for (auto frm_pair = _sensor_ptr->getProblem()->getTrajectory()->begin(); -// frm_pair != _sensor_ptr->getProblem()->getTrajectory()->end(); -// frm_pair++) -// { -// if (frm_pair->second == _last_frame) -// break; -// auto capture_zero = CaptureBase::emplace<CaptureVoid>(_last_frame, _last_frame->getTimeStamp(), nullptr); -// auto feature_zero = FeatureBase::emplace<FeatureBase>(capture_zero, -// "FeatureZeroOdom", -// zero_motion, -// Eigen::MatrixXd::Identity(size,size) * 0.01); -// -// FactorBase::emplace<FactorRelativePose2d>(feature_zero, -// feature_zero, -// frm_pair->second, -// nullptr, -// false, -// TOP_MOTION); -// -// } -// } -// } -// WOLF_INFO("Static initialization done"); -// if(_first_frame) -// { -// //WOLF_INFO("0 - The first frame is ", _first_frame->id(), " and it's currently estimated bias is: \n", _first_frame->getCaptureOf(_sensor_ptr)->getStateBlock('I')->getState()); -// //WOLF_INFO("its state vector is: \n", _first_frame->getStateVector()); -// //WOLF_INFO_COND(second_frame, "The second frame has been created"); -// //WOLF_INFO("1 - The last (current) frame is: ", _last_frame->id(), " and it's state vector is: \n", _last_frame->getStateVector()); -// //WOLF_INFO("2 - The current frame's estimated bias is: \n", _last_frame->getCaptureOf(_sensor_ptr)->getStateBlock('I')->getState()); -// //WOLF_INFO("3 - The current state is (from _processor_motion): \n", _processor_motion->getState().vector("POV")); -// } -// //WOLF_INFO("The current problem is:"); -// //_problem_ptr->print(4); -// auto state = _problem_ptr->getState(); -// auto bias_est = _sensor_ptr->getIntrinsic()->getState(); -// auto bias_preint = _processor_motion->getLast()->getCalibrationPreint(); -// -// #if WRITE_CSV_FILE -// // pre-solve print to CSV -// file_est << std::fixed << t << ";" -// << state['P'](0) << ";" -// << state['V'](0) << ";" -// << bias_est(0) << ";" -// << bias_preint(0) << "\n"; -// #endif -// -// if(_problem_ptr->getTrajectory()->getFrameMap().size() > n_frames) -// { -// WOLF_INFO("Solving..."); -// std::string report = _solver->solve(SolverManager::ReportVerbosity::BRIEF); -// -// state = _problem_ptr->getState(); -// bias_est = _sensor_ptr->getIntrinsic()->getState(); -// bias_preint = _processor_motion->getLast()->getCalibrationPreint(); -// -// #if WRITE_CSV_FILE -// // post-solve print to CSV with time-stamp shifted by dt/2 to separate from pre-solve result -// file_est << std::fixed << t+dt/2 << ";" -// << state['P'](0) << ";" -// << state['V'](0) << ";" -// << bias_est(0) << ";" -// << bias_preint(0) << "\n"; -// #endif -// -// -// WOLF_INFO("Solved"); -// if(_first_frame) -// { -// //WOLF_INFO("4 - The first frame is ", _first_frame->id(), " and it's currently estimated bias is: \n", _first_frame->getCaptureOf(_sensor_ptr)->getStateBlock('I')->getState()); -// //WOLF_INFO("its state vector is: \n", _first_frame->getStateVector()); -// //WOLF_INFO_COND(second_frame, "The second frame has been created"); -// //WOLF_INFO("5 - The last (current) frame is: ", _last_frame->id(), " and it's state vector is: \n", _last_frame->getStateVector()); -// //WOLF_INFO("6 - The current frame's estimated bias is: \n", _last_frame->getCaptureOf(_sensor_ptr)->getStateBlock('I')->getState()); -// //WOLF_INFO("7 - The current state is (from _processor_motion): \n", _processor_motion->getState().vector("POV")); -// WOLF_INFO("Current frame is", _processor_motion->getLast()->id()); -// WOLF_INFO("The state is \n:", state); -// WOLF_INFO("The estimated bias is: \n", bias_est); -// WOLF_INFO("The preintegrated bias is: \n", bias_preint); -// } -// if(n_frames > 1) -// { -// ASSERT_MATRIX_APPROX(state.vector("POV"), KF0->getState().vector("POV"), 1e-9); -// ASSERT_MATRIX_APPROX(bias_est, bias_groundtruth, 1e-9); -// } -// if (n_frames > 2) -// { -// ASSERT_MATRIX_APPROX(bias_preint, bias_groundtruth, 1e-9); -// } -// WOLF_INFO("------------------------------------------------------------------------\n"); -// } -// } -//} -// + +TEST_F(ProcessorImu2dStaticInitTest, realistic_test) +{ + Vector3d body_magnitudes = Vector3d::Zero(); + Vector3d bias_groundtruth = (Vector3d() << -0.529550648247, + 0.278316717683, + -0.00122491355676).finished(); + Vector3d bias_initial_guess = Vector3d::Zero(); + + TestStatic(body_magnitudes, bias_groundtruth, bias_initial_guess, "static_bias_zero_initial_guess_random", 3, false); +} + int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); diff --git a/test/gtest_imu_static_init.cpp b/test/gtest_imu_static_init.cpp index 9c2bdbe07c0f8fef4c302d6ad47ab3d5ad13b523..7ad48b186079c12af08b6db42cc014207bc7bc38 100644 --- a/test/gtest_imu_static_init.cpp +++ b/test/gtest_imu_static_init.cpp @@ -1,3 +1,9 @@ +/* + * gtest_imu_static_init.cpp + * + * Created on: Sept 2021 + * Author: igeer + */ #include <fstream> #include <core/ceres_wrapper/solver_ceres.h> @@ -519,152 +525,6 @@ TEST_F(ProcessorImuStaticInitTest, static_bias_zero_initial_guess_random) TestStatic(body_magnitudes, bias_groundtruth, bias_initial_guess, "static_bias_zero_initial_guess_random", 3, false); } -//TEST_F(ProcessorImuStaticInitTest, static) -//{ -// WOLF_INFO("Starting Test"); -// -// data_cov *= 1e-3; -// data << 1, 2, 3, 4, 5, 6; -// data *= 0.01; -// data.head(3) -= wolf::gravity(); -// sensor_ptr_->getIntrinsic(t0)->setState(data); -// data << -wolf::gravity(), 0,0,0; -// //Vector6d bias_groundtruth = data; -// //TODO: Fix this, it works because initial position and extrinsics are 0, but gravity has to be preceded by the quaternion that takes it to the IMU reference -// //WOLF_INFO("The Bias ground_truth is: \n", bias_groundtruth); -// -// //dt = 0.3; -// -// WOLF_INFO("Data is: \n", data); -// //int size = 7; -// -// int i = 1; -// int n_frames = 0; -// for(t = t0+dt; t <= t0 + 3 + dt/2; t+=dt){ -// WOLF_INFO("Starting iteration ", i, " with timestamp ", t); -// ++i; -// auto C = std::make_shared<CaptureImu>(t, sensor_ptr_, data, data_cov); -// //WOLF_INFO("Created new Capture"); -// //WOLF_INFO("Processing capture"); -// C->process(); -// //WOLF_INFO("Doing the static initialization stuff"); -// if (not last_frame_) -// { -// n_frames++; -// last_frame_ = processor_motion_->getOrigin()->getFrame(); -// first_frame_ = last_frame_; -// -// // fix Position and orientation -// last_frame_->getP()->fix(); -// last_frame_->getO()->fix(); -// -// // impose zero velocity -// last_frame_->getV()->setZero(); -// last_frame_->getV()->fix(); -// -// // impose zero odometry -// processor_motion_->setOdometry(sensor_ptr_->getProblem()->stateZero(processor_motion_->getStateStructure())); -// } -// else -// { -// assert(processor_motion_->getOrigin() && "SubscriberImuEnableable::callback: nullptr origin"); -// assert(processor_motion_->getOrigin()->getFrame() && "SubscriberImuEnableable::callback: nullptr origin frame"); -// -// // new frame -// if (last_frame_ != processor_motion_->getOrigin()->getFrame()) -// { -// n_frames++; -// last_frame_ = processor_motion_->getOrigin()->getFrame(); -// -// // TODO: We have to impose that the position is the same as for the first frame and fix it, and do the same for the orientation -// // impose same Position -// last_frame_->getP()->setState(first_frame_->getP()->getState()); -// last_frame_->getP()->fix(); -// // -// // impose same Orientqation -// last_frame_->getO()->setState(first_frame_->getO()->getState()); -// last_frame_->getO()->fix(); -// -// // impose zero Velocity -// last_frame_->getV()->setZero(); -// last_frame_->getV()->fix(); -// -// // impose zero odometry -// processor_motion_->setOdometry(sensor_ptr_->getProblem()->stateZero(processor_motion_->getStateStructure())); -// -// // add zero displacement and rotation capture & feature & factor with all previous frames -// //assert(sensor_ptr_->getProblem()); -// //Eigen::VectorXd zero_motion = Eigen::VectorXd::Zero(size); -// //zero_motion.tail<4>() = Eigen::Quaterniond::Identity().coeffs(); -// -// //for (auto frm_pair = sensor_ptr_->getProblem()->getTrajectory()->begin(); -// // frm_pair != sensor_ptr_->getProblem()->getTrajectory()->end(); -// // frm_pair++) -// //{ -// // if (frm_pair->second == last_frame_) -// // break; -// // auto capture_zero = CaptureBase::emplace<CaptureVoid>(last_frame_, last_frame_->getTimeStamp(), nullptr); -// // auto feature_zero = FeatureBase::emplace<FeatureBase>(capture_zero, -// // "FeatureZeroOdom", -// // zero_motion, -// // Eigen::MatrixXd::Identity(6,6) * 0.01); -// -// // FactorBase::emplace<FactorRelativePose3d>(feature_zero, -// // feature_zero, -// // frm_pair->second, -// // nullptr, -// // false, -// // TOP_MOTION); -// // -// //} -// } -// } -// //WOLF_INFO("Static initialization done"); -// if(first_frame_) -// { -// //WOLF_INFO("0 - The first frame is ", first_frame_->id(), " and it's currently estimated bias is: \n", first_frame_->getCaptureOf(sensor_ptr_)->getStateBlock('I')->getState()); -// //WOLF_INFO("its state vector is: \n", first_frame_->getStateVector()); -// //WOLF_INFO_COND(second_frame, "The second frame has been created"); -// //WOLF_INFO("1 - The last (current) frame is: ", last_frame_->id(), " and it's state vector is: \n", last_frame_->getStateVector()); -// //WOLF_INFO("2 - The current frame's estimated bias is: \n", last_frame_->getCaptureOf(sensor_ptr_)->getStateBlock('I')->getState()); -// //WOLF_INFO("3 - The current state is (from processor_motion_): \n", processor_motion_->getState().vector("POV")); -// } -// WOLF_INFO("The current problem is:"); -// problem_ptr_->print(4); -// //WOLF_INFO("Solving..."); -// std::string report = solver_->solve(SolverManager::ReportVerbosity::FULL); -// WOLF_INFO("Solver Report: ", report); -// -// auto state = problem_ptr_->getState(); -// auto bias_est = sensor_ptr_->getIntrinsic()->getState(); -// auto bias_preint = processor_motion_->getLast()->getCalibrationPreint(); -// -// //WOLF_INFO("Solved"); -// if(first_frame_) -// { -// //WOLF_INFO("4 - The first frame is ", first_frame_->id(), " and it's currently estimated bias is: \n", first_frame_->getCaptureOf(sensor_ptr_)->getStateBlock('I')->getState()); -// //WOLF_INFO("its state vector is: \n", first_frame_->getStateVector()); -// //WOLF_INFO_COND(second_frame, "The second frame has been created"); -// //WOLF_INFO("5 - The last (current) frame is: ", last_frame_->id(), " and it's state vector is: \n", last_frame_->getStateVector()); -// //WOLF_INFO("6 - The current frame's estimated bias is: \n", last_frame_->getCaptureOf(sensor_ptr_)->getStateBlock('I')->getState()); -// //WOLF_INFO("7 - The current state is (from processor_motion_): \n", processor_motion_->getState().vector("POV")); -// WOLF_INFO("Number of frames is ", n_frames, " with ID ", processor_motion_->getLast()->id()); -// WOLF_INFO("The state is: ", state); -// WOLF_INFO("The estimated bias is: ", bias_est.transpose()); -// WOLF_INFO("The preintegrated bias is: ", bias_preint.transpose()); -// } -// if(n_frames > 1) -// { -// //EXPECT_MATRIX_APPROX(state.vector("POV"), KF0->getState().vector("POV"), 1e-9); -// //EXPECT_MATRIX_APPROX(bias_est, bias_groundtruth, 1e-9); -// } -// if (n_frames > 2) -// { -// //EXPECT_MATRIX_APPROX(bias_preint, bias_groundtruth, 1e-9); -// } -// WOLF_INFO("------------------------------------------------------------------------\n"); -// } -//} int main(int argc, char **argv) {