From 704fba38bae9d9a1c6b06362bac1c7c8dcddc151 Mon Sep 17 00:00:00 2001
From: Fabian Paus <fabian.paus@kit.edu>
Date: Thu, 29 Nov 2018 11:33:36 +0100
Subject: [PATCH] Prevent division by zero in carteisian velocity controller

---
 .../libraries/core/CartesianPositionController.cpp       | 3 ++-
 .../libraries/core/CartesianVelocityController.cpp       | 9 +++++++--
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/source/RobotAPI/libraries/core/CartesianPositionController.cpp b/source/RobotAPI/libraries/core/CartesianPositionController.cpp
index 3ffd16046..4559e139c 100644
--- a/source/RobotAPI/libraries/core/CartesianPositionController.cpp
+++ b/source/RobotAPI/libraries/core/CartesianPositionController.cpp
@@ -41,7 +41,8 @@ Eigen::VectorXf CartesianPositionController::calculate(const Eigen::Matrix4f& ta
     if (posLen)
     {
         Eigen::Vector3f targetPos = targetPose.block<3, 1>(0, 3);
-        Eigen::Vector3f errPos = targetPos - tcp->getPositionInRootFrame();
+        Eigen::Vector3f currentPos = tcp->getPositionInRootFrame();
+        Eigen::Vector3f errPos = targetPos - currentPos;
         Eigen::Vector3f posVel =  errPos * KpPos;
         if (maxPosVel > 0)
         {
diff --git a/source/RobotAPI/libraries/core/CartesianVelocityController.cpp b/source/RobotAPI/libraries/core/CartesianVelocityController.cpp
index 40dad3107..3ec8849c6 100644
--- a/source/RobotAPI/libraries/core/CartesianVelocityController.cpp
+++ b/source/RobotAPI/libraries/core/CartesianVelocityController.cpp
@@ -69,7 +69,12 @@ Eigen::VectorXf CartesianVelocityController::calculate(const Eigen::VectorXf& ca
     Eigen::VectorXf nsv = Eigen::VectorXf::Zero(nullspace.rows());
     for (int i = 0; i < nullspace.cols(); i++)
     {
-        nsv += nullspace.col(i) * nullspace.col(i).dot(nullspaceVel) / nullspace.col(i).squaredNorm();
+        float squaredNorm = nullspace.col(i).squaredNorm();
+        // Prevent division by zero
+        if (squaredNorm > 1.0e-32f)
+        {
+            nsv += nullspace.col(i) * nullspace.col(i).dot(nullspaceVel) / nullspace.col(i).squaredNorm();
+        }
     }
 
     //    Eigen::VectorXf nsv = nullspace * nullspaceVel;
@@ -178,7 +183,7 @@ bool CartesianVelocityController::adjustJacobiForJointsAtJointLimits(VirtualRobo
 
         if (node->isLimitless() || // limitless joint cannot be out of limits
             std::abs(jointVel(i)) < 0.001f // If it the jacobi doesnt want this joint to move anyway, there is no point in recalculating the inverse jacobi
-            )
+           )
         {
             continue;
         }
-- 
GitLab