From 50926143d0d5144032b4abc6a3ff751e0600da2c Mon Sep 17 00:00:00 2001
From: p-kaiser <p-kaiser@042f3d55-54a8-47e9-b7fb-15903f145c44>
Date: Thu, 23 Apr 2015 14:53:23 +0000
Subject: [PATCH] TSR Constraint: Fixed displacement calculation

git-svn-id: http://svn.code.sf.net/p/simox/code/trunk@835 042f3d55-54a8-47e9-b7fb-15903f145c44
---
 VirtualRobot/IK/Constraint.cpp                |  2 +-
 VirtualRobot/IK/constraints/TSRConstraint.cpp | 24 ++++++++++++++-----
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git a/VirtualRobot/IK/Constraint.cpp b/VirtualRobot/IK/Constraint.cpp
index dbf0a1465..42ba844cf 100644
--- a/VirtualRobot/IK/Constraint.cpp
+++ b/VirtualRobot/IK/Constraint.cpp
@@ -3,7 +3,7 @@
 using namespace VirtualRobot;
 
 Constraint::Constraint(const RobotNodeSetPtr &nodeSet) :
-    JacobiProvider(nodeSet, JacobiProvider::eSVD),
+    JacobiProvider(nodeSet, JacobiProvider::eSVDDamped),
     lastError(-1),
     lastLastError(-1)
 {
diff --git a/VirtualRobot/IK/constraints/TSRConstraint.cpp b/VirtualRobot/IK/constraints/TSRConstraint.cpp
index 399139aa8..6bdaed898 100644
--- a/VirtualRobot/IK/constraints/TSRConstraint.cpp
+++ b/VirtualRobot/IK/constraints/TSRConstraint.cpp
@@ -84,21 +84,33 @@ Eigen::VectorXf TSRConstraint::getError(float stepSize)
     Eigen::Matrix4f T_dx;
     MathTools::posrpy2eigen4f(target.block<3,1>(0,0), target.block<3,1>(3,0), T_dx);
 
-    float target_global[6];
-    MathTools::eigen4f2rpy(transformation * T_dx, target_global);
+    Eigen::Matrix4f P_target = transformation * T_dx;
+    //float target_global[6];
+    //MathTools::eigen4f2rpy(P_target, target_global);
 
-    float e_global[6];
-    MathTools::eigen4f2rpy(eef_global * eefOffset, e_global);
+    Eigen::Matrix4f P_eef = eef_global * eefOffset;
+    //float e_global[6];
+    //MathTools::eigen4f2rpy(P_eef, e_global);
 
-    resolveRPYAmbiguities(e_global, target_global);
+    Eigen::Matrix4f P_delta = P_target * P_eef.inverse();
+    Eigen::AngleAxis<float> P_delta_AA;
+    P_delta_AA = P_delta.block<3, 3>(0, 0);
 
     Eigen::VectorXf dx(6);
+    dx.head(3) = Eigen::Vector3f(
+                P_target(0,3) - P_eef(0,3),
+                P_target(1,3) - P_eef(1,3),
+                P_target(2,3) - P_eef(2,3)
+                );
+    dx.tail(3) = P_delta_AA.axis() * P_delta_AA.angle();
+
+    /*resolveRPYAmbiguities(e_global, target_global);
     dx << (target_global[0] - e_global[0]),
           (target_global[1] - e_global[1]),
           (target_global[2] - e_global[2]),
           getShortestDistanceForRPYComponent(e_global[3], target_global[3]),
           getShortestDistanceForRPYComponent(e_global[4], target_global[4]),
-          getShortestDistanceForRPYComponent(e_global[5], target_global[5]);
+          getShortestDistanceForRPYComponent(e_global[5], target_global[5]);*/
 
     return dx * stepSize;
 }
-- 
GitLab