From 36295f0a1f8f445ca15941c18c4e9d530dfecde5 Mon Sep 17 00:00:00 2001
From: jvallve <jvallve@iri.upc.edu>
Date: Mon, 11 Apr 2022 17:17:47 +0200
Subject: [PATCH] new trajectory::size()

---
 demos/demo_analytic_autodiff_factor.cpp       |  4 +-
 demos/demo_wolf_imported_graph.cpp            |  4 +-
 demos/solver/test_iQR_wolf2.cpp               |  8 +--
 include/core/trajectory/trajectory_base.h     |  6 +++
 src/sensor/sensor_base.cpp                    | 51 +++++++++----------
 .../tree_manager_sliding_window.cpp           |  2 +-
 .../tree_manager_sliding_window_dual_rate.cpp |  2 +-
 test/gtest_odom_2d.cpp                        |  2 +-
 test/gtest_problem.cpp                        |  2 +-
 test/gtest_solver_ceres_multithread.cpp       |  2 +-
 test/gtest_solver_manager_multithread.cpp     |  2 +-
 11 files changed, 44 insertions(+), 41 deletions(-)

diff --git a/demos/demo_analytic_autodiff_factor.cpp b/demos/demo_analytic_autodiff_factor.cpp
index 0625a61b5..29a27f5d9 100644
--- a/demos/demo_analytic_autodiff_factor.cpp
+++ b/demos/demo_analytic_autodiff_factor.cpp
@@ -295,8 +295,8 @@ int main(int argc, char** argv)
         printf("\nError opening file\n");
 
     // PRIOR
-    FrameBasePtr first_frame_autodiff = wolf_problem_autodiff->getTrajectory()->getFrameMap().front();
-    FrameBasePtr first_frame_analytic = wolf_problem_analytic->getTrajectory()->getFrameMap().front();
+    FrameBasePtr first_frame_autodiff = wolf_problem_autodiff->getTrajectory()->getFirstFrame();
+    FrameBasePtr first_frame_analytic = wolf_problem_analytic->getTrajectory()->getFirstFrame();
     CaptureFix* initial_covariance_autodiff = new CaptureFix(TimeStamp(0), new SensorBase("ABSOLUTE POSE", nullptr, nullptr, nullptr, 0), first_frame_autodiff->getState(), Eigen::Matrix3d::Identity() * 0.01);
     CaptureFix* initial_covariance_analytic = new CaptureFix(TimeStamp(0), new SensorBase("ABSOLUTE POSE", nullptr, nullptr, nullptr, 0), first_frame_analytic->getState(), Eigen::Matrix3d::Identity() * 0.01);
     first_frame_autodiff->addCapture(initial_covariance_autodiff);
diff --git a/demos/demo_wolf_imported_graph.cpp b/demos/demo_wolf_imported_graph.cpp
index 037ff094a..bc8982ca2 100644
--- a/demos/demo_wolf_imported_graph.cpp
+++ b/demos/demo_wolf_imported_graph.cpp
@@ -322,8 +322,8 @@ int main(int argc, char** argv)
         printf("\nError opening file\n");
 
     // PRIOR
-    FrameBasePtr first_frame_full = wolf_problem_full->getTrajectory()->getFrameMap().front();
-    FrameBasePtr first_frame_prun = wolf_problem_prun->getTrajectory()->getFrameMap().front();
+    FrameBasePtr first_frame_full = wolf_problem_full->getTrajectory()->getFirstFrame();
+    FrameBasePtr first_frame_prun = wolf_problem_prun->getTrajectory()->getFirstFrame();
     CaptureFix* initial_covariance_full = new CaptureFix(TimeStamp(0), new SensorBase("ABSLOUTE POSE", nullptr, nullptr, nullptr, 0), first_frame_full->getState(), Eigen::Matrix3d::Identity() * 0.01);
     CaptureFix* initial_covariance_prun = new CaptureFix(TimeStamp(0), new SensorBase("ABSLOUTE POSE", nullptr, nullptr, nullptr, 0), first_frame_prun->getState(), Eigen::Matrix3d::Identity() * 0.01);
     first_frame_full->addCapture(initial_covariance_full);
diff --git a/demos/solver/test_iQR_wolf2.cpp b/demos/solver/test_iQR_wolf2.cpp
index 821ffefeb..2e8ee85c2 100644
--- a/demos/solver/test_iQR_wolf2.cpp
+++ b/demos/solver/test_iQR_wolf2.cpp
@@ -384,13 +384,13 @@ int main(int argc, char *argv[])
     // Vehicle poses
     std::cout << "Vehicle poses..." << std::endl;
     int i = 0;
-    Eigen::VectorXd state_poses(wolf_manager_QR->getProblem()->getTrajectory()->getFrameMap().size() * 3);
-    for (auto frame_it = wolf_manager_QR->getProblem()->getTrajectory()->getFrameMap().begin(); frame_it != wolf_manager_QR->getProblem()->getTrajectory()->getFrameMap().end(); frame_it++)
+    Eigen::VectorXd state_poses(wolf_manager_QR->getProblem()->getTrajectory()->size() * 3);
+    for (auto frame : wolf_manager_QR->getProblem()->getTrajectory()->getFrameMap())
     {
         if (complex_angle)
-            state_poses.segment(i, 3) << *(*frame_it)->getP()->get(), *((*frame_it)->getP()->get() + 1), atan2(*(*frame_it)->getO()->get(), *((*frame_it)->getO()->get() + 1));
+            state_poses.segment(i, 3) << *frame->getP()->get(), *(frame->getP()->get() + 1), atan2(*frame->getO()->get(), *(frame->getO()->get() + 1));
         else
-            state_poses.segment(i, 3) << *(*frame_it)->getP()->get(), *((*frame_it)->getP()->get() + 1), *(*frame_it)->getO()->get();
+            state_poses.segment(i, 3) << *frame->getP()->get(), *(frame->getP()->get() + 1), *frame->getO()->get();
         i += 3;
     }
 
diff --git a/include/core/trajectory/trajectory_base.h b/include/core/trajectory/trajectory_base.h
index cc6a8abaf..becf854fa 100644
--- a/include/core/trajectory/trajectory_base.h
+++ b/include/core/trajectory/trajectory_base.h
@@ -53,6 +53,7 @@ class TrajectoryBase : public NodeBase, public std::enable_shared_from_this<Traj
         ~TrajectoryBase() override;
         
         // Frames
+        SizeEigen size() const;
         FrameConstPtrMap getFrameMap() const;
         FramePtrMap getFrameMap();
         FrameBaseConstPtr getLastFrame() const;
@@ -130,6 +131,11 @@ inline FrameBasePtr TrajectoryBase::getLastFrame()
     return frame_map_.rbegin()->second;
 }
 
+inline SizeEigen TrajectoryBase::size() const
+{
+    return frame_const_map_.size();
+}
+
 } // namespace wolf
 
 #endif
diff --git a/src/sensor/sensor_base.cpp b/src/sensor/sensor_base.cpp
index f18d627aa..1958a8615 100644
--- a/src/sensor/sensor_base.cpp
+++ b/src/sensor/sensor_base.cpp
@@ -228,21 +228,20 @@ void SensorBase::setLastCapture(CaptureBasePtr cap)
 void SensorBase::updateLastCapture()
 {
     // we search for the most recent Capture of this sensor which belongs to a KeyFrame
-    if (getProblem())
-    {
-        auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    if (not getProblem())
+        return;
 
-        auto frame_rev_it = frame_map.rbegin();
-        while (frame_rev_it != frame_map.rend())
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+        frame_rev_iter != frame_map.rend();
+        ++frame_rev_iter)
+    {
+        auto capture = frame_rev_iter->second->getCaptureOf(shared_from_this());
+        if (capture and not capture->isRemoving())
         {
-            auto capture = frame_rev_it->second->getCaptureOf(shared_from_this());
-            if (capture and not capture->isRemoving())
-            {
-                // found the most recent Capture made by this sensor !
-                last_capture_ = capture;
-                return;
-            }
-            frame_rev_it++;
+            // found the most recent Capture made by this sensor !
+            last_capture_ = capture;
+            return;
         }
     }
 
@@ -256,20 +255,19 @@ CaptureBaseConstPtr SensorBase::findLastCaptureBefore(const TimeStamp& _ts) cons
     if (not getProblem())
         return nullptr;
 
-    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
-
     // We iterate in reverse since we're likely to find it close to the rbegin() place.
-    auto frame_rev_it = frame_map.rbegin();
-    while (frame_rev_it != frame_map.rend())
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+        frame_rev_iter != frame_map.rend();
+        ++frame_rev_iter)
     {
-        if (frame_rev_it->second->getTimeStamp() <= _ts)
+        if (frame_rev_iter->second->getTimeStamp() <= _ts)
         {
-            auto capture = frame_rev_it->second->getCaptureOf(shared_from_this());
+            auto capture = frame_rev_iter->second->getCaptureOf(shared_from_this());
             if (capture)
                 // found the most recent Capture made by this sensor !
                 return capture;
         }
-        frame_rev_it++;
     }
 
     return nullptr;
@@ -281,20 +279,19 @@ CaptureBasePtr SensorBase::findLastCaptureBefore(const TimeStamp& _ts)
     if (not getProblem())
         return nullptr;
 
-    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
-
     // We iterate in reverse since we're likely to find it close to the rbegin() place.
-    auto frame_rev_it = frame_map.rbegin();
-    while (frame_rev_it != frame_map.rend())
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+        frame_rev_iter != frame_map.rend();
+        ++frame_rev_iter)
     {
-        if (frame_rev_it->second->getTimeStamp() <= _ts)
+        if (frame_rev_iter->second->getTimeStamp() <= _ts)
         {
-            auto capture = frame_rev_it->second->getCaptureOf(shared_from_this());
+            auto capture = frame_rev_iter->second->getCaptureOf(shared_from_this());
             if (capture)
                 // found the most recent Capture made by this sensor !
                 return capture;
         }
-        frame_rev_it++;
     }
 
     return nullptr;
diff --git a/src/tree_manager/tree_manager_sliding_window.cpp b/src/tree_manager/tree_manager_sliding_window.cpp
index 5d6f1345e..1a0f44507 100644
--- a/src/tree_manager/tree_manager_sliding_window.cpp
+++ b/src/tree_manager/tree_manager_sliding_window.cpp
@@ -26,7 +26,7 @@ namespace wolf
 
 void TreeManagerSlidingWindow::keyFrameCallback(FrameBasePtr _frame)
 {
-    int n_f = getProblem()->getTrajectory()->getFrameMap().size();
+    int n_f = getProblem()->getTrajectory()->size();
     bool remove_first = (n_f > params_sw_->n_frames);
     int n_fix = (n_f >= params_sw_->n_frames ?
                  params_sw_->n_fix_first_frames :
diff --git a/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp b/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp
index 3b8800bfc..85b9c4cf7 100644
--- a/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp
+++ b/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp
@@ -36,7 +36,7 @@ TreeManagerSlidingWindowDualRate::TreeManagerSlidingWindowDualRate(ParamsTreeMan
 
 void TreeManagerSlidingWindowDualRate::keyFrameCallback(FrameBasePtr _frame)
 {
-    int n_f = getProblem()->getTrajectory()->getFrameMap().size(); // in trajectory there are only key frames
+    int n_f = getProblem()->getTrajectory()->size(); // in trajectory there are only key frames
 
     // recent segment not complete
     if (n_f <= params_swdr_->n_frames_recent)
diff --git a/test/gtest_odom_2d.cpp b/test/gtest_odom_2d.cpp
index 7391619e1..04d838944 100644
--- a/test/gtest_odom_2d.cpp
+++ b/test/gtest_odom_2d.cpp
@@ -444,7 +444,7 @@ TEST(Odom2d, KF_callback)
     FrameBasePtr keyframe_2 = problem->emplaceFrame(t_split, x_split);
 
     // there must be 2KF and one F
-    ASSERT_EQ(problem->getTrajectory()->getFrameMap().size(), 2);
+    ASSERT_EQ(problem->getTrajectory()->size(), 2);
     // The last KF must have TS = 0.08
     ASSERT_EQ(problem->getLastFrame()->getTimeStamp().getNanoSeconds(), 80000000);
 
diff --git a/test/gtest_problem.cpp b/test/gtest_problem.cpp
index d86942de2..ffecd322b 100644
--- a/test/gtest_problem.cpp
+++ b/test/gtest_problem.cpp
@@ -248,7 +248,7 @@ TEST(Problem, emplaceFrame_factory)
 
 
     // check that all frames are effectively in the trajectory
-    ASSERT_EQ(P->getTrajectory()->getFrameMap().size(), (SizeStd) 3);
+    ASSERT_EQ(P->getTrajectory()->size(), (SizeStd) 3);
 
     ASSERT_EQ(f0->getStateVector().size(), 3 );
     ASSERT_EQ(f1->getStateVector().size(), 7 );
diff --git a/test/gtest_solver_ceres_multithread.cpp b/test/gtest_solver_ceres_multithread.cpp
index e883a1597..8c5a2685c 100644
--- a/test/gtest_solver_ceres_multithread.cpp
+++ b/test/gtest_solver_ceres_multithread.cpp
@@ -84,7 +84,7 @@ TEST(SolverCeresMultithread, MultiThreadingTruncatedNotifications)
 
         ts += 1.0;
 
-        if (P->getTrajectory()->getFrameMap().size() > 10)
+        if (P->getTrajectory()->size() > 10)
             P->getTrajectory()->getFirstFrame()->remove();
 
         if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt)
diff --git a/test/gtest_solver_manager_multithread.cpp b/test/gtest_solver_manager_multithread.cpp
index 267a202f3..099297e77 100644
--- a/test/gtest_solver_manager_multithread.cpp
+++ b/test/gtest_solver_manager_multithread.cpp
@@ -79,7 +79,7 @@ TEST(SolverManagerMultithread, MultiThreadingTruncatedNotifications)
 
         ts += 1.0;
 
-        if (P->getTrajectory()->getFrameMap().size() > 10)
+        if (P->getTrajectory()->size() > 10)
             P->getTrajectory()->getFirstFrame()->remove();
 
         if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt)
-- 
GitLab