From bfa42056729cb10223802c5800ef7455767cab5a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu>
Date: Tue, 26 May 2020 16:57:11 +0200
Subject: [PATCH] Access calibration from processor, not capture

---
 include/core/capture/capture_base.h           | 29 ++++-------
 include/core/processor/processor_diff_drive.h | 14 +++++-
 include/core/processor/processor_motion.h     | 11 ++---
 include/core/processor/processor_odom_2d.h    | 10 ++++
 include/core/processor/processor_odom_3d.h    |  2 +
 src/capture/capture_base.cpp                  | 49 -------------------
 src/capture/capture_motion.cpp                | 14 +++---
 src/processor/processor_diff_drive.cpp        |  3 +-
 src/processor/processor_motion.cpp            | 14 +++---
 src/processor/processor_odom_2d.cpp           |  2 +-
 src/processor/processor_odom_3d.cpp           | 11 ++++-
 test/gtest_factor_diff_drive.cpp              | 13 ++---
 12 files changed, 68 insertions(+), 104 deletions(-)

diff --git a/include/core/capture/capture_base.h b/include/core/capture/capture_base.h
index 42fe6af5e..35372c103 100644
--- a/include/core/capture/capture_base.h
+++ b/include/core/capture/capture_base.h
@@ -29,7 +29,6 @@ class CaptureBase : public NodeBase, public HasStateBlocks, public std::enable_s
         FeatureBasePtrList feature_list_;
         FactorBasePtrList constrained_by_list_;
         SensorBaseWPtr  sensor_ptr_; ///< Pointer to sensor
-        SizeEigen calib_size_;           ///< size of the calibration parameters (dynamic or static sensor params that are not fixed)
 
         static unsigned int capture_id_count_;
 
@@ -93,10 +92,6 @@ class CaptureBase : public NodeBase, public HasStateBlocks, public std::enable_s
         virtual void fix() override;
         virtual void unfix() override;
 
-        bool hasCalibration() const {return calib_size_ > 0;}
-        SizeEigen getCalibSize() const;
-        virtual Eigen::VectorXd getCalibration() const;
-        void setCalibration(const Eigen::VectorXd& _calib);
         void move(FrameBasePtr);
         void link(FrameBasePtr);
         template<typename classType, typename... T>
@@ -116,15 +111,9 @@ class CaptureBase : public NodeBase, public HasStateBlocks, public std::enable_s
                    std::ostream& stream = std::cout,
                    std::string _tabs = "") const;
 
-    protected:
-        virtual SizeEigen computeCalibSize() const;
-
     private:
         FeatureBasePtr addFeature(FeatureBasePtr _ft_ptr);
         void removeFeature(FeatureBasePtr _ft_ptr);
-
-    private:
-        void updateCalibSize();
 };
 
 }
@@ -144,15 +133,15 @@ std::shared_ptr<classType> CaptureBase::emplace(FrameBasePtr _frm_ptr, T&&... al
     return cpt;
 }
 
-inline SizeEigen CaptureBase::getCalibSize() const
-{
-    return calib_size_;
-}
-
-inline void CaptureBase::updateCalibSize()
-{
-    calib_size_ = computeCalibSize();
-}
+//inline SizeEigen CaptureBase::getCalibSize() const
+//{
+//    return calib_size_;
+//}
+//
+//inline void CaptureBase::updateCalibSize()
+//{
+//    calib_size_ = computeCalibSize();
+//}
 
 inline StateBlockPtr CaptureBase::getSensorP() const
 {
diff --git a/include/core/processor/processor_diff_drive.h b/include/core/processor/processor_diff_drive.h
index bcbf3f603..e3e504f36 100644
--- a/include/core/processor/processor_diff_drive.h
+++ b/include/core/processor/processor_diff_drive.h
@@ -60,7 +60,8 @@ class ProcessorDiffDrive : public ProcessorOdom2d
         virtual FeatureBasePtr emplaceFeature(CaptureMotionPtr _capture_own) override;
         virtual FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion,
                                             CaptureBasePtr _capture_origin) override;
-
+        virtual VectorXd getCalibration (const CaptureBasePtr _capture) const override;
+        virtual void setCalibration(const CaptureBasePtr _capture, const VectorXd& _calibration) override;
 
     protected:
         ParamsProcessorDiffDrivePtr params_prc_diff_drv_selfcal_;
@@ -68,6 +69,17 @@ class ProcessorDiffDrive : public ProcessorOdom2d
 
 };
 
+inline Eigen::VectorXd ProcessorDiffDrive::getCalibration (const CaptureBasePtr _capture) const
+{
+    return _capture->getStateBlock("I")->getState();
+}
+
+inline void ProcessorDiffDrive::setCalibration (const CaptureBasePtr _capture, const VectorXd& _calibration)
+{
+    _capture->getStateBlock("I")->setState(_calibration);
+}
+
+
 }
 
 
diff --git a/include/core/processor/processor_motion.h b/include/core/processor/processor_motion.h
index d668792ae..46fe7058a 100644
--- a/include/core/processor/processor_motion.h
+++ b/include/core/processor/processor_motion.h
@@ -174,14 +174,6 @@ class ProcessorMotion : public ProcessorBase, public IsMotion
         virtual VectorComposite getState() const override;
         virtual VectorComposite getState(const TimeStamp& _ts) const override;
 
-
-//        /** \brief Fill the state corresponding to the provided time-stamp
-//         * \param _ts the time stamp
-//         * \param _x the returned state
-//         * \return if state in the provided time-stamp could be resolved
-//         */
-//        virtual Eigen::VectorXd getStateVector(const TimeStamp& _ts) const;
-
         /** \brief Gets the delta preintegrated covariance from all integrations so far
          * \return the delta preintegrated covariance matrix
          */
@@ -457,6 +449,9 @@ class ProcessorMotion : public ProcessorBase, public IsMotion
          */
         virtual FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion, CaptureBasePtr _capture_origin) = 0;
 
+        virtual VectorXd getCalibration (const CaptureBasePtr _capture) const = 0;
+        virtual void setCalibration(const CaptureBasePtr _capture, const VectorXd& _calibration) = 0;
+
         Motion motionZero(const TimeStamp& _ts) const;
 
         bool hasCalibration() const {return calib_size_ > 0;}
diff --git a/include/core/processor/processor_odom_2d.h b/include/core/processor/processor_odom_2d.h
index 9926fe781..7875c7974 100644
--- a/include/core/processor/processor_odom_2d.h
+++ b/include/core/processor/processor_odom_2d.h
@@ -88,6 +88,8 @@ class ProcessorOdom2d : public ProcessorMotion
         virtual FeatureBasePtr emplaceFeature(CaptureMotionPtr _capture_motion) override;
         virtual FactorBasePtr emplaceFactor(FeatureBasePtr _feature,
                                             CaptureBasePtr _capture_origin) override;
+        virtual VectorXd getCalibration (const CaptureBasePtr _capture) const override;
+        virtual void setCalibration(const CaptureBasePtr _capture, const VectorXd& _calibration) override;
 
     protected:
         ParamsProcessorOdom2dPtr params_odom_2d_;
@@ -107,6 +109,14 @@ inline Eigen::VectorXd ProcessorOdom2d::correctDelta (const Eigen::VectorXd& del
     return delta_corrected;
 }
 
+inline VectorXd ProcessorOdom2d::getCalibration (const CaptureBasePtr _capture) const
+{
+    return VectorXd::Zero(0);
+}
+
+inline void ProcessorOdom2d::setCalibration (const CaptureBasePtr _capture, const VectorXd& _calibration)
+{
+}
 
 } // namespace wolf
 
diff --git a/include/core/processor/processor_odom_3d.h b/include/core/processor/processor_odom_3d.h
index 2fa981158..7f76c128e 100644
--- a/include/core/processor/processor_odom_3d.h
+++ b/include/core/processor/processor_odom_3d.h
@@ -109,6 +109,8 @@ class ProcessorOdom3d : public ProcessorMotion
 
         virtual FactorBasePtr emplaceFactor(FeatureBasePtr _feature_motion,
                                             CaptureBasePtr _capture_origin) override;
+        virtual VectorXd getCalibration (const CaptureBasePtr _capture) const override;
+        virtual void setCalibration(const CaptureBasePtr _capture, const VectorXd& _calibration) override;
 
     protected:
         ParamsProcessorOdom3dPtr params_odom_3d_;
diff --git a/src/capture/capture_base.cpp b/src/capture/capture_base.cpp
index a6dde95f9..b98002d5a 100644
--- a/src/capture/capture_base.cpp
+++ b/src/capture/capture_base.cpp
@@ -17,7 +17,6 @@ CaptureBase::CaptureBase(const std::string& _type,
     HasStateBlocks(""),
     frame_ptr_(), // nullptr
     sensor_ptr_(_sensor_ptr),
-    calib_size_(0),
     capture_id_(++capture_id_count_),
     time_stamp_(_ts)
 {
@@ -52,8 +51,6 @@ CaptureBase::CaptureBase(const std::string& _type,
     {
         WOLF_ERROR("Provided sensor parameters but no sensor pointer");
     }
-
-    updateCalibSize();
 }
 
 CaptureBase::~CaptureBase()
@@ -170,57 +167,11 @@ StateBlockPtr CaptureBase::getStateBlock(const std::string& _key) const
 void CaptureBase::fix()
 {
     HasStateBlocks::fix();
-    updateCalibSize();
 }
 
 void CaptureBase::unfix()
 {
     HasStateBlocks::unfix();
-    updateCalibSize();
-}
-
-SizeEigen CaptureBase::computeCalibSize() const
-{
-    SizeEigen sz = 0;
-    for (const auto& key : getStructure())
-    {
-        auto sb = getStateBlock(key);
-        if (sb && !sb->isFixed())
-            sz += sb->getSize();
-    }
-    return sz;
-}
-
-Eigen::VectorXd CaptureBase::getCalibration() const
-{
-    Eigen::VectorXd calib(calib_size_);
-    SizeEigen index = 0;
-    for (const auto& key : getStructure())
-    {
-        auto sb = getStateBlock(key);
-        if (sb && !sb->isFixed())
-        {
-            calib.segment(index, sb->getSize()) = sb->getState();
-            index += sb->getSize();
-        }
-    }
-    return calib;
-}
-
-void CaptureBase::setCalibration(const VectorXd& _calib)
-{
-    updateCalibSize();
-    assert(_calib.size() == calib_size_ && "Wrong size of calibration vector");
-    SizeEigen index = 0;
-    for (const auto& key : getStructure())
-    {
-        auto sb = getStateBlock(key);
-        if (sb && !sb->isFixed())
-        {
-            sb->setState(_calib.segment(index, sb->getSize()));
-            index += sb->getSize();
-        }
-    }
 }
 
 void CaptureBase::move(FrameBasePtr _frm_ptr)
diff --git a/src/capture/capture_motion.cpp b/src/capture/capture_motion.cpp
index a61ae5b55..d3bae9855 100644
--- a/src/capture/capture_motion.cpp
+++ b/src/capture/capture_motion.cpp
@@ -137,13 +137,13 @@ void CaptureMotion::printHeader(int _depth, bool _constr_by, bool _metric, bool
     if ( _metric && ! getBuffer().empty())
     {
         _stream << _tabs << "  " << "delta preint : (" << getDeltaPreint().transpose() << ")" << std::endl;
-        if (hasCalibration())
-        {
-            _stream << _tabs << "  " << "calib preint : (" << getCalibrationPreint().transpose() << ")" << std::endl;
-            _stream << _tabs << "  " << "jacob preint : (" << getJacobianCalib().row(0) << ")" << std::endl;
-            _stream << _tabs << "  " << "calib current: (" << getCalibration().transpose() << ")" << std::endl;
-            _stream << _tabs << "  " << "delta correct: (" << getDeltaCorrected(getCalibration()).transpose() << ")" << std::endl;
-        }
+//        if (hasCalibration())
+//        {
+//            _stream << _tabs << "  " << "calib preint : (" << getCalibrationPreint().transpose() << ")" << std::endl;
+//            _stream << _tabs << "  " << "jacob preint : (" << getJacobianCalib().row(0) << ")" << std::endl;
+////            _stream << _tabs << "  " << "calib current: (" << getCalibration().transpose() << ")" << std::endl;
+////            _stream << _tabs << "  " << "delta correct: (" << getDeltaCorrected(getCalibration()).transpose() << ")" << std::endl;
+//        }
     }
 
 }
diff --git a/src/processor/processor_diff_drive.cpp b/src/processor/processor_diff_drive.cpp
index 55841ede9..43f15c52d 100644
--- a/src/processor/processor_diff_drive.cpp
+++ b/src/processor/processor_diff_drive.cpp
@@ -138,7 +138,7 @@ CaptureMotionPtr ProcessorDiffDrive::emplaceCapture(const FrameBasePtr& _frame_o
                                                              _data,
                                                              _data_cov,
                                                              _capture_origin);
-    cap_motion->setCalibration      (_calib);
+    setCalibration                  (cap_motion, _calib);
     cap_motion->setCalibrationPreint(_calib_preint);
 
     return cap_motion;
@@ -168,7 +168,6 @@ FactorBasePtr ProcessorDiffDrive::emplaceFactor(FeatureBasePtr _feature,
     return fac_odom;
 }
 
-
 } /* namespace wolf */
 
 
diff --git a/src/processor/processor_motion.cpp b/src/processor/processor_motion.cpp
index f7f39a673..5087f744b 100644
--- a/src/processor/processor_motion.cpp
+++ b/src/processor/processor_motion.cpp
@@ -70,7 +70,7 @@ void ProcessorMotion::splitBuffer(const wolf::CaptureMotionPtr& _capture_source,
     _capture_source->setOriginCapture(_capture_target);
 
     // Get optimized calibration params from 'origin' keyframe
-    VectorXd calib_preint_optim = _capture_source->getOriginCapture()->getCalibration();
+    VectorXd calib_preint_optim = getCalibration(_capture_source->getOriginCapture());
 
     // Write the calib params into the capture before re-integration
     _capture_source->setCalibrationPreint(calib_preint_optim);
@@ -175,7 +175,7 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
             auto capture_origin     = capture_existing->getOriginCapture();
 
             // Get calibration params for preintegration from origin, since it has chances to have optimized values
-            VectorXd calib_origin   = capture_origin->getCalibration();
+            VectorXd calib_origin   = getCalibration(capture_origin);
 
             // emplace a new motion capture to the new keyframe
             TimeStamp ts_from_callback          = keyframe_from_callback->getTimeStamp();
@@ -260,7 +260,7 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
             auto & capture_origin   = origin_ptr_;
 
             // Get calibration params for preintegration from origin, since it has chances to have optimized values
-            VectorXd calib_origin   = capture_origin->getCalibration();
+            VectorXd calib_origin   = getCalibration(capture_origin);
 
             // emplace a new motion capture to the new keyframe
             TimeStamp    ts_from_callback      = keyframe_from_callback->getTimeStamp();
@@ -359,8 +359,8 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
                                              key_frame->getTimeStamp(),
                                              Eigen::VectorXd::Zero(data_size_),
                                              getSensor()->getNoiseCov(),
-                                             last_ptr_->getCalibration(),
-                                             last_ptr_->getCalibration(),
+                                             getCalibration(last_ptr_),
+                                             getCalibration(last_ptr_),
                                              last_ptr_);
         // reset the new buffer
         capture_new->getBuffer().push_back( motionZero(key_frame->getTimeStamp()) ) ;
@@ -416,7 +416,7 @@ VectorComposite ProcessorMotion::getState() const
     if ( calib_preint.size() > 0 )
     {
         // Get current calibration -- from origin capture
-        const auto& calib = origin_ptr_->getCalibration();
+        const auto& calib = getCalibration(origin_ptr_);
 
         // get Jacobian of delta wrt calibration
         const auto& J_delta_calib = motion.jacobian_calib_;
@@ -488,7 +488,7 @@ VectorComposite ProcessorMotion::getState(const TimeStamp& _ts) const
         if ( calib_preint.size() > 0 )
         {
             // Get current calibration -- from origin capture
-            const auto& calib = cap_orig->getCalibration();
+            const auto& calib = getCalibration(cap_orig);
 
             // get Jacobian of delta wrt calibration
             const auto& J_delta_calib = motion.jacobian_calib_;
diff --git a/src/processor/processor_odom_2d.cpp b/src/processor/processor_odom_2d.cpp
index 6b11628e9..2a8eaaf94 100644
--- a/src/processor/processor_odom_2d.cpp
+++ b/src/processor/processor_odom_2d.cpp
@@ -141,7 +141,7 @@ CaptureMotionPtr ProcessorOdom2d::emplaceCapture(const FrameBasePtr& _frame_own,
                                                  const CaptureBasePtr& _capture_origin_ptr)
 {
     auto cap_motion = CaptureBase::emplace<CaptureOdom2d>(_frame_own, _ts, _sensor, _data, _data_cov, _capture_origin_ptr);
-    cap_motion->setCalibration(_calib);
+    setCalibration(cap_motion, _calib);
     cap_motion->setCalibrationPreint(_calib_preint);
 
     return cap_motion;
diff --git a/src/processor/processor_odom_3d.cpp b/src/processor/processor_odom_3d.cpp
index 51f0e26de..9d67f6777 100644
--- a/src/processor/processor_odom_3d.cpp
+++ b/src/processor/processor_odom_3d.cpp
@@ -206,7 +206,7 @@ CaptureMotionPtr ProcessorOdom3d::emplaceCapture(const FrameBasePtr& _frame_own,
                                                  const CaptureBasePtr& _capture_origin)
 {
     auto cap_motion = CaptureBase::emplace<CaptureOdom3d>(_frame_own, _ts, _sensor, _data, _data_cov, _capture_origin);
-    cap_motion->setCalibration(_calib);
+    setCalibration(cap_motion, _calib);
     cap_motion->setCalibrationPreint(_calib_preint);
 
     return cap_motion;
@@ -246,12 +246,21 @@ FactorBasePtr ProcessorOdom3d::emplaceFactor(FeatureBasePtr _feature_motion, Cap
     return fac_odom;
 }
 
+VectorXd ProcessorOdom3d::getCalibration (const CaptureBasePtr _capture) const
+{
+    return VectorXd::Zero(0);
+}
 
+void ProcessorOdom3d::setCalibration (const CaptureBasePtr _capture, const VectorXd& _calibration)
+{
 }
 
+} // namespace wolf
+
 // Register in the FactorySensor
 #include "core/processor/factory_processor.h"
 namespace wolf {
 WOLF_REGISTER_PROCESSOR(ProcessorOdom3d);
 WOLF_REGISTER_PROCESSOR_AUTO(ProcessorOdom3d);
 } // namespace wolf
+
diff --git a/test/gtest_factor_diff_drive.cpp b/test/gtest_factor_diff_drive.cpp
index 827ca5f73..579875a8b 100644
--- a/test/gtest_factor_diff_drive.cpp
+++ b/test/gtest_factor_diff_drive.cpp
@@ -63,13 +63,10 @@ class ProcessorDiffDrivePublic : public ProcessorDiffDrive
             Base::deltaPlusDelta(_delta1, _delta2, _dt2, _delta1_plus_delta2, _jacobian1, _jacobian2);
         }
 
-//        virtual void statePlusDelta(const Eigen::VectorXd& _x,
-//                                    const Eigen::VectorXd& _delta,
-//                                    const double _dt,
-//                                    Eigen::VectorXd& _x_plus_delta) const
-//        {
-//            Base::statePlusDelta(_x, _delta, _dt, _x_plus_delta);
-//        }
+        virtual VectorXd getCalibration (const CaptureBasePtr _capture) const
+        {
+            return Base::getCalibration(_capture);
+        }
 
         virtual Eigen::VectorXd deltaZero() const
         {
@@ -201,7 +198,7 @@ class FactorDiffDriveTest : public testing::Test
                                                      "FeatureDiffDrive",
                                                      delta1,
                                                      delta1_cov,
-                                                     C0->getCalibration(),
+                                                     processor->getCalibration(C0),
                                                      Matrix3d::Identity()); // TODO Jacobian?
 
 
-- 
GitLab