From f868a9c18be6e4b49735ebaa8caf42ce033e2c0d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joan=20Sol=C3=A0?= <jsola@iri.upc.edu>
Date: Sat, 11 Apr 2020 23:35:38 +0200
Subject: [PATCH] WIP Fixing odometers

---
 include/core/capture/capture_diff_drive.h     |  2 +-
 include/core/capture/capture_odom_2d.h        |  8 ++--
 include/core/capture/capture_odom_3d.h        |  2 +-
 .../processor/processor_tracker_feature.h     |  8 ++--
 include/core/state_block/state_composite.h    |  3 ++
 src/capture/capture_diff_drive.cpp            |  8 ++--
 src/capture/capture_motion.cpp                | 24 +++++------
 src/capture/capture_odom_3d.cpp               |  8 ++--
 src/state_block/state_composite.cpp           | 41 ++++++++++++++++++-
 9 files changed, 73 insertions(+), 31 deletions(-)

diff --git a/include/core/capture/capture_diff_drive.h b/include/core/capture/capture_diff_drive.h
index 2300a65b2..f35be53d1 100644
--- a/include/core/capture/capture_diff_drive.h
+++ b/include/core/capture/capture_diff_drive.h
@@ -39,7 +39,7 @@ public:
 
         virtual ~CaptureDiffDrive() = default;
 
-        virtual Eigen::VectorXd correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const override;
+        virtual VectorComposite correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const override;
 
 };
 
diff --git a/include/core/capture/capture_odom_2d.h b/include/core/capture/capture_odom_2d.h
index d18217279..9b4358317 100644
--- a/include/core/capture/capture_odom_2d.h
+++ b/include/core/capture/capture_odom_2d.h
@@ -33,14 +33,14 @@ class CaptureOdom2d : public CaptureMotion
 
         virtual ~CaptureOdom2d();
 
-        virtual VectorXd correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const override;
+        virtual VectorComposite correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const override;
 
 };
 
-inline Eigen::VectorXd CaptureOdom2d::correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const
+inline VectorComposite CaptureOdom2d::correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const
 {
-    Vector3d delta = _delta + _delta_error;
-    delta(2) = pi2pi(delta(2));
+    VectorComposite delta = _delta + _delta_error;
+    delta.at("O")(0) = pi2pi(delta.at("O")(0));
     return delta;
 }
 
diff --git a/include/core/capture/capture_odom_3d.h b/include/core/capture/capture_odom_3d.h
index 7e4ee02c8..bef792936 100644
--- a/include/core/capture/capture_odom_3d.h
+++ b/include/core/capture/capture_odom_3d.h
@@ -33,7 +33,7 @@ class CaptureOdom3d : public CaptureMotion
 
         virtual ~CaptureOdom3d();
 
-        virtual VectorXd correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const override;
+        virtual VectorComposite correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const override;
 
 };
 
diff --git a/include/core/processor/processor_tracker_feature.h b/include/core/processor/processor_tracker_feature.h
index ff5ebb2a6..be2545de4 100644
--- a/include/core/processor/processor_tracker_feature.h
+++ b/include/core/processor/processor_tracker_feature.h
@@ -111,7 +111,7 @@ class ProcessorTrackerFeature : public ProcessorTracker
          *   - Create the factors, of the correct type, derived from FactorBase
          *     (through FactorAnalytic or FactorSparse).
          */
-        virtual unsigned int processKnown();
+        virtual unsigned int processKnown() override;
 
         /** \brief Track provided features in \b _capture
          * \param _features_in input list of features in \b last to track
@@ -147,7 +147,7 @@ class ProcessorTrackerFeature : public ProcessorTracker
          *
          * WARNING! This function only votes! It does not create KeyFrames!
          */
-        virtual bool voteForKeyFrame() const = 0;
+        virtual bool voteForKeyFrame() const override = 0;
 
         // We overload the advance and reset functions to update the lists of matches
         virtual void advanceDerived() override;
@@ -156,7 +156,7 @@ class ProcessorTrackerFeature : public ProcessorTracker
         /**\brief Process new Features
          *
          */
-        virtual unsigned int processNew(const int& _max_features);
+        virtual unsigned int processNew(const int& _max_features) override;
 
         /** \brief Detect new Features
          * \param _max_features maximum number of features detected (-1: unlimited. 0: none)
@@ -190,7 +190,7 @@ class ProcessorTrackerFeature : public ProcessorTracker
 
         /** \brief Emplaces a new factor for each correspondence between a feature in Capture \b last and a feature in Capture \b origin
          */
-        virtual void establishFactors();
+        virtual void establishFactors() override;
 };
 
 } // namespace wolf
diff --git a/include/core/state_block/state_composite.h b/include/core/state_block/state_composite.h
index 5c947f386..1b506aeae 100644
--- a/include/core/state_block/state_composite.h
+++ b/include/core/state_block/state_composite.h
@@ -34,6 +34,9 @@ namespace Eigen
 std::ostream& operator <<(std::ostream &_os, const wolf::VectorComposite &_x);
 
 wolf::VectorComposite& operator + (wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2);
+wolf::VectorComposite operator + (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2);
+wolf::VectorComposite& operator - (wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2);
+wolf::VectorComposite operator - (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2);
 }
 
 namespace wolf{
diff --git a/src/capture/capture_diff_drive.cpp b/src/capture/capture_diff_drive.cpp
index 05f8a5c49..ec0b14e6a 100644
--- a/src/capture/capture_diff_drive.cpp
+++ b/src/capture/capture_diff_drive.cpp
@@ -28,11 +28,11 @@ CaptureDiffDrive::CaptureDiffDrive(const TimeStamp& _ts,
     //
 }
 
-Eigen::VectorXd CaptureDiffDrive::correctDelta(const VectorXd& _delta,
-                                               const VectorXd& _delta_error) const
+VectorComposite CaptureDiffDrive::correctDelta(const VectorComposite& _delta,
+                                               const VectorComposite& _delta_error) const
 {
-    Vector3d delta_corrected = _delta + _delta_error;
-    delta_corrected(2) = pi2pi(delta_corrected(2));
+    VectorComposite delta_corrected = _delta + _delta_error;
+    delta_corrected.at("O")(0) = pi2pi(delta_corrected.at("O")(0));
     return delta_corrected;
 }
 
diff --git a/src/capture/capture_motion.cpp b/src/capture/capture_motion.cpp
index 13b11dda7..5a12a6882 100644
--- a/src/capture/capture_motion.cpp
+++ b/src/capture/capture_motion.cpp
@@ -51,23 +51,23 @@ CaptureMotion::~CaptureMotion()
     //
 }
 
-VectorComposite CaptureMotion::getDeltaCorrected(const VectorXd& _calib_current) const
+VectorComposite CaptureMotion::getDeltaCorrected(const VectorComposite& _calib_current) const
 {
-    VectorXd calib_preint    = getCalibrationPreint();
-    VectorXd delta_preint    = getBuffer().get().back().delta_integr_;
-    MatrixXd jac_calib       = getBuffer().get().back().jacobian_calib_;
-    VectorXd delta_error     = jac_calib * (_calib_current - calib_preint);
-    VectorXd delta_corrected = correctDelta(delta_preint, delta_error);
+    VectorComposite calib_preint    = getCalibrationPreint();
+    VectorComposite delta_preint    = getBuffer().get().back().delta_integr_;
+    MatrixComposite jac_calib       = getBuffer().get().back().jacobian_calib_;
+    VectorComposite delta_error     = jac_calib * (_calib_current - calib_preint);
+    VectorComposite delta_corrected = correctDelta(delta_preint, delta_error);
     return   delta_corrected;
 }
 
-VectorComposite CaptureMotion::getDeltaCorrected(const VectorXd& _calib_current, const TimeStamp& _ts) const
+VectorComposite CaptureMotion::getDeltaCorrected(const VectorComposite& _calib_current, const TimeStamp& _ts) const
 {
-    Motion   motion          = getBuffer().getMotion(_ts);
-    VectorXd delta_preint    = motion.delta_integr_;
-    MatrixXd jac_calib       = motion.jacobian_calib_;
-    VectorXd delta_error     = jac_calib * (_calib_current - calib_preint_);
-    VectorXd delta_corrected = correctDelta(delta_preint, delta_error);
+    Motion          motion          = getBuffer().getMotion(_ts);
+    VectorComposite delta_preint    = motion.delta_integr_;
+    MatrixComposite jac_calib       = motion.jacobian_calib_;
+    VectorComposite delta_error     = jac_calib * (_calib_current - calib_preint_);
+    VectorComposite delta_corrected = correctDelta(delta_preint, delta_error);
     return   delta_corrected;
 }
 
diff --git a/src/capture/capture_odom_3d.cpp b/src/capture/capture_odom_3d.cpp
index 447e1d500..dd1e79f31 100644
--- a/src/capture/capture_odom_3d.cpp
+++ b/src/capture/capture_odom_3d.cpp
@@ -34,11 +34,11 @@ CaptureOdom3d::~CaptureOdom3d()
     //
 }
 
-Eigen::VectorXd CaptureOdom3d::correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const
+VectorComposite CaptureOdom3d::correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const
 {
-    VectorXd delta(7);
-    delta.head(3) = _delta.head(3) + _delta_error.head(3);
-    delta.tail(4) = (Quaterniond(_delta.data()+3) * exp_q(_delta_error.tail(3))).coeffs();
+    VectorComposite delta;
+    delta.at("P") = _delta.at("P") + _delta_error.at("P");
+    delta.at("O") = (Quaterniond(_delta.at("O").data()) * exp_q(_delta_error.at("O"))).coeffs();
     return delta;
 }
 
diff --git a/src/state_block/state_composite.cpp b/src/state_block/state_composite.cpp
index 80ed5d181..e8e0ec769 100644
--- a/src/state_block/state_composite.cpp
+++ b/src/state_block/state_composite.cpp
@@ -16,7 +16,7 @@ std::ostream& operator <<(std::ostream &_os, const wolf::VectorComposite &_x)
     return _os;
 }
 
-wolf::VectorComposite& operator + (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
+wolf::VectorComposite& operator + (wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
 {
     wolf::VectorComposite v;
     for (const auto& pair_key_vec1 : _v1)
@@ -29,6 +29,45 @@ wolf::VectorComposite& operator + (const wolf::VectorComposite& _v1, const wolf:
     return v;
 }
 
+wolf::VectorComposite operator + (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
+{
+    wolf::VectorComposite v;
+    for (const auto& pair_key_vec1 : _v1)
+    {
+        const auto &key  = pair_key_vec1.first;
+        const auto &vec1 = pair_key_vec1.second;
+        const auto& vec2 = _v2.at(key);
+        v.at(key) = vec1 + vec2;
+    }
+    return v;
+}
+
+wolf::VectorComposite& operator - (wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
+{
+    wolf::VectorComposite v;
+    for (const auto& pair_key_vec1 : _v1)
+    {
+        const auto &key  = pair_key_vec1.first;
+        const auto &vec1 = pair_key_vec1.second;
+        const auto& vec2 = _v2.at(key);
+        v.at(key) = vec1 - vec2;
+    }
+    return v;
+}
+
+wolf::VectorComposite operator - (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
+{
+    wolf::VectorComposite v;
+    for (const auto& pair_key_vec1 : _v1)
+    {
+        const auto &key  = pair_key_vec1.first;
+        const auto &vec1 = pair_key_vec1.second;
+        const auto& vec2 = _v2.at(key);
+        v.at(key) = vec1 - vec2;
+    }
+    return v;
+}
+
 }
 
 namespace wolf
-- 
GitLab