From 71c075630ae8e948ba2c25426c55dd7940d4f960 Mon Sep 17 00:00:00 2001
From: Mirko Waechter <waechter@kit.edu>
Date: Fri, 6 Dec 2013 22:04:08 +0100
Subject: [PATCH] More ZeroForceControl updates

---
 source/RobotAPI/core/RobotStatechartContext.h |  4 ++-
 source/RobotAPI/motioncontrol/CMakeLists.txt  |  2 +-
 .../motioncontrol/ZeroForceControl.cpp        | 32 ++++++++++++++-----
 source/RobotAPI/units/ForceTorqueObserver.cpp | 10 +++++-
 source/RobotAPI/units/ForceTorqueObserver.h   |  3 ++
 5 files changed, 40 insertions(+), 11 deletions(-)

diff --git a/source/RobotAPI/core/RobotStatechartContext.h b/source/RobotAPI/core/RobotStatechartContext.h
index 1992440da..87497c103 100644
--- a/source/RobotAPI/core/RobotStatechartContext.h
+++ b/source/RobotAPI/core/RobotStatechartContext.h
@@ -31,6 +31,8 @@
 #include <Core/robotstate/remote/RemoteRobot.h>
 #include <Core/interface/units/KinematicUnitInterface.h>
 
+#include <RobotAPI/interface/units/TCPControlUnit.h>
+
 #include <Core/units/KinematicUnitObserver.h>
 //#include <VirtualRobot/VirtualRobot.h>
 #include <IceUtil/Time.h>
@@ -82,7 +84,7 @@ namespace armarx
 		RobotStateComponentInterfacePrx robotStateComponent;
 		KinematicUnitInterfacePrx kinematicUnitPrx;
         KinematicUnitObserverInterfacePrx kinematicUnitObserverPrx;
-
+        TCPControlUnitInterfacePrx tcpControlPrx;
         //SystemObserverInterfacePrx	systemObserver; // already defined in StatechartContext
         VirtualRobot::RobotPtr remoteRobot;
     private:
diff --git a/source/RobotAPI/motioncontrol/CMakeLists.txt b/source/RobotAPI/motioncontrol/CMakeLists.txt
index a5d3bff31..88550f6ae 100755
--- a/source/RobotAPI/motioncontrol/CMakeLists.txt
+++ b/source/RobotAPI/motioncontrol/CMakeLists.txt
@@ -15,7 +15,7 @@ if (ARMARX_BUILD)
     set(LIB_VERSION    0.1.0)
     set(LIB_SOVERSION  0)
 
-    set(LIBS RobotAPICore ArmarXInterfaces ArmarXCore ArmarXCoreObservers)
+    set(LIBS RobotAPICore RobotAPIInterfaces ArmarXInterfaces ArmarXCore ArmarXCoreObservers)
 
     set(LIB_FILES MotionControl.cpp
          ZeroForceControl.cpp)
diff --git a/source/RobotAPI/motioncontrol/ZeroForceControl.cpp b/source/RobotAPI/motioncontrol/ZeroForceControl.cpp
index 9188a476d..16f32e51b 100644
--- a/source/RobotAPI/motioncontrol/ZeroForceControl.cpp
+++ b/source/RobotAPI/motioncontrol/ZeroForceControl.cpp
@@ -24,6 +24,9 @@
 #include "ZeroForceControl.h"
 
 #include <Core/robotstate/remote/RobotStateObjectFactories.h>
+#include <Core/core/exceptions/local/ExpressionException.h>
+
+#include <RobotAPI/core/RobotStatechartContext.h>
 
 namespace armarx {
 
@@ -49,6 +52,7 @@ namespace armarx {
 
     void ZeroForceControl::defineParameters()
     {
+        addToInput("robotNodeSetName",VariantType::String, false);
         addToInput("tcpName",VariantType::String, false);
         addToInput("sensitivity",VariantType::Float, false);
         addToInput("maxAcc",VariantType::Float, false);
@@ -61,14 +65,20 @@ namespace armarx {
 
     void ZeroForceControl::onEnter()
     {
+        RobotStatechartContext* c = getContext<RobotStatechartContext>();
+        c->tcpControlPrx->request();
+        Eigen::Vector3f null(3);
+        null.setZero();
         setLocal("currentSensitivity", 0.0f);
-        setLocal("currentVelocity", 0.0f);
-        setLocal("currentAcc", 0.0f);
+        setLocal("currentVelocity", new FramedVector3(null, getInput<std::string>("tcpName")));
+        setLocal("currentAcc", new FramedVector3(null, getInput<std::string>("tcpName")));
         setLocal("timestamp", (float)IceUtil::Time::now().toMilliSecondsDouble());
     }
 
     void ZeroForceControl::onExit()
     {
+        RobotStatechartContext* c = getContext<RobotStatechartContext>();
+        c->tcpControlPrx->release();
     }
 
 
@@ -83,7 +93,7 @@ namespace armarx {
 
     void ZeroForceControlForceToAcc::defineParameters()
     {
-        addToInput("tcpName",VariantType::String, false);
+        addToInput("robotNodeSetName",VariantType::String, false);
         addToInput("sensitivity",VariantType::Float, false);
         addToInput("maxAcc",VariantType::Float, false);
 
@@ -107,27 +117,33 @@ namespace armarx {
         installCondition<EvSensorUpdate>(update);
         IceUtil::Time duration = IceUtil::Time::now() - IceUtil::Time::milliSecondsDouble(getInput<float>("timestamp"));
 
-        std::string tcpName = getInput<std::string>("tcpName");
+        std::string robotNodeSetName = getInput<std::string>("robotNodeSetName");
 //        FramedVector3Ptr vel = getInput<FramedVector3>("currentVelocity");
         FramedVector3Ptr vel = getInput<FramedVector3>("currentVelocity");
         FramedVector3Ptr curAcc = getInput<FramedVector3>("currentAcc");
         FramedVector3Ptr curForce = getInput<FramedVector3>("currentForce");
-
+        ARMARX_CHECK_EXPRESSION(vel->frame == curAcc->frame);
+        ARMARX_CHECK_EXPRESSION(vel->frame == curForce->frame);
+        float forceThreshold = 2.0f;
+        float maxSensitivity = 2.0f;
 
         Eigen::Vector3f newVel(3);
         Eigen::Vector3f newAcc(3);
-        if(curForce->toEigen().norm() > 3){
-            newAcc = 20*curForce->toEigen().normalized();
+        if(curForce->toEigen().norm() > forceThreshold){
+            newAcc = 2 *  curForce->toEigen() * 5;
         }
         else
         {
-            newAcc = -10*curForce->toEigen().normalized();
+            newAcc = -10*vel->toEigen().normalized();
         }
 
         newVel = vel->toEigen() + newAcc * duration.toMilliSecondsDouble()*0.001;
 
 
         setOutput("currentAcc", Variant(new FramedVector3(newAcc, curAcc->frame)));
+        RobotStatechartContext* c = getContext<RobotStatechartContext>();
+
+        c->tcpControlPrx->setTCPVelocity(robotNodeSetName, "", new FramedVector3(newVel, vel->frame), NULL);
     }
 
     void ZeroForceControlForceToAcc::onExit()
diff --git a/source/RobotAPI/units/ForceTorqueObserver.cpp b/source/RobotAPI/units/ForceTorqueObserver.cpp
index dd43ebb29..23a978f70 100644
--- a/source/RobotAPI/units/ForceTorqueObserver.cpp
+++ b/source/RobotAPI/units/ForceTorqueObserver.cpp
@@ -23,9 +23,17 @@ ForceTorqueObserver::ForceTorqueObserver()
 {
 }
 
+void ForceTorqueObserver::setTopicName(std::string topicName)
+{
+    this->topicName = topicName;
+}
+
 void ForceTorqueObserver::onInitObserver()
 {
-    usingTopic(getProperty<std::string>("ForceTorqueTopicName").getValue());
+    if(topicName.empty())
+        usingTopic(getProperty<std::string>("ForceTorqueTopicName").getValue());
+    else
+        usingTopic(topicName);
 
     // register all checks
     offerConditionCheck("updated", new ConditionCheckUpdated());
diff --git a/source/RobotAPI/units/ForceTorqueObserver.h b/source/RobotAPI/units/ForceTorqueObserver.h
index 8b9c34dc2..50c5ea1d7 100644
--- a/source/RobotAPI/units/ForceTorqueObserver.h
+++ b/source/RobotAPI/units/ForceTorqueObserver.h
@@ -25,6 +25,8 @@ namespace armarx
     public:
         ForceTorqueObserver();
 
+        void setTopicName(std::string topicName);
+
         // framework hooks
         virtual std::string getDefaultName() const { return "ForceTorqueUnitObserver"; }
         void onInitObserver();
@@ -41,6 +43,7 @@ namespace armarx
         virtual PropertyDefinitionsPtr createPropertyDefinitions();
     private:
         armarx::Mutex dataMutex;
+        std::string topicName;
 
     };
 }
-- 
GitLab