From 0241b0cde8a15c9e413d7e4b5cdf6e72466f762b Mon Sep 17 00:00:00 2001
From: Mirko Waechter <mirko.waechter@kit.edu>
Date: Mon, 18 Jan 2016 14:47:02 +0100
Subject: [PATCH] HeadIK uses also not so good results

---
 .../RobotAPI/components/units/HeadIKUnit.cpp  | 71 +++++++++++--------
 1 file changed, 40 insertions(+), 31 deletions(-)

diff --git a/source/RobotAPI/components/units/HeadIKUnit.cpp b/source/RobotAPI/components/units/HeadIKUnit.cpp
index 0ab897d7d..46dcd0ab5 100644
--- a/source/RobotAPI/components/units/HeadIKUnit.cpp
+++ b/source/RobotAPI/components/units/HeadIKUnit.cpp
@@ -280,47 +280,56 @@ namespace armarx
 
             if (!solutionFound)
             {
-                ARMARX_WARNING << "IKSolver found no solution!";
-            }
-            else
-            {
-                ARMARX_DEBUG << "Solution found";
-
-                if (drawer && localRobot->hasRobotNode("Cameras"))
+                Eigen::Vector3f position = globalPos->toEigen() - kinematicChain->getTCP()->getGlobalPose().block(0, 3, 3, 1);
+                float error = position.norm();
+                if (error < 200)
+                {
+                    ARMARX_INFO << "IKSolver found no solution! applying best solution with " << error << "mm error";
+                }
+                else
                 {
-                    Vector3Ptr startPos = new Vector3(localRobot->getRobotNode("Cameras")->getGlobalPose());
-                    drawer->setSphereDebugLayerVisu("HeadViewTargetSolution",
-                                                    startPos,
-                                                    DrawColor {0, 1, 1, 0.2},
-                                                    17);
+                    ARMARX_WARNING << "IKSolver found no solution!  " << error << "mm error";
+                    return;
                 }
+            }
 
+            ARMARX_DEBUG << "Solution found";
 
-                NameValueMap targetJointAngles;
-                NameControlModeMap controlModes;
+            if (drawer && localRobot->hasRobotNode("Cameras"))
+            {
+                Vector3Ptr startPos = new Vector3(localRobot->getRobotNode("Cameras")->getGlobalPose());
+                drawer->setSphereDebugLayerVisu("HeadViewTargetSolution",
+                                                startPos,
+                                                DrawColor {0, 1, 1, 0.2},
+                                                17);
+            }
 
-                for (int i = 0; i < (signed int)kinematicChain->getSize(); i++)
-                {
-                    if (kinematicChain->getNode(i)->getName().compare("VirtualCentralGaze") != 0)
-                    {
-                        targetJointAngles[kinematicChain->getNode(i)->getName()] = kinematicChain->getNode(i)->getJointValue();
-                        controlModes[kinematicChain->getNode(i)->getName()] = ePositionControl;
-                    }
 
-                    ARMARX_DEBUG << kinematicChain->getNode(i)->getName() << ": " << kinematicChain->getNode(i)->getJointValue();
-                }
+            NameValueMap targetJointAngles;
+            NameControlModeMap controlModes;
 
-                try
-                {
-                    kinematicUnitPrx->switchControlMode(controlModes);
-                    ARMARX_DEBUG << "setting new joint angles" << targetJointAngles;
-                    kinematicUnitPrx->setJointAngles(targetJointAngles);
-                }
-                catch (...)
+            for (int i = 0; i < (signed int)kinematicChain->getSize(); i++)
+            {
+                if (kinematicChain->getNode(i)->getName().compare("VirtualCentralGaze") != 0)
                 {
-                    ARMARX_IMPORTANT << "setJointAngles failed";
+                    targetJointAngles[kinematicChain->getNode(i)->getName()] = kinematicChain->getNode(i)->getJointValue();
+                    controlModes[kinematicChain->getNode(i)->getName()] = ePositionControl;
                 }
+
+                ARMARX_DEBUG << kinematicChain->getNode(i)->getName() << ": " << kinematicChain->getNode(i)->getJointValue();
+            }
+
+            try
+            {
+                kinematicUnitPrx->switchControlMode(controlModes);
+                ARMARX_DEBUG << "setting new joint angles" << targetJointAngles;
+                kinematicUnitPrx->setJointAngles(targetJointAngles);
             }
+            catch (...)
+            {
+                ARMARX_IMPORTANT << "setJointAngles failed";
+            }
+
         }
     }
 
-- 
GitLab