diff --git a/test/gtest_processor_tracker_feature_landmark_external.cpp b/test/gtest_processor_tracker_feature_landmark_external.cpp index a21ebf37efaf63c2edf4ac707db58fa6c2879738..a82e385f35739d3065749cdfc67b43b07c71589d 100644 --- a/test/gtest_processor_tracker_feature_landmark_external.cpp +++ b/test/gtest_processor_tracker_feature_landmark_external.cpp @@ -57,8 +57,9 @@ class ProcessorTrackerFeatureLandmarkExternalTest : public testing::Test ProcessorMotionPtr processor_motion; std::vector<LandmarkBasePtr> landmarks; - // Groundtruth poses - VectorXd p_robot, o_robot, p_sensor, o_sensor; + // Groundtruth states + VectorComposite state_robot, state_sensor; + std::vector<VectorComposite> state_landmarks; virtual void SetUp() {}; void initProblem(int _dim, @@ -77,6 +78,7 @@ class ProcessorTrackerFeatureLandmarkExternalTest : public testing::Test int track_length, double time_span, bool add_landmarks); + void assertVectorComposite(const VectorComposite& v1, const VectorComposite& v2) const; }; void ProcessorTrackerFeatureLandmarkExternalTest::initProblem(int _dim, @@ -179,13 +181,12 @@ void ProcessorTrackerFeatureLandmarkExternalTest::initProblem(int _dim, nullptr)); lmk->setId(i); landmarks.push_back(lmk); + state_landmarks.push_back(lmk->getState()); } // Store groundtruth poses - p_robot = F0->getP()->getState(); - o_robot = F0->getO()->getState(); - p_sensor = sensor->getP()->getState(); - o_sensor = sensor->getO()->getState(); + state_robot = F0->getState("PO"); + state_sensor = sensor->getState("PO"); } void ProcessorTrackerFeatureLandmarkExternalTest::randomStep() @@ -210,38 +211,31 @@ void ProcessorTrackerFeatureLandmarkExternalTest::randomStep() cap_odom->process(); // update groundtruth pose with random movement - auto state = processor_motion->getState("PO"); - p_robot = state.vector("P"); - o_robot = state.vector("O"); + state_robot = processor_motion->getState("PO"); } CaptureLandmarksExternalPtr ProcessorTrackerFeatureLandmarkExternalTest::computeCaptureLandmarks() const { // Detections auto cap = std::make_shared<CaptureLandmarksExternal>(t, sensor); - VectorXd p_lmk, o_lmk; for (auto i = 0; i < landmarks.size(); i++) { - p_lmk = landmarks.at(i)->getP()->getState(); - if (orientation) - o_lmk = landmarks.at(i)->getO()->getState(); - // compute detection VectorXd meas(orientation?(dim==2?3:7):(dim==2?2:3)); if (dim == 2) { - meas.head(2) = Rotation2Dd(-o_sensor(0))*(Rotation2Dd(-o_robot(0))*(p_lmk - p_robot) - p_sensor); + meas.head(2) = Rotation2Dd(-state_sensor.at('O')(0))*(Rotation2Dd(-state_robot.at('O')(0))*(state_landmarks.at(i).at('P') - state_robot.at('P')) - state_sensor.at('P')); if (orientation) - meas(2) = o_lmk(0) - o_robot(0) - o_sensor(0); + meas(2) = state_landmarks.at(i).at('O')(0) - state_robot.at('O')(0) - state_sensor.at('O')(0); } else { - auto q_sensor = Quaterniond(Vector4d(o_sensor)); - auto q_robot = Quaterniond(Vector4d(o_robot)); + auto q_sensor = Quaterniond(Vector4d(state_sensor.at('O'))); + auto q_robot = Quaterniond(Vector4d(state_robot.at('O'))); - meas.head(3) = q_sensor.conjugate() * (q_robot.conjugate() * (p_lmk - p_robot) - p_sensor); + meas.head(3) = q_sensor.conjugate() * (q_robot.conjugate() * (state_landmarks.at(i).at('P') - state_robot.at('P')) - state_sensor.at('P')); if (orientation) - meas.tail(4) = (q_sensor.conjugate() * q_robot.conjugate() * Quaterniond(Vector4d(o_lmk))).coeffs(); + meas.tail(4) = (q_sensor.conjugate() * q_robot.conjugate() * Quaterniond(Vector4d(state_landmarks.at(i).at('O')))).coeffs(); } // cov MatrixXd cov = MatrixXd::Identity(meas.size(), meas.size()); @@ -323,20 +317,8 @@ void ProcessorTrackerFeatureLandmarkExternalTest::testConfiguration(int dim, for (auto lmk_map : landmarks_map) { ASSERT_TRUE(lmk_map->id() < landmarks.size()); - auto lmk_gt = landmarks.at(lmk_map->id()); - ASSERT_EQ(lmk_map->id(), lmk_gt->id()); - if (not orientation) - { - ASSERT_MATRIX_APPROX(lmk_map->getState().vector("P"), lmk_gt->getState().vector("P"), Constants::EPS); - } - else if (dim == 2) - { - ASSERT_POSE2d_APPROX(lmk_map->getState().vector("PO"), lmk_gt->getState().vector("PO"), Constants::EPS); - } - else if (dim == 3) - { - ASSERT_POSE3d_APPROX(lmk_map->getState().vector("PO"), lmk_gt->getState().vector("PO"), Constants::EPS); - } + ASSERT_EQ(lmk_map->id(), landmarks.at(lmk_map->id())->id()); + assertVectorComposite(lmk_map->getState(), state_landmarks.at(lmk_map->id())); } } } @@ -350,24 +332,55 @@ void ProcessorTrackerFeatureLandmarkExternalTest::testConfiguration(int dim, ASSERT_EQ(problem->getMap()->getLandmarkList().empty(), not add_landmarks); } + // step with random movement + t+=dt; + randomStep(); + // solve - if (not problem->getMap()->getLandmarkList().empty()) + if (should_emplace_KF) { - // TODO store gt values + // perturb landmarks + for (auto lmk : problem->getMap()->getLandmarkList()) + lmk->perturb(); - // TODO perturb + // fix frame and extrinsics + sensor->fix(); + problem->getLastFrame()->fix(); // solve - // auto report = solver->solve(SolverManager::ReportVerbosity::FULL); - // WOLF_INFO(report); + auto report = solver->solve(SolverManager::ReportVerbosity::FULL); + WOLF_INFO(report); - // TODO check values + // check values + //assertVectorComposite(sensor->getState("PO"), state_sensor); + //assertVectorComposite(problem->getState("PO"), state_robot); + for (auto lmk_map : problem->getMap()->getLandmarkList()) + { + assertVectorComposite(lmk_map->getState(), state_landmarks.at(lmk_map->id())); + } } + } +} - // step with random movement - t+=dt; - randomStep(); +void ProcessorTrackerFeatureLandmarkExternalTest::assertVectorComposite(const VectorComposite& v1, const VectorComposite& v2) const +{ + if (v1.includesStructure("PO") and v2.includesStructure("PO")) + { + if (dim == 2) + { + ASSERT_POSE2d_APPROX(v1.vector("PO"), v2.vector("PO"), Constants::EPS); + } + else + { + ASSERT_POSE3d_APPROX(v1.vector("PO"), v2.vector("PO"), Constants::EPS); + } } + else if (v1.includesStructure("P") and v2.includesStructure("P")) + { + ASSERT_MATRIX_APPROX(v1.vector("P"), v2.vector("P"), Constants::EPS); + } + else + throw std::runtime_error("wrong vector composite"); } // / TESTS ////////////////////////////////////////// @@ -397,10 +410,10 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, P_2d_no_lmks_quality) { testConfiguration(2, //int dim false, //bool orientation - 0.3, //double quality_th + 0.3, //double quality_th 1e6, //double dist_th 6, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span false); //bool add_landmarks } @@ -411,7 +424,7 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, PO_2d_existing_lmks) 0, //double quality_th 1e6, //double dist_th 3, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span true); //bool add_landmarks } @@ -422,7 +435,7 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, PO_2d_no_lmks) 0, //double quality_th 1e6, //double dist_th 1, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span false); //bool add_landmarks } @@ -430,10 +443,10 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, PO_2d_no_lmks_quality) { testConfiguration(2, //int dim true, //bool orientation - 0.3, //double quality_th + 0.3, //double quality_th 1e6, //double dist_th 0, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span false); //bool add_landmarks } @@ -444,7 +457,7 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, P_3d_existing_lmks) 0, //double quality_th 1e6, //double dist_th 7, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span true); //bool add_landmarks } @@ -454,8 +467,8 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, P_3d_no_lmks) false, //bool orientation 0, //double quality_th 1e6, //double dist_th - 53, //int track_length - 4.5*dt, //double time_span + 53, //int track_length + 4.5*dt, //double time_span false); //bool add_landmarks } @@ -463,10 +476,10 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, P_3d_no_lmks_quality) { testConfiguration(3, //int dim false, //bool orientation - 0.3, //double quality_th + 0.3, //double quality_th 1e6, //double dist_th 2, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span false); //bool add_landmarks } @@ -477,7 +490,7 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, PO_3d_existing_lmks) 0, //double quality_th 1e6, //double dist_th 1, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span true); //bool add_landmarks } @@ -488,7 +501,7 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, PO_3d_no_lmks) 0, //double quality_th 1e6, //double dist_th 4, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span false); //bool add_landmarks } @@ -496,10 +509,10 @@ TEST_F(ProcessorTrackerFeatureLandmarkExternalTest, PO_3d_no_lmks_quality) { testConfiguration(3, //int dim true, //bool orientation - 0.2, //double quality_th + 0.2, //double quality_th 1e6, //double dist_th 5, //int track_length - 4.5*dt, //double time_span + 4.5*dt, //double time_span false); //bool add_landmarks }