diff --git a/src/test/gtest_constraint_imu.cpp b/src/test/gtest_constraint_imu.cpp index b9b5a7e49179c616301c9f8802d1995554d41297..be9c91a23d9a8bcc761900ced0431c9f1ec0d270 100644 --- a/src/test/gtest_constraint_imu.cpp +++ b/src/test/gtest_constraint_imu.cpp @@ -13,13 +13,65 @@ //#define DEBUG_RESULTS -class ConstraintIMU_test : public testing::Test +class ConstraintIMU_testBase : public testing::Test { public: + wolf::ProblemPtr wolf_problem_ptr_; + wolf::TimeStamp ts; + wolf::CaptureIMUPtr imu_ptr; + Eigen::VectorXs state_vec; + Eigen::VectorXs delta_preint; + Eigen::Matrix<wolf::Scalar,9,9> delta_preint_cov; + std::shared_ptr<wolf::FeatureIMU> feat_imu; + wolf::FrameIMUPtr last_frame; + wolf::FrameBasePtr origin_frame; + Eigen::Matrix<wolf::Scalar,9,6> dD_db_jacobians; virtual void SetUp() { + using namespace wolf; + using std::shared_ptr; + using std::make_shared; + using std::static_pointer_cast; + + // Wolf problem + wolf_problem_ptr_ = Problem::create(FRM_PQVBB_3D); + Eigen::VectorXs IMU_extrinsics(7); + IMU_extrinsics << 0,0,0, 0,0,0,1; // IMU pose in the robot + SensorBasePtr sensor_ptr = wolf_problem_ptr_->installSensor("IMU", "Main IMU", IMU_extrinsics, shared_ptr<IntrinsicsBase>()); + wolf_problem_ptr_->installProcessor("IMU", "IMU pre-integrator", "Main IMU", ""); + // Time and data variables + TimeStamp t; + Eigen::Vector6s data_; + + t.set(0); + + // Set the origin + Eigen::VectorXs x0(16); + x0 << 0,0,0, 0,0,0,1, 0,0,0, 0,0,0, 0,0,0; // Try some non-zero biases + wolf_problem_ptr_->getProcessorMotionPtr()->setOrigin(x0, t); + + //create a keyframe at origin + ts = wolf_problem_ptr_->getProcessorMotionPtr()->getBuffer().get().back().ts_; + Eigen::VectorXs origin_state = x0; + origin_frame = std::make_shared<FrameIMU>(KEY_FRAME, ts, origin_state); + wolf_problem_ptr_->getTrajectoryPtr()->addFrame(origin_frame); + + // Create one capture to store the IMU data arriving from (sensor / callback / file / etc.) + imu_ptr = std::make_shared<CaptureIMU>(t, sensor_ptr, data_); + imu_ptr->setFramePtr(origin_frame); + + //process data + data_ << 2, 0, 9.8, 0, 0, 0; + t.set(0.1); + // Expected state after one integration + //x << 0.01,0,0, 0,0,0,1, 0.2,0,0, 0,0,0, 0,0,0; // advanced at a=2m/s2 during 0.1s ==> dx = 0.5*2*0.1^2 = 0.01; dvx = 2*0.1 = 0.2 + // assign data to capture + imu_ptr->setData(data_); + imu_ptr->setTimeStamp(t); + // process data in capture + sensor_ptr->process(imu_ptr); } virtual void TearDown() @@ -37,9 +89,23 @@ class ConstraintIMU_test : public testing::Test }; -TEST_F(ConstraintIMU_test, constructors) -{ +TEST_F(ConstraintIMU_testBase, constructors) +{ + using namespace wolf; + + //create FrameIMU + ts = 0.1; + state_vec << 0.01,0,0, 0,0,0,1, 0.2,0,0, 0,0,0, 0,0,0; + last_frame = std::make_shared<FrameIMU>(KEY_FRAME, ts, state_vec); + + //create a feature + delta_preint_cov = Eigen::MatrixXs::Random(9,9); + delta_preint << 0.01,0,0.049, 0,0,0,1, 0.2,0,0.98; + dD_db_jacobians = Eigen::Matrix<wolf::Scalar,9,6>::Random(); + feat_imu = std::make_shared<FeatureIMU>(delta_preint, delta_preint_cov, imu_ptr, dD_db_jacobians); + //create the constraint + ConstraintIMU constraint_imu(feat_imu,last_frame); }