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