From 0fb6db9cc8c9438760a2ea050527086312b1f6d7 Mon Sep 17 00:00:00 2001
From: Markus <Markus.Przybylski@kit.edu>
Date: Tue, 18 Feb 2014 17:00:34 +0100
Subject: [PATCH] Version of GraspingWithTorques where joint torques are
 interpreted as joint velocities... (because setting torques directly to the
 joints does not work in Bullet so far). Joints move, but motion will not stop
 (no self collision detection).

---
 .../GraspingWithTorques.cpp                   | 95 ++++++++++++-------
 1 file changed, 63 insertions(+), 32 deletions(-)

diff --git a/source/RobotAPI/GraspingWithTorques/GraspingWithTorques.cpp b/source/RobotAPI/GraspingWithTorques/GraspingWithTorques.cpp
index fe01e4fd8..37b4156fa 100644
--- a/source/RobotAPI/GraspingWithTorques/GraspingWithTorques.cpp
+++ b/source/RobotAPI/GraspingWithTorques/GraspingWithTorques.cpp
@@ -24,9 +24,7 @@
 
 #include "GraspingWithTorques.h"
 //#include "Armar3GraspContext.h"   //MP: Maybe necessary again later?
-#include "../core/RobotStatechartContext.h" //MP 2014-01-21
-
-//#include "../../units/KinematicUnitHand/KinematicUnitHand.h"
+#include "../core/RobotStatechartContext.h"
 
 #include <Core/observers/variant/ChannelRef.h>
 #include <Core/observers/variant/SingleTypeVariantList.h>
@@ -61,13 +59,13 @@ namespace armarx
         addToInput("thresholdVelocity", VariantType::Float, false);
 
 
-        addToInput("robotNodeSetName", VariantType::String, false);        //RobotNodeSet: LeftHand (auskommentarisiert MP 2014-01-21)
+        addToInput("robotNodeSetName", VariantType::String, false);
 
         addToLocal("jointNames", VariantType::List(VariantType::String));
-        //addToLocal("jointNames", SingleTypeVariantList(VariantType::String));   //Geht das? (2014-01-21)
 
-        addToLocal("jointVelocityChannel", VariantType::ChannelRef);
-        //addToLocal("jointVelocityChannel", VariantType::ChannelRef, false);
+        //addToLocal("jointVelocityChannel", VariantType::ChannelRef);  //first try ...
+
+        addToLocal("jointVelocitiesDatafields", VariantType::List(VariantType::DatafieldRef));
 
     }
 
@@ -93,7 +91,8 @@ namespace armarx
                 ->mapFromParent("timeoutGrasp", "timeoutGrasp")
                 ->mapFromParent("thresholdVelocity", "thresholdVelocity")
                 ->mapFromParent("jointNames")
-                ->mapFromParent("jointVelocityChannel"); //bei gleichem Namen muss man ihn nur einmal angeben
+                ->mapFromParent("jointVelocitiesDatafields");
+                //->mapFromParent("jointVelocityChannel"); //first try...
 
         setInitState(statePreshape, mapPreshapeInfo);
 
@@ -110,18 +109,24 @@ namespace armarx
         ARMARX_LOG << eINFO << "Entering StatechartGraspingWithTorques";
 
         RobotStatechartContext* context = getContext<RobotStatechartContext>();
-        setLocal("jointVelocityChannel", context->getChannelRef(context->getKinematicUnitObserverName(),"jointvelocities"));
+        //setLocal("jointVelocityChannel", context->getChannelRef(context->getKinematicUnitObserverName(),"jointvelocities"));
+        ChannelRefPtr tempChannelRef = context->getChannelRef(context->getKinematicUnitObserverName(),"jointvelocities");
 
         VirtualRobot::RobotNodeSetPtr nodeSet = context->remoteRobot->getRobotNodeSet(getInput<std::string>("robotNodeSetName"));    //woher robotNodeSetName holen? (Argument für getRobotNodeSet())
 
         SingleTypeVariantList jointNames(VariantType::String);
+        SingleTypeVariantList dataFields(VariantType::DatafieldRef);
+
 
         for (int i=0; i<nodeSet->getSize(); i++)
         {
             jointNames.addVariant(nodeSet->getNode(i)->getName());      //nodes = joints
+            dataFields.addVariant(context->getDatafieldRef(tempChannelRef, nodeSet->getNode(i)->getName()));
         }
 
-        setLocal("jointNames",jointNames);      //befüllen...!?
+        setLocal("jointNames", jointNames);      //befüllen...!?
+        setLocal("jointVelocitiesDatafields", dataFields);
+
     }
 
     void StatechartGraspingWithTorques::onExit()
@@ -140,8 +145,8 @@ namespace armarx
         addToInput("jointAnglesPreshape", VariantType::List(VariantType::Float), false);
         addToInput("timeoutPreshape", VariantType::Float, false);
 
-        //addToLocal("jointNames", VariantType::List(VariantType::String));   //ACHTUNG: addToLocal() oder addToInput()? (2013-01-21)
-        addToInput("jointNames", VariantType::List(VariantType::String), false);   //ACHTUNG: addToLocal() oder addToInput()? (2013-01-21)
+        //addToLocal("jointNames", VariantType::List(VariantType::String));
+        addToInput("jointNames", VariantType::List(VariantType::String), false);
     }
 
     void StatePreshape::onEnter()
@@ -151,7 +156,6 @@ namespace armarx
         RobotStatechartContext* rsContext = getContext<RobotStatechartContext>();
         SingleTypeVariantListPtr jointNames = getInput<SingleTypeVariantList>("jointNames");
         SingleTypeVariantListPtr jointAnglesPreshapeList = getInput<SingleTypeVariantList>("jointAnglesPreshape");
-        //NameValueMap jointAnglesPreshapeMap;
         NameValueMap jointNamesAndValues;
 
         if (jointNames->getSize() == jointAnglesPreshapeList->getSize())
@@ -164,9 +168,6 @@ namespace armarx
         else
             throw LocalException("StatePreshape: List lengths do not match!");
 
-        //ARMARX_INFO << "node.size()=" << nodes.size() << flush;
-        //ARMARX_INFO << "jointAnglesPreshapeList.size()=" << jointAnglesPreshapeList->getSize() << flush;
-
         rsContext->kinematicUnitPrx->setJointAngles(jointNamesAndValues);
 
         ARMARX_LOG << eINFO << "Installing preshape timeout condition";
@@ -241,8 +242,10 @@ namespace armarx
 
         addToInput("jointNames", VariantType::List(VariantType::String), false);
 
-        //addToLocal("jointVelocityChannel", VariantType::ChannelRef);
-        addToInput("jointVelocityChannel", VariantType::ChannelRef, false);
+        //addToInput("jointVelocityChannel", VariantType::ChannelRef, false);   //first try ...
+
+        addToInput("jointVelocitiesDatafields", VariantType::List(VariantType::DatafieldRef), false);
+
     }
 
     void StateInstallTerminateConditions::onEnter()
@@ -256,20 +259,11 @@ namespace armarx
         ARMARX_LOG << eINFO << "Installing allJointVelocitiesLow condition";
         float thresholdVelocity = getInput<float>("thresholdVelocity");
 
-        /*
-        Literal JointVelocityLowJoint0(getInput<ChannelRef>("jointVelocityChannel")
-                                       ->getDataFieldIdentifier(getVariant->getString()), "smaller", Literal::createParameterList(thresholdVelocity));  //siehe SingleTypeVariantList, Auslesen mit getInput()
-        Literal JointVelocityLowJoint1(getInput<ChannelRef>(markerChannelName)
-                                      ->getDataFieldIdentifier("localized"), "smaller", Literal::createParameterList(thresholdVelocity));
-        */
-
-        //Term allJointVelocitiesLow = JointVelocityLowJoint0 && JointVelocityLowJoint1;  //TODO: weitere Literale
-        //condAllJointVelocitiesLow = installCondition(allJointVelocitiesLow, createEvent<EvAllJointVelocitiesLow>());
-
-        //TODO: korrekter ChannelName für Hand-/Fingergelenke? Korrekter DatafieldIdentifier?
-        //TODO: Condition zusammenbauen in einer for-Schleife (siehe ArmarX-Doku zu Conditions...)
-        //TODO: korrekte Parametrierung von getDataFieldIdentifier(), mit getInput()...
+        //=======
+        //first try ... (with ChannelRef)
+        //=======
 
+        /*
         Term allJointVelocitiesLow;
         SingleTypeVariantListPtr jointNamesList = getInput<SingleTypeVariantList>("jointNames");
         for (int i=0; i<jointNamesList->getSize(); i++)
@@ -277,8 +271,25 @@ namespace armarx
            allJointVelocitiesLow = allJointVelocitiesLow && Literal(getInput<ChannelRef>("jointVelocityChannel")
                          ->getDataFieldIdentifier(jointNamesList->getVariant(i)->getString()), "smaller", Literal::createParameterList(thresholdVelocity));
         }
-
         condAllJointVelocitiesLow = installCondition(allJointVelocitiesLow, createEvent<EvAllJointVelocitiesLow>());
+        */
+
+        //=======
+        //second try ... (with DatafieldRef)
+        //=======
+        Term allJointVelocitiesLow_NEW;
+        //SingleTypeVariantListPtr jointNamesList = getInput<SingleTypeVariantList>("jointNames");
+        SingleTypeVariantListPtr dataFieldsList = getInput<SingleTypeVariantList>("jointVelocitiesDatafields");
+
+        //for (int i=0; i<jointNamesList->getSize(); i++)
+        for (int i=0; i<dataFieldsList->getSize(); i++)
+        {
+            allJointVelocitiesLow_NEW = allJointVelocitiesLow_NEW &&
+                    Literal(dataFieldsList->getVariant(i)->get<DatafieldRef>()->getDataFieldIdentifier(),
+                            "inrange", Literal::createParameterList(-thresholdVelocity, thresholdVelocity));
+        }
+
+        condAllJointVelocitiesLow = installCondition(allJointVelocitiesLow_NEW, createEvent<EvAllJointVelocitiesLow>());
 
     }
 
@@ -288,6 +299,26 @@ namespace armarx
         removeTimeoutEvent(condGraspTimeout);
         removeCondition(condAllJointVelocitiesLow);
 
+        //---------
+        //set joint velocities manually to zero (DEBUG)
+        //---------
+
+        RobotStatechartContext* rsContext = getContext<RobotStatechartContext>();
+        SingleTypeVariantListPtr jointNames = getInput<SingleTypeVariantList>("jointNames");
+        //SingleTypeVariantListPtr jointTorquesGraspList = getInput<SingleTypeVariantList>("jointTorquesGrasp");
+        NameValueMap jointNamesAndValues;
+
+        for (int j=0; j<jointNames->getSize(); j++)
+        {
+            jointNamesAndValues[jointNames->getVariant(j)->getString()]=0.0f;  //set everything to zero
+        }
+
+
+        //rsContext->kinematicUnitPrx->setJointTorques(jointNamesAndValues);
+        rsContext->kinematicUnitPrx->setJointVelocities(jointNamesAndValues);
+
+
+
     }
 
 }
-- 
GitLab