From 3c0555d600027a5c1578f0acbc0a5986bd55ac67 Mon Sep 17 00:00:00 2001
From: jcasals <jcasals@iri.upc.edu>
Date: Wed, 15 Jul 2020 12:29:34 +0200
Subject: [PATCH] Add tolerance to isValid

---
 include/core/state_block/local_parametrization_angle.h      | 4 ++--
 include/core/state_block/local_parametrization_base.h       | 2 +-
 .../core/state_block/local_parametrization_homogeneous.h    | 2 +-
 include/core/state_block/local_parametrization_quaternion.h | 4 ++--
 include/core/state_block/state_block.h                      | 6 +++---
 src/state_block/local_parametrization_homogeneous.cpp       | 2 +-
 6 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/include/core/state_block/local_parametrization_angle.h b/include/core/state_block/local_parametrization_angle.h
index a57d0de76..460835cb9 100644
--- a/include/core/state_block/local_parametrization_angle.h
+++ b/include/core/state_block/local_parametrization_angle.h
@@ -27,7 +27,7 @@ class LocalParametrizationAngle : public LocalParametrizationBase
         bool minus(Eigen::Map<const Eigen::VectorXd>& _x1,
                            Eigen::Map<const Eigen::VectorXd>& _x2,
                            Eigen::Map<Eigen::VectorXd>& _x2_minus_x1) override;
-        bool isValid(const Eigen::VectorXd& state) override;
+        bool isValid(const Eigen::VectorXd& state, double tolerance) override;
 };
 
 inline LocalParametrizationAngle::LocalParametrizationAngle() :
@@ -64,7 +64,7 @@ inline bool LocalParametrizationAngle::minus(Eigen::Map<const Eigen::VectorXd>&
     return true;
 }
 
-inline bool LocalParametrizationAngle::isValid(const Eigen::VectorXd& _state)
+inline bool LocalParametrizationAngle::isValid(const Eigen::VectorXd& _state, double tolerance)
 {
     //Any real is a valid angle because we use the pi2pi function. Also
     //the types don't match. In this case the argument is
diff --git a/include/core/state_block/local_parametrization_base.h b/include/core/state_block/local_parametrization_base.h
index 48417d92f..8494ec3a8 100644
--- a/include/core/state_block/local_parametrization_base.h
+++ b/include/core/state_block/local_parametrization_base.h
@@ -31,7 +31,7 @@ class LocalParametrizationBase{
         virtual bool minus(Eigen::Map<const Eigen::VectorXd>& _x1,
                            Eigen::Map<const Eigen::VectorXd>& _x2,
                            Eigen::Map<Eigen::VectorXd>&       _x2_minus_x1) = 0;
-        virtual bool isValid(const Eigen::VectorXd& state) = 0;
+        virtual bool isValid(const Eigen::VectorXd& state, double tolerance) = 0;
         unsigned int getLocalSize() const;
         unsigned int getGlobalSize() const;
 };
diff --git a/include/core/state_block/local_parametrization_homogeneous.h b/include/core/state_block/local_parametrization_homogeneous.h
index 834a070e7..b8bbb981c 100644
--- a/include/core/state_block/local_parametrization_homogeneous.h
+++ b/include/core/state_block/local_parametrization_homogeneous.h
@@ -47,7 +47,7 @@ class LocalParametrizationHomogeneous : public LocalParametrizationBase
         bool minus(Eigen::Map<const Eigen::VectorXd>& _h1,
                            Eigen::Map<const Eigen::VectorXd>& _h2,
                            Eigen::Map<Eigen::VectorXd>& _h2_minus_h1) override;
-        bool isValid(const Eigen::VectorXd& state) override;
+        bool isValid(const Eigen::VectorXd& state, double tolerance) override;
 };
 
 } // namespace wolf
diff --git a/include/core/state_block/local_parametrization_quaternion.h b/include/core/state_block/local_parametrization_quaternion.h
index 35b905f8d..c637ab6bb 100644
--- a/include/core/state_block/local_parametrization_quaternion.h
+++ b/include/core/state_block/local_parametrization_quaternion.h
@@ -75,9 +75,9 @@ public:
                      Eigen::Map<Eigen::VectorXd>& _q2_minus_q1) override;
   // inline bool isValid(const Eigen::VectorXd& state) override;
   // template<QuaternionDeltaReference DeltaReference>
-  bool isValid(const Eigen::VectorXd& _state) override
+  bool isValid(const Eigen::VectorXd& _state, double tolerance) override
   {
-      return _state.size() == global_size_ && fabs(1.0 - _state.norm()) < Constants::EPS;
+      return _state.size() == global_size_ && fabs(1.0 - _state.norm()) < tolerance;
   }
 };
 
diff --git a/include/core/state_block/state_block.h b/include/core/state_block/state_block.h
index 1773daf16..5406fe0c1 100644
--- a/include/core/state_block/state_block.h
+++ b/include/core/state_block/state_block.h
@@ -159,7 +159,7 @@ public:
 
         void plus(const Eigen::VectorXd& _dv);
 
-        bool isValid();
+        bool isValid(double tolerance = Constants::EPS);
 
         static StateBlockPtr create (const Eigen::VectorXd& _state, bool _fixed = false);
 
@@ -321,9 +321,9 @@ inline StateBlockPtr StateBlock::create (const Eigen::VectorXd& _state, bool _fi
 {
     return std::make_shared<StateBlock>(_state, _fixed);
 }
-inline bool StateBlock::isValid()
+inline bool StateBlock::isValid(double tolerance)
 {
-    return local_param_ptr_ ? local_param_ptr_->isValid(state_) : true;
+    return local_param_ptr_ ? local_param_ptr_->isValid(state_, tolerance) : true;
 }
 }// namespace wolf
 
diff --git a/src/state_block/local_parametrization_homogeneous.cpp b/src/state_block/local_parametrization_homogeneous.cpp
index 284360b72..846b14a49 100644
--- a/src/state_block/local_parametrization_homogeneous.cpp
+++ b/src/state_block/local_parametrization_homogeneous.cpp
@@ -60,7 +60,7 @@ bool LocalParametrizationHomogeneous::minus(Eigen::Map<const Eigen::VectorXd>& _
     return true;
 }
 
-bool LocalParametrizationHomogeneous::isValid(const Eigen::VectorXd& _state)
+bool LocalParametrizationHomogeneous::isValid(const Eigen::VectorXd& _state, double tolerance)
 {
     return _state.size() == global_size_;
 }
-- 
GitLab