From 658022094409b0edf9d335d0875dd5d2820f9223 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 13 May 2020 20:57:59 +0200 Subject: [PATCH 1/8] Fix code for composites --- .../processor_tracker_landmark_image.cpp | 4 +- test/gtest_factor_pixel_hp.cpp | 12 +-- test/gtest_factor_trifocal.cpp | 75 +++++++++---------- ...est_processor_tracker_feature_trifocal.cpp | 2 +- 4 files changed, 43 insertions(+), 50 deletions(-) diff --git a/src/processor/processor_tracker_landmark_image.cpp b/src/processor/processor_tracker_landmark_image.cpp index 0f3fa4a1b..9b09f6931 100644 --- a/src/processor/processor_tracker_landmark_image.cpp +++ b/src/processor/processor_tracker_landmark_image.cpp @@ -96,7 +96,7 @@ unsigned int ProcessorTrackerLandmarkImage::findLandmarks(const LandmarkBasePtrL cv::Mat candidate_descriptors; DMatchVector cv_matches; - Eigen::VectorXd current_state = getProblem()->getState(incoming_ptr_->getTimeStamp()); + Eigen::VectorXd current_state = getProblem()->getState(incoming_ptr_->getTimeStamp()).vector("PO"); for (auto landmark_in_ptr : _landmarks_in) { @@ -397,7 +397,7 @@ void ProcessorTrackerLandmarkImage::drawLandmarks(cv::Mat _image) { unsigned int num_lmks_in_img = 0; - Eigen::VectorXd current_state = last_ptr_->getFrame()->getState(); + Eigen::VectorXd current_state = last_ptr_->getFrame()->getState().vector("PO"); SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(getSensor()); for (auto landmark_base_ptr : getProblem()->getMap()->getLandmarkList()) diff --git a/test/gtest_factor_pixel_hp.cpp b/test/gtest_factor_pixel_hp.cpp index 3b8e24c1f..e9bff78f5 100644 --- a/test/gtest_factor_pixel_hp.cpp +++ b/test/gtest_factor_pixel_hp.cpp @@ -283,7 +283,7 @@ TEST_F(FactorPixelHpTest, testSolveLandmarkAltered) L1->unfix(); auto orig = L1->point(); - L1->getP()->setState(L1->getState() + Vector4d::Random()); + L1->getP()->setState(L1->getState().vector("P") + Vector4d::Random()); std::string report = ceres_manager->solve(wolf::SolverManager::ReportVerbosity::FULL); std::cout << report << std::endl; @@ -312,7 +312,7 @@ TEST_F(FactorPixelHpTest, testSolveFramePosition2ObservableDoF) auto ori = F1->getO()->getState(); Vector7d state; state << position, ori; - F1->setState(state); + F1->setState(VectorComposite(state, "PO", {3,4})); F1->getO()->fix(); F1->getP()->unfix(); @@ -402,9 +402,9 @@ TEST_F(FactorPixelHpTest, testSolveFramePosition) Vector3d position; position << Vector3d::Random()*100;//2.0, 2.0, 2.0; auto ori = F1->getO()->getState(); - Vector7d state; - state << position, ori; - F1->setState(state); +// Vector7d state; +// state << position, ori; + F1->setState("PO", {position, ori}); F1->getO()->fix(); F1->getP()->unfix(); @@ -430,7 +430,7 @@ TEST_F(FactorPixelHpTest, testSolveBundleAdjustment) // Go around a weird bug: if we do not perturbate this LMK then the test fails. - L1->getP()->setState(L1->getState() + Vector4d::Random()*1e-12); + L1->perturb(1e-12); diff --git a/test/gtest_factor_trifocal.cpp b/test/gtest_factor_trifocal.cpp index c331232d9..5ded0304c 100644 --- a/test/gtest_factor_trifocal.cpp +++ b/test/gtest_factor_trifocal.cpp @@ -356,9 +356,9 @@ TEST_F(FactorTrifocalTest, operator_parenthesis) TEST_F(FactorTrifocalTest, solve_F1) { - F1->setState(pose1); - F2->setState(pose2); - F3->setState(pose3); + F1->setState("PO", { pose1.head(3), pose1.tail(4) } ); + F2->setState("PO", { pose2.head(3), pose2.tail(4) } ); + F3->setState("PO", { pose3.head(3), pose3.tail(4) } ); S ->getP()->setState(pos_cam); S ->getO()->setState(vquat_cam); // Residual with prior @@ -386,9 +386,11 @@ TEST_F(FactorTrifocalTest, solve_F1) // Residual with perturbated state - Vector7d pose_perturbated = F1->getState() + 0.1 * Vector7d::Random(); - pose_perturbated.segment(3,4).normalize(); - F1->setState(pose_perturbated); +// Vector7d pose_perturbated = F1->getState() + 0.1 * Vector7d::Random(); +// pose_perturbated.segment(3,4).normalize(); +// F1->setState(pose_perturbated); + F1->perturb(0.1); +// VectorXd pose_perturbated = F1->getState().vector("PO"); F1_p = F1->getP()->getState(); F1_o = F1->getO()->getState(); @@ -399,7 +401,7 @@ TEST_F(FactorTrifocalTest, solve_F1) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("perturbed state: ", pose_perturbated.transpose()); + WOLF_DEBUG("perturbed state: ", F1->getState().vector("PO").transpose()); WOLF_DEBUG("residual before solve: ", res.transpose()); // Residual with solved state @@ -426,7 +428,7 @@ TEST_F(FactorTrifocalTest, solve_F1) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("solved state: ", F1->getState().transpose()); + WOLF_DEBUG("solved state: ", F1->getState().vector("PO").transpose()); WOLF_DEBUG("residual after solve: ", res.transpose()); WOLF_DEBUG(report, " AND UNION"); @@ -437,9 +439,9 @@ TEST_F(FactorTrifocalTest, solve_F1) TEST_F(FactorTrifocalTest, solve_F2) { - F1->setState(pose1); - F2->setState(pose2); - F3->setState(pose3); + F1->setState("PO", { pose1.head(3), pose1.tail(4) } ); + F2->setState("PO", { pose2.head(3), pose2.tail(4) } ); + F3->setState("PO", { pose3.head(3), pose3.tail(4) } ); S ->getP()->setState(pos_cam); S ->getO()->setState(vquat_cam); @@ -462,15 +464,13 @@ TEST_F(FactorTrifocalTest, solve_F2) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("Initial state: ", F2->getState().transpose()); + WOLF_DEBUG("Initial state: ", F2->getState().vector("PO").transpose()); WOLF_DEBUG("residual before perturbing: ", res.transpose()); ASSERT_MATRIX_APPROX(res, Vector3d::Zero(), 1e-8); // Residual with perturbated state - Vector7d pose_perturbated = F2->getState() + 0.1 * Vector7d::Random(); - pose_perturbated.segment(3,4).normalize(); - F2->setState(pose_perturbated); + F2->perturb(0.1); F2_p = F2->getP()->getState(); F2_o = F2->getO()->getState(); @@ -481,7 +481,7 @@ TEST_F(FactorTrifocalTest, solve_F2) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("perturbed state: ", pose_perturbated.transpose()); + WOLF_DEBUG("perturbed state: ", F2->getState().vector("PO").transpose()); WOLF_DEBUG("residual before solve: ", res.transpose()); // Residual with solved state @@ -508,7 +508,7 @@ TEST_F(FactorTrifocalTest, solve_F2) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("solved state: ", F2->getState().transpose()); + WOLF_DEBUG("solved state: ", F2->getState().vector("PO").transpose()); WOLF_DEBUG("residual after solve: ", res.transpose()); WOLF_DEBUG(report, " AND UNION"); @@ -519,9 +519,9 @@ TEST_F(FactorTrifocalTest, solve_F2) TEST_F(FactorTrifocalTest, solve_F3) { - F1->setState(pose1); - F2->setState(pose2); - F3->setState(pose3); + F1->setState("PO", { pose1.head(3), pose1.tail(4) } ); + F2->setState("PO", { pose2.head(3), pose2.tail(4) } ); + F3->setState("PO", { pose3.head(3), pose3.tail(4) } ); S ->getP()->setState(pos_cam); S ->getO()->setState(vquat_cam); @@ -544,15 +544,13 @@ TEST_F(FactorTrifocalTest, solve_F3) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("Initial state: ", F3->getState().transpose()); + WOLF_DEBUG("Initial state: ", F3->getState().vector("PO").transpose()); WOLF_DEBUG("residual before perturbing: ", res.transpose()); ASSERT_MATRIX_APPROX(res, Vector3d::Zero(), 1e-8); // Residual with perturbated state - Vector7d pose_perturbated = F3->getState() + 0.1 * Vector7d::Random(); - pose_perturbated.segment(3,4).normalize(); - F3->setState(pose_perturbated); + F3->perturb(0.1); F3_p = F3->getP()->getState(); F3_o = F3->getO()->getState(); @@ -563,7 +561,7 @@ TEST_F(FactorTrifocalTest, solve_F3) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("perturbed state: ", pose_perturbated.transpose()); + WOLF_DEBUG("perturbed state: ", F3->getState().vector("PO").transpose()); WOLF_DEBUG("residual before solve: ", res.transpose()); ASSERT_NEAR(res(2), 0, 1e-8); // Epipolar c2-c1 should be respected when perturbing F3 @@ -591,7 +589,7 @@ TEST_F(FactorTrifocalTest, solve_F3) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("solved state: ", F3->getState().transpose()); + WOLF_DEBUG("solved state: ", F3->getState().vector("PO").transpose()); WOLF_DEBUG("residual after solve: ", res.transpose()); WOLF_DEBUG(report, " AND UNION"); @@ -602,9 +600,9 @@ TEST_F(FactorTrifocalTest, solve_F3) TEST_F(FactorTrifocalTest, solve_S) { - F1->setState(pose1); - F2->setState(pose2); - F3->setState(pose3); + F1->setState(pose1, "PO", {3,4}); + F2->setState(pose2, "PO", {3,4}); + F3->setState(pose3, "PO", {3,4}); S ->getP()->setState(pos_cam); S ->getO()->setState(vquat_cam); @@ -633,12 +631,7 @@ TEST_F(FactorTrifocalTest, solve_S) // Residual with perturbated state - Vector3d pos_perturbated = pos_cam + 0.1 * Vector3d::Random(); - Vector4d ori_perturbated = vquat_cam + 0.1 * Vector4d::Random(); - ori_perturbated.normalize(); - Vector7d pose_perturbated; pose_perturbated << pos_perturbated, ori_perturbated; - S->getP()->setState(pos_perturbated); - S->getO()->setState(ori_perturbated); + S->perturb(0.1); S_p = S->getP()->getState(); S_o = S->getO()->getState(); @@ -649,7 +642,7 @@ TEST_F(FactorTrifocalTest, solve_S) S_p. data(), S_o. data(), res.data()); - WOLF_DEBUG("perturbed state: ", pose_perturbated.transpose()); + WOLF_DEBUG("perturbed state: ", S->getState().vector("PO").transpose()); WOLF_DEBUG("residual before solve: ", res.transpose()); // Residual with solved state @@ -791,10 +784,10 @@ TEST_F(FactorTrifocalMultiPointTest, solve_multi_point) problem->print(1,0,1,0); // Evaluate final states - ASSERT_MATRIX_APPROX(F2->getP()->getState(), pos2 , 1e-10); - ASSERT_MATRIX_APPROX(F2->getO()->getState(), vquat2, 1e-10); - ASSERT_MATRIX_APPROX(F3->getP()->getState(), pos3 , 1e-10); - ASSERT_MATRIX_APPROX(F3->getO()->getState(), vquat3, 1e-10); + ASSERT_MATRIX_APPROX(F2->getP()->getState(), pos2 , 1e-6); + ASSERT_MATRIX_APPROX(F2->getO()->getState(), vquat2, 1e-6); + ASSERT_MATRIX_APPROX(F3->getP()->getState(), pos3 , 1e-6); + ASSERT_MATRIX_APPROX(F3->getO()->getState(), vquat3, 1e-6); Eigen::VectorXd F1_p = F1->getP()->getState(); Eigen::VectorXd F1_o = F1->getO()->getState(); @@ -815,7 +808,7 @@ TEST_F(FactorTrifocalMultiPointTest, solve_multi_point) S_p. data(), S_o. data(), res.data()); - ASSERT_MATRIX_APPROX(res, Vector3d::Zero(), 1e-10); + ASSERT_MATRIX_APPROX(res, Vector3d::Zero(), 1e-8); } } diff --git a/test/gtest_processor_tracker_feature_trifocal.cpp b/test/gtest_processor_tracker_feature_trifocal.cpp index e4ac851df..7580dc2b2 100644 --- a/test/gtest_processor_tracker_feature_trifocal.cpp +++ b/test/gtest_processor_tracker_feature_trifocal.cpp @@ -152,7 +152,7 @@ TEST(ProcessorTrackerFeatureTrifocal, KeyFrameCallback) problem->print(2,0,1,0); // Only odom creating KFs - ASSERT_TRUE( problem->getLastKeyFrame()->getType().compare("PO 3d")==0 ); +// ASSERT_TRUE( problem->getLastKeyFrame()->getType().compare("PO 3d")==0 ); } } -- GitLab From 1ce7217efa5661ac550139587c458b18db3f6f54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Fri, 29 May 2020 10:39:37 +0200 Subject: [PATCH 2/8] remove odd template keyword --- include/vision/factor/factor_epipolar.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/vision/factor/factor_epipolar.h b/include/vision/factor/factor_epipolar.h index b127c201b..caba7a154 100644 --- a/include/vision/factor/factor_epipolar.h +++ b/include/vision/factor/factor_epipolar.h @@ -158,8 +158,8 @@ inline bool FactorEpipolar::operator ()(const T* const _frame_own_p, // Covariance of error Matrix<T, 1, 1> Q_e = - J_e_uown .template block<1, 2>(0, 0) * getFeature() ->getMeasurementCovariance().cast<T>() * J_e_uown .template block<1, 2>(0, 0).template transpose() - + J_e_uother.template block<1, 2>(0, 0) * getFeatureOther()->getMeasurementCovariance().cast<T>() * J_e_uother.template block<1, 2>(0, 0).template transpose(); + J_e_uown .template block<1, 2>(0, 0) * getFeature() ->getMeasurementCovariance().cast<T>() * J_e_uown .template block<1, 2>(0, 0). transpose() + + J_e_uother.template block<1, 2>(0, 0) * getFeatureOther()->getMeasurementCovariance().cast<T>() * J_e_uother.template block<1, 2>(0, 0). transpose(); // Sqrt of inverse of the covariance is sigma^-1 T sigma_inv = 1.0 / sqrt(Q_e(0, 0)); -- GitLab From 526bbf36483f14a2b30f53191afef4c5f28e1b25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Fri, 29 May 2020 10:39:59 +0200 Subject: [PATCH 3/8] Add structure in constructor call --- src/processor/processor_bundle_adjustment.cpp | 2 +- src/processor/processor_tracker_feature_image.cpp | 2 +- src/processor/processor_tracker_feature_trifocal.cpp | 2 +- src/processor/processor_tracker_landmark_image.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/processor/processor_bundle_adjustment.cpp b/src/processor/processor_bundle_adjustment.cpp index 19133a326..4a95b3cbd 100644 --- a/src/processor/processor_bundle_adjustment.cpp +++ b/src/processor/processor_bundle_adjustment.cpp @@ -18,7 +18,7 @@ namespace wolf{ ProcessorBundleAdjustment::ProcessorBundleAdjustment(ParamsProcessorBundleAdjustmentPtr _params_bundle_adjustment) : - ProcessorTrackerFeature("ProcessorBundleAdjustment", 3, _params_bundle_adjustment), + ProcessorTrackerFeature("ProcessorBundleAdjustment", "PO", 3, _params_bundle_adjustment), params_bundle_adjustment_(_params_bundle_adjustment), capture_image_last_(nullptr), capture_image_incoming_(nullptr), diff --git a/src/processor/processor_tracker_feature_image.cpp b/src/processor/processor_tracker_feature_image.cpp index 875be21a0..a064c624f 100644 --- a/src/processor/processor_tracker_feature_image.cpp +++ b/src/processor/processor_tracker_feature_image.cpp @@ -15,7 +15,7 @@ namespace wolf { ProcessorTrackerFeatureImage::ProcessorTrackerFeatureImage(ParamsProcessorTrackerFeatureImagePtr _params_tracker_feature_image) : - ProcessorTrackerFeature("ProcessorTrackerFeatureImage", 3, _params_tracker_feature_image), + ProcessorTrackerFeature("ProcessorTrackerFeatureImage", "PO", 3, _params_tracker_feature_image), cell_width_(0), cell_height_(0), // These will be initialized to proper values taken from the sensor via function configure() params_tracker_feature_image_(_params_tracker_feature_image) { diff --git a/src/processor/processor_tracker_feature_trifocal.cpp b/src/processor/processor_tracker_feature_trifocal.cpp index 6a58f1d68..dc079241c 100644 --- a/src/processor/processor_tracker_feature_trifocal.cpp +++ b/src/processor/processor_tracker_feature_trifocal.cpp @@ -30,7 +30,7 @@ namespace wolf { // Constructor ProcessorTrackerFeatureTrifocal::ProcessorTrackerFeatureTrifocal(ParamsProcessorTrackerFeatureTrifocalPtr _params_tracker_feature_trifocal) : - ProcessorTrackerFeature("ProcessorTrackerFeatureTrifocal", 3, _params_tracker_feature_trifocal ), + ProcessorTrackerFeature("ProcessorTrackerFeatureTrifocal", "PO", 3, _params_tracker_feature_trifocal ), params_tracker_feature_trifocal_(_params_tracker_feature_trifocal), capture_image_last_(nullptr), capture_image_incoming_(nullptr), diff --git a/src/processor/processor_tracker_landmark_image.cpp b/src/processor/processor_tracker_landmark_image.cpp index 9b09f6931..ecf37b51a 100644 --- a/src/processor/processor_tracker_landmark_image.cpp +++ b/src/processor/processor_tracker_landmark_image.cpp @@ -27,7 +27,7 @@ namespace wolf { ProcessorTrackerLandmarkImage::ProcessorTrackerLandmarkImage(ParamsProcessorTrackerLandmarkImagePtr _params_tracker_landmark_image) : - ProcessorTrackerLandmark("ProcessorTrackerLandmarkImage", _params_tracker_landmark_image), + ProcessorTrackerLandmark("ProcessorTrackerLandmarkImage", "PO", _params_tracker_landmark_image), cell_width_(0), cell_height_(0), params_tracker_landmark_image_(_params_tracker_landmark_image), -- GitLab From 6c9b982440db70d2018223f1c1095e9d282c5009 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Fri, 29 May 2020 10:40:14 +0200 Subject: [PATCH 4/8] Fix tests for new API changes --- test/gtest_factor_epipolar.cpp | 4 ++-- test/gtest_factor_pixel_hp.cpp | 8 ++++---- test/gtest_factor_trifocal.cpp | 6 +++--- test/gtest_processor_bundle_adjustment.cpp | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/test/gtest_factor_epipolar.cpp b/test/gtest_factor_epipolar.cpp index ea3d18606..50fa29723 100644 --- a/test/gtest_factor_epipolar.cpp +++ b/test/gtest_factor_epipolar.cpp @@ -41,8 +41,8 @@ TEST(FactorEpipolar, exemple) auto S = P->installSensor("SensorCamera", "camera", posecam, intr); auto camera = std::static_pointer_cast<SensorCamera>(S); - auto F0 = P ->emplaceFrame(KEY, pose0, 0.0); - auto F1 = P ->emplaceFrame(KEY, pose1, 1.0); + auto F0 = P ->emplaceFrame(KEY, 0.0, pose0); + auto F1 = P ->emplaceFrame(KEY, 1.0, pose1); auto C0 = CaptureBase ::emplace<CaptureImage>(F0, F0->getTimeStamp(), camera, cv::Mat()); auto C1 = CaptureBase ::emplace<CaptureImage>(F1, F1->getTimeStamp(), camera, cv::Mat()); auto f0 = FeatureBase ::emplace<FeaturePointImage>(C0, pix0, 0, cv::Mat(), Matrix2d::Identity()); diff --git a/test/gtest_factor_pixel_hp.cpp b/test/gtest_factor_pixel_hp.cpp index e9bff78f5..0514ba900 100644 --- a/test/gtest_factor_pixel_hp.cpp +++ b/test/gtest_factor_pixel_hp.cpp @@ -172,15 +172,15 @@ class FactorPixelHpTest : public testing::Test{ cv::KeyPoint kp = cv::KeyPoint(p, 32.0f); cv::Mat des = cv::Mat::zeros(1,8, CV_8UC1); - F1 = problem->emplaceFrame(KEY, pose1, 1.0); + F1 = problem->emplaceFrame(KEY, 1.0, pose1); I1 = std::static_pointer_cast<CaptureImage>(CaptureBase::emplace<CaptureImage>(F1, 1.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1))); f11 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I1, kp, 0, des, pix_cov)); // pixel at origin - F2 = problem->emplaceFrame(KEY, pose2, 2.0); + F2 = problem->emplaceFrame(KEY, 2.0, pose2); I2 = std::static_pointer_cast<CaptureImage>((CaptureBase::emplace<CaptureImage>(F2, 2.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1)))); f21 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I2, kp, 0, des, pix_cov)); // pixel at origin - F3 = problem->emplaceFrame(KEY, pose3, 3.0); + F3 = problem->emplaceFrame(KEY, 3.0, pose3); I3 = std::static_pointer_cast<CaptureImage>(CaptureBase::emplace<CaptureImage>(F3, 3.0, camera, cv::Mat(intr->width,intr->height,CV_8UC1))); f31 = std::static_pointer_cast<FeaturePointImage>(FeatureBase::emplace<FeaturePointImage>(I3, kp, 0, des, pix_cov)); // pixel at origin @@ -221,7 +221,7 @@ TEST(ProcessorFactorPixelHp, testZeroResidual) ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); // Frame - FrameBasePtr frm0 = problem_ptr->emplaceFrame(KEY, problem_ptr->zeroState(), TimeStamp(0)); + FrameBasePtr frm0 = problem_ptr->emplaceFrame(KEY, 0.0, problem_ptr->stateZero()); // Capture auto cap0 = std::static_pointer_cast<CaptureImage>(CaptureImage::emplace<CaptureImage>(frm0, TimeStamp(0), camera, cv::Mat::zeros(480,640, 1))); diff --git a/test/gtest_factor_trifocal.cpp b/test/gtest_factor_trifocal.cpp index 5ded0304c..ba1fb43dc 100644 --- a/test/gtest_factor_trifocal.cpp +++ b/test/gtest_factor_trifocal.cpp @@ -142,15 +142,15 @@ class FactorTrifocalTest : public testing::Test{ Vector2d pix(0,0); Matrix2d pix_cov(Matrix2d::Identity() * pow(pixel_noise_std, 2)); - F1 = problem->emplaceFrame(KEY, pose1, 1.0); + F1 = problem->emplaceFrame(KEY, 1.0, pose1); I1 = std::static_pointer_cast<CaptureImage>(CaptureBase::emplace<CaptureImage>(F1, 1.0, camera, cv::Mat(2,2,CV_8UC1))); f1 = FeatureBase::emplace<FeatureBase>(I1, "PIXEL", pix, pix_cov); // pixel at origin - F2 = problem->emplaceFrame(KEY, pose2, 2.0); + F2 = problem->emplaceFrame(KEY, 2.0, pose2); I2 = std::static_pointer_cast<CaptureImage>((CaptureBase::emplace<CaptureImage>(F2, 2.0, camera, cv::Mat(2,2,CV_8UC1)))); f2 = FeatureBase::emplace<FeatureBase>(I2, "PIXEL", pix, pix_cov); // pixel at origin - F3 = problem->emplaceFrame(KEY, pose3, 3.0); + F3 = problem->emplaceFrame(KEY, 3.0, pose3); I3 = std::static_pointer_cast<CaptureImage>(CaptureBase::emplace<CaptureImage>(F3, 3.0, camera, cv::Mat(2,2,CV_8UC1))); f3 = FeatureBase::emplace<FeatureBase>(I3, "PIXEL", pix, pix_cov); // pixel at origin diff --git a/test/gtest_processor_bundle_adjustment.cpp b/test/gtest_processor_bundle_adjustment.cpp index 842c53d74..ca5670248 100644 --- a/test/gtest_processor_bundle_adjustment.cpp +++ b/test/gtest_processor_bundle_adjustment.cpp @@ -255,7 +255,7 @@ TEST(ProcessorBundleAdjustment, emplaceLandmark) ProcessorBundleAdjustmentPtr proc_bundle_adj = std::static_pointer_cast<ProcessorBundleAdjustment>(proc); //Frame - FrameBasePtr frm0 = problem_ptr->emplaceFrame(KEY, problem_ptr->zeroState(), TimeStamp(0)); + FrameBasePtr frm0 = problem_ptr->emplaceFrame(KEY, 0.0, problem_ptr->stateZero()); // Capture, feature and factor auto cap0 = std::static_pointer_cast<CaptureImage>(CaptureImage::emplace<CaptureImage>(frm0, TimeStamp(0), camera, cv::Mat::zeros(480,640, 1))); -- GitLab From dd82de22da1fc8eb8e93b49ffd1f8879c7b62379 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 3 Jun 2020 09:48:11 +0200 Subject: [PATCH 5/8] Remobe get() from MotionBuffer calls --- demos/demo_diff_drive.cpp | 6 +++--- demos/demo_factor_imu.cpp | 6 +++--- demos/demo_mpu.cpp | 8 ++++---- demos/demo_processor_imu.cpp | 8 ++++---- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/demos/demo_diff_drive.cpp b/demos/demo_diff_drive.cpp index 4b8b77b4e..399f9a392 100644 --- a/demos/demo_diff_drive.cpp +++ b/demos/demo_diff_drive.cpp @@ -279,10 +279,10 @@ int main(int argc, char** argv) // Print statistics TimeStamp t0, tf; - t0 = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().front().ts_; - tf = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().back().ts_; + t0 = wolf_problem_ptr_->getProcessorMotion()->getBuffer().front().ts_; + tf = wolf_problem_ptr_->getProcessorMotion()->getBuffer().back().ts_; - double N = (double)wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().size(); + double N = (double)wolf_problem_ptr_->getProcessorMotion()->getBuffer().size(); WOLF_INFO("t0 : " , t0.get() , " secs"); WOLF_INFO("tf : " , tf.get() , " secs"); diff --git a/demos/demo_factor_imu.cpp b/demos/demo_factor_imu.cpp index d8ab22bd3..91a5cca46 100644 --- a/demos/demo_factor_imu.cpp +++ b/demos/demo_factor_imu.cpp @@ -78,7 +78,7 @@ int main(int argc, char** argv) /// ******************************************************************************************** /// /// factor creation //create FrameIMU - ts = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().back().ts_; + ts = wolf_problem_ptr_->getProcessorMotion()->getBuffer().back().ts_; state_vec = wolf_problem_ptr_->getProcessorMotion()->getCurrentState(); FrameIMUPtr last_frame = std::make_shared<FrameIMU>(KEY, ts, state_vec); wolf_problem_ptr_->getTrajectory()->addFrame(last_frame); @@ -139,7 +139,7 @@ int main(int argc, char** argv) /// ******************************************************************************************** /// /// factor creation //create FrameIMU - ts = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().back().ts_; + ts = wolf_problem_ptr_->getProcessorMotion()->getBuffer().back().ts_; state_vec = wolf_problem_ptr_->getProcessorMotion()->getCurrentState(); FrameIMUPtr last_frame = std::make_shared<FrameIMU>(KEY, ts, state_vec); wolf_problem_ptr_->getTrajectory()->addFrame(last_frame); @@ -197,7 +197,7 @@ int main(int argc, char** argv) //create the factor //create FrameIMU - ts = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().back().ts_; + ts = wolf_problem_ptr_->getProcessorMotion()->getBuffer().back().ts_; state_vec = wolf_problem_ptr_->getProcessorMotion()->getCurrentState(); FrameIMUPtr last_frame = std::make_shared<FrameIMU>(KEY, ts, state_vec); wolf_problem_ptr_->getTrajectory()->addFrame(last_frame); diff --git a/demos/demo_mpu.cpp b/demos/demo_mpu.cpp index 16b74b5cb..5d58f4b63 100644 --- a/demos/demo_mpu.cpp +++ b/demos/demo_mpu.cpp @@ -168,7 +168,7 @@ int main(int argc, char** argv) delta_debug = wolf_problem_ptr_->getProcessorMotion()->getMotion().delta_; delta_integr_debug = wolf_problem_ptr_->getProcessorMotion()->getMotion().delta_integr_; x_debug = wolf_problem_ptr_->getProcessorMotion()->getCurrentState(); - ts = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().back().ts_; + ts = wolf_problem_ptr_->getProcessorMotion()->getBuffer().back().ts_; if(debug_results) debug_results << ts.get() << "\t" << delta_debug(0) << "\t" << delta_debug(1) << "\t" << delta_debug(2) << "\t" << delta_debug(3) << "\t" << delta_debug(4) << "\t" @@ -204,9 +204,9 @@ int main(int argc, char** argv) #endif TimeStamp t0, tf; - t0 = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().front().ts_; - tf = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().back().ts_; - int N = wolf_problem_ptr_->getProcessorMotion()->getBuffer().get().size(); + t0 = wolf_problem_ptr_->getProcessorMotion()->getBuffer().front().ts_; + tf = wolf_problem_ptr_->getProcessorMotion()->getBuffer().back().ts_; + int N = wolf_problem_ptr_->getProcessorMotion()->getBuffer().size(); std::cout << "t0 : " << t0.get() << " s" << std::endl; std::cout << "tf : " << tf.get() << " s" << std::endl; std::cout << "duration : " << tf-t0 << " s" << std::endl; diff --git a/demos/demo_processor_imu.cpp b/demos/demo_processor_imu.cpp index b6d13a30b..d7a01a741 100644 --- a/demos/demo_processor_imu.cpp +++ b/demos/demo_processor_imu.cpp @@ -158,7 +158,7 @@ int main(int argc, char** argv) delta_debug = problem_ptr_->getProcessorMotion()->getMotion().delta_; delta_integr_debug = problem_ptr_->getProcessorMotion()->getMotion().delta_integr_; x_debug = problem_ptr_->getProcessorMotion()->getCurrentState(); - ts = problem_ptr_->getProcessorMotion()->getBuffer().get().back().ts_; + ts = problem_ptr_->getProcessorMotion()->getBuffer().back().ts_; if(debug_results) debug_results << ts.get() << "\t" << delta_debug(0) << "\t" << delta_debug(1) << "\t" << delta_debug(2) << "\t" << delta_debug(3) << "\t" << delta_debug(4) << "\t" @@ -194,9 +194,9 @@ int main(int argc, char** argv) #endif TimeStamp t0, tf; - t0 = problem_ptr_->getProcessorMotion()->getBuffer().get().front().ts_; - tf = problem_ptr_->getProcessorMotion()->getBuffer().get().back().ts_; - int N = problem_ptr_->getProcessorMotion()->getBuffer().get().size(); + t0 = problem_ptr_->getProcessorMotion()->getBuffer().front().ts_; + tf = problem_ptr_->getProcessorMotion()->getBuffer().back().ts_; + int N = problem_ptr_->getProcessorMotion()->getBuffer().size(); std::cout << "t0 : " << t0.get() << " s" << std::endl; std::cout << "tf : " << tf.get() << " s" << std::endl; std::cout << "duration : " << tf-t0 << " s" << std::endl; -- GitLab From 53260f5de98d53a6fd833dda915e73ceb387eb0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Wed, 3 Jun 2020 09:48:17 +0200 Subject: [PATCH 6/8] small --- include/vision/factor/factor_epipolar.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/vision/factor/factor_epipolar.h b/include/vision/factor/factor_epipolar.h index caba7a154..55fd40059 100644 --- a/include/vision/factor/factor_epipolar.h +++ b/include/vision/factor/factor_epipolar.h @@ -158,8 +158,8 @@ inline bool FactorEpipolar::operator ()(const T* const _frame_own_p, // Covariance of error Matrix<T, 1, 1> Q_e = - J_e_uown .template block<1, 2>(0, 0) * getFeature() ->getMeasurementCovariance().cast<T>() * J_e_uown .template block<1, 2>(0, 0). transpose() - + J_e_uother.template block<1, 2>(0, 0) * getFeatureOther()->getMeasurementCovariance().cast<T>() * J_e_uother.template block<1, 2>(0, 0). transpose(); + J_e_uown .template block<1, 2>(0, 0) * getFeature() ->getMeasurementCovariance().cast<T>() * J_e_uown .template block<1, 2>(0, 0).transpose() + + J_e_uother.template block<1, 2>(0, 0) * getFeatureOther()->getMeasurementCovariance().cast<T>() * J_e_uother.template block<1, 2>(0, 0).transpose(); // Sqrt of inverse of the covariance is sigma^-1 T sigma_inv = 1.0 / sqrt(Q_e(0, 0)); -- GitLab From 6eb9f9ae94bd56110d0da44a2db49c3c8bf12859 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Sat, 6 Jun 2020 11:37:27 +0200 Subject: [PATCH 7/8] Fix Factor constructor calls --- include/vision/factor/factor_ahp.h | 1 + include/vision/factor/factor_epipolar.h | 1 + include/vision/factor/factor_pixel_hp.h | 1 + include/vision/factor/factor_trifocal.h | 11 ++++++----- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/include/vision/factor/factor_ahp.h b/include/vision/factor/factor_ahp.h index b45ecbc04..b1a588900 100644 --- a/include/vision/factor/factor_ahp.h +++ b/include/vision/factor/factor_ahp.h @@ -63,6 +63,7 @@ inline FactorAhp::FactorAhp(const FeatureBasePtr& _ftr_ptr, bool _apply_loss_function, FactorStatus _status) : FactorAutodiff<FactorAhp, 2, 3, 4, 3, 4, 4>("AHP", + _ftr_ptr, _landmark_ptr->getAnchorFrame(), nullptr, nullptr, diff --git a/include/vision/factor/factor_epipolar.h b/include/vision/factor/factor_epipolar.h index 55fd40059..f6654884d 100644 --- a/include/vision/factor/factor_epipolar.h +++ b/include/vision/factor/factor_epipolar.h @@ -47,6 +47,7 @@ inline FactorEpipolar::FactorEpipolar(const FeatureBasePtr& _feature_ptr, bool _apply_loss_function, FactorStatus _status) : FactorAutodiff<FactorEpipolar, 1, 3, 4, 3, 4, 3, 4>("FEATURE EPIPOLAR", + _feature_ptr, nullptr, nullptr, _feature_other_ptr, diff --git a/include/vision/factor/factor_pixel_hp.h b/include/vision/factor/factor_pixel_hp.h index dd52776d3..13f3d0cff 100644 --- a/include/vision/factor/factor_pixel_hp.h +++ b/include/vision/factor/factor_pixel_hp.h @@ -62,6 +62,7 @@ inline FactorPixelHp::FactorPixelHp(const FeatureBasePtr& _ftr_ptr, bool _apply_loss_function, FactorStatus _status) : FactorAutodiff<FactorPixelHp, 2, 3, 4, 3, 4, 4>("PIXELHP", + _ftr_ptr, nullptr, nullptr, nullptr, diff --git a/include/vision/factor/factor_trifocal.h b/include/vision/factor/factor_trifocal.h index 4d99ae089..2c5a3f3ee 100644 --- a/include/vision/factor/factor_trifocal.h +++ b/include/vision/factor/factor_trifocal.h @@ -145,12 +145,13 @@ using namespace Eigen; // Constructor FactorTrifocal::FactorTrifocal(const FeatureBasePtr& _feature_1_ptr, - const FeatureBasePtr& _feature_2_ptr, - const FeatureBasePtr& _feature_own_ptr, - const ProcessorBasePtr& _processor_ptr, - bool _apply_loss_function, - FactorStatus _status) : + const FeatureBasePtr& _feature_2_ptr, + const FeatureBasePtr& _feature_own_ptr, + const ProcessorBasePtr& _processor_ptr, + bool _apply_loss_function, + FactorStatus _status) : FactorAutodiff( "TRIFOCAL PLP", + _feature_own_ptr, nullptr, nullptr, _feature_2_ptr, //< this sets feature 2 (the one between the oldest and the newest) -- GitLab From b5453e637017bc0871b622ca79277703c2662475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu> Date: Sat, 6 Jun 2020 11:38:02 +0200 Subject: [PATCH 8/8] Adapt tests to composite --- test/gtest_factor_epipolar.cpp | 30 +++++++++++++------ ...est_processor_tracker_feature_trifocal.cpp | 9 +++--- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/test/gtest_factor_epipolar.cpp b/test/gtest_factor_epipolar.cpp index 50fa29723..a49bb567a 100644 --- a/test/gtest_factor_epipolar.cpp +++ b/test/gtest_factor_epipolar.cpp @@ -60,12 +60,11 @@ TEST(FactorEpipolar, exemple) camera->getO()->getState().data(), &residual_0); - WOLF_TRACE("residual @ 0 pix: ", residual_0); + WOLF_TRACE("residual @ 0 pix : ", residual_0); - ASSERT_NEAR(residual_0, 0.0, 1e-6); - // lines 1 pix difference - f1->setMeasurement(Vector2d(300, 241)); + // Move F0 up a lil + F0->getP()->setState(Vector3d(0, -0.001, 0)); c->operator()(F0->getP()->getState().data(), F0->getO()->getState().data(), F1->getP()->getState().data(), @@ -76,8 +75,9 @@ TEST(FactorEpipolar, exemple) WOLF_TRACE("residual @ 1 pix : ", residual_1); - // lines 2 pixels difference - f1->setMeasurement(Vector2d(300, 242)); + + // move F0 up double than before + F0->getP()->setState(Vector3d(0, -0.002, 0)); c->operator()(F0->getP()->getState().data(), F0->getO()->getState().data(), F1->getP()->getState().data(), @@ -88,10 +88,9 @@ TEST(FactorEpipolar, exemple) WOLF_TRACE("residual @ 2 pix : ", residual_2); - ASSERT_NEAR(residual_2, 2.0 * residual_1, 1e-6); - // lines 1 pix difference in the other direction - f1->setMeasurement(Vector2d(300, 239)); + // Move F0 down a lil + F0->getP()->setState(Vector3d(0, +0.001, 0)); c->operator()(F0->getP()->getState().data(), F0->getO()->getState().data(), F1->getP()->getState().data(), @@ -102,6 +101,19 @@ TEST(FactorEpipolar, exemple) WOLF_TRACE("residual @ -1 pix : ", residual_n1); + + // all asserts down here: + + // residual zero when nominal + ASSERT_NEAR(residual_0, 0.0, 1e-6); + + // residual positive when camera up + ASSERT_GT(residual_1, 0.0); + + // residual double when camera doubly up + ASSERT_NEAR(residual_2, 2.0 * residual_1, 1e-6); + + // residual opposite when cam down ASSERT_NEAR(residual_1, -residual_n1, 1e-6); } diff --git a/test/gtest_processor_tracker_feature_trifocal.cpp b/test/gtest_processor_tracker_feature_trifocal.cpp index 7580dc2b2..97c244cea 100644 --- a/test/gtest_processor_tracker_feature_trifocal.cpp +++ b/test/gtest_processor_tracker_feature_trifocal.cpp @@ -78,8 +78,6 @@ TEST(ProcessorTrackerFeatureTrifocal, KeyFrameCallback) ParamsSensorCameraPtr intr = make_shared<ParamsSensorCamera>(); // TODO init params or read from YAML intr->width = 640; intr->height = 480; - // SensorCameraPtr sens_trk = make_shared<SensorCamera>((Eigen::Vector7d()<<0,0,0, 0,0,0,1).finished(), - // intr); auto sens_trk = SensorBase::emplace<SensorCamera>(problem->getHardware(), (Eigen::Vector7d()<<0,0,0, 0,0,0,1).finished(), intr); @@ -120,11 +118,12 @@ TEST(ProcessorTrackerFeatureTrifocal, KeyFrameCallback) // initialize TimeStamp t(0.0); - Vector7d x; x << 0,0,0, 0,0,0,1; - Matrix6d P = Matrix6d::Identity() * 0.000001; - auto KF1 = problem->setPriorFactor(x, P, t, dt/2); // KF1 + VectorComposite x("PO", {Vector3d::Zero(), Quaterniond::Identity().coeffs()}); + VectorComposite s("PO", {1e-3*Vector3d::Ones(), 1e-3*Vector3d::Ones()}); + auto KF1 = problem->setPriorFactor(x, s, t, dt/2); // KF1 std::static_pointer_cast<ProcessorOdom3d>(proc_odo)->setOrigin(KF1); + MatrixXd P = (s.vector("PO").array() * s.vector("PO").array()).matrix().asDiagonal(); CaptureOdom3dPtr capt_odo = make_shared<CaptureOdom3d>(t, sens_odo, Vector6d::Zero(), P); // Track -- GitLab