From 5bf61fbe8d7751c8a9e6a31c8a72ebf9e4bebb51 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Fri, 7 Jan 2022 09:46:02 +0100
Subject: [PATCH] preventing division by zero

---
 .../navigation/global_planning/optimization/math.h | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/source/armarx/navigation/global_planning/optimization/math.h b/source/armarx/navigation/global_planning/optimization/math.h
index 86f19571..2007edb3 100644
--- a/source/armarx/navigation/global_planning/optimization/math.h
+++ b/source/armarx/navigation/global_planning/optimization/math.h
@@ -22,6 +22,7 @@
 #pragma once
 
 #include <array>
+
 #include <ceres/ceres.h>
 
 namespace armarx::navigation::global_planning::optimization
@@ -46,8 +47,7 @@ namespace armarx::navigation::global_planning::optimization
         return angleDiff;
     }
 
-    std::array<double, 2>
-    inline periodicDiffJacobian(const auto a, const auto b)
+    std::array<double, 2> inline periodicDiffJacobian(const auto a, const auto b)
     {
         const auto derivative = [&a, &b]() -> double
         {
@@ -56,6 +56,16 @@ namespace armarx::navigation::global_planning::optimization
                 return 0.;
             }
 
+
+            const double denomSquared =
+                1 - ceres::pow(ceres::sin(a) * ceres::sin(b) + ceres::cos(a) * ceres::cos(b), 2);
+
+            // prevent division by 0
+            if(denomSquared < 0.001)
+            {
+                return 0.;
+            }
+
             return (ceres::sin(a) * ceres::cos(b) - ceres::cos(a) * ceres::sin(b)) /
                    (ceres::sqrt(
                        1 - ceres::pow(ceres::sin(a) * ceres::sin(b) + ceres::cos(a) * ceres::cos(b),
-- 
GitLab