From 49ebf77ff94f6a5e40a596ca282d467abeca1ac3 Mon Sep 17 00:00:00 2001
From: zhou <you.zhou@kit.edu>
Date: Thu, 22 Jul 2021 09:38:31 +0200
Subject: [PATCH] working on force intergration to impedence controller

---
 .../NJointTaskSpaceDMPController.ice          |  7 ++
 .../NJointTaskSpaceImpedanceDMPController.cpp | 64 ++++++++-----------
 .../NJointTaskSpaceImpedanceDMPController.h   | 21 +++++-
 3 files changed, 53 insertions(+), 39 deletions(-)

diff --git a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
index 93b018801..878f0b28b 100644
--- a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
+++ b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
@@ -298,6 +298,7 @@ module armarx
         string dmpType = "Discrete";
         double timeDuration;
         string nodeSetName;
+        string forceSensorName;
 
         // phaseStop technique
         double phaseL = 10;
@@ -306,6 +307,7 @@ module armarx
         double phaseDist1 = 10;
         double posToOriRatio = 100;
 
+
         Ice::FloatSeq Kpos;
         Ice::FloatSeq Dpos;
         Ice::FloatSeq Kori;
@@ -319,6 +321,8 @@ module armarx
 
         float torqueLimit;
 
+        float waitTimeForCalibration;
+
     };
 
     interface NJointTaskSpaceImpedanceDMPControllerInterface extends NJointControllerInterface
@@ -348,6 +352,9 @@ module armarx
         void setAngularVelocityKd(Ice::FloatSeq kd);
         void setAngularVelocityKp(Ice::FloatSeq kp);
 
+        void enableForceStop();
+        void disableForceStop();
+        void setForceThreshold(float forceThreshold);
     };
 
     class NJointTaskSpaceAdaptiveDMPControllerConfig extends NJointControllerConfig
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp
index 65da4d862..945b5d695 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp
@@ -37,6 +37,13 @@ namespace armarx
             positionSensors.push_back(positionSensor);
         };
 
+        const SensorValueBase* svlf = robUnit->getSensorDevice(cfg->forceSensorName)->getSensorValue();
+        forceSensor = svlf->asA<SensorValueForceTorque>();
+
+        forceOffset.setZero();
+        filteredForce.setZero();
+        filteredForceInRoot.setZero();
+
         tcp =  rns->getTCP();
         ik.reset(new VirtualRobot::DifferentialIK(rns, rtGetRobot()->getRootNode(), VirtualRobot::JacobiProvider::eSVDDamped));
         numOfJoints = targets.size();
@@ -135,8 +142,6 @@ namespace armarx
 
     void NJointTaskSpaceImpedanceDMPController::controllerRun()
     {
-
-
         if (!dmpCtrl)
         {
             return;
@@ -226,6 +231,22 @@ namespace armarx
     void NJointTaskSpaceImpedanceDMPController::rtRun(const IceUtil::Time& sensorValuesTimestamp, const IceUtil::Time& timeSinceLastIteration)
     {
         double deltaT = timeSinceLastIteration.toSecondsDouble();
+        Eigen::Matrix4f targetPose;
+        Eigen::VectorXf targetVel;
+        Eigen::VectorXf desiredNullSpaceJointValues;
+        if (firstRun || !started)
+        {
+            firstRun = false;
+            targetPose = currentPose;
+            targetVel.setZero(6);
+            desiredNullSpaceJointValues = defaultNullSpaceJointValues;
+        }
+        else
+        {
+            targetPose = rtGetControlStruct().targetPose;
+            targetVel = rtGetControlStruct().targetVel;
+            desiredNullSpaceJointValues = rtGetControlStruct().desiredNullSpaceJointValues;
+        }
 
 
         Eigen::MatrixXf jacobi = ik->getJacobianMatrix(tcp, VirtualRobot::IKSolver::CartesianSelection::All);
@@ -253,22 +274,6 @@ namespace armarx
         jacobi.block(0, 0, 3, numOfJoints) = 0.001 * jacobi.block(0, 0, 3, numOfJoints); // convert mm to m
 
 
-        Eigen::Matrix4f targetPose;
-        Eigen::VectorXf targetVel;
-        Eigen::VectorXf desiredNullSpaceJointValues;
-        if (firstRun)
-        {
-            firstRun = false;
-            targetPose = currentPose;
-            targetVel.setZero(6);
-            desiredNullSpaceJointValues = defaultNullSpaceJointValues;
-        }
-        else
-        {
-            targetPose = rtGetControlStruct().targetPose;
-            targetVel = rtGetControlStruct().targetVel;
-            desiredNullSpaceJointValues = rtGetControlStruct().desiredNullSpaceJointValues;
-        }
 
         Eigen::Vector3f kpos = ctrlParams.getUpToDateReadBuffer().kpos;
         Eigen::Vector3f dpos = ctrlParams.getUpToDateReadBuffer().dpos;
@@ -442,34 +447,17 @@ namespace armarx
 
     void NJointTaskSpaceImpedanceDMPController::runDMPWithTime(const Ice::DoubleSeq& goals, Ice::Double timeDuration, const Ice::Current&)
     {
-        firstRun = true;
-        while (firstRun)
-        {
-            usleep(100);
-        }
-
-        Eigen::Matrix4f pose = interfaceData.getUpToDateReadBuffer().currentTcpPose;
-        dmpCtrl->prepareExecution(dmpCtrl->eigen4f2vec(pose), goals);
-
         dmpCtrl->canVal = timeDuration;
         dmpCtrl->config.motionTimeDuration = timeDuration;
 
-        finished = false;
-
-        if (isNullSpaceJointDMPLearned && useNullSpaceJointDMP)
-        {
-            ARMARX_INFO << "Using Null Space Joint DMP";
-        }
-
-        started = true;
-        stopped = false;
-        //        controllerTask->start();
+        runDMP(goals);
     }
 
     void NJointTaskSpaceImpedanceDMPController::runDMP(const Ice::DoubleSeq& goals, const Ice::Current&)
     {
         firstRun = true;
-        while (firstRun)
+        timeForCalibration = 0;
+        while (firstRun || timeForCalibration < cfg.waitTimeForCalibration)
         {
             usleep(100);
         }
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h
index 1b49c9963..d68faf549 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h
@@ -81,7 +81,18 @@ namespace armarx
         void setAngularVelocityKd(const Ice::FloatSeq& kd, const Ice::Current&)override;
         void setAngularVelocityKp(const Ice::FloatSeq& kp, const Ice::Current&)override;
 
-
+        void enableForceStop(const Ice::Current&) override
+        {
+            useForceStop = true;
+        }
+        void disableForceStop(const Ice::Current&) override
+        {
+            useForceStop = false;
+        }
+        void setForceThreshold(float forceThreshold, const Ice::Current&) override
+        {
+            this->forceThreshold = forceThreshold;
+        }
     protected:
         virtual void onPublish(const SensorAndControl&, const DebugDrawerInterfacePrx&, const DebugObserverInterfacePrx&);
 
@@ -152,6 +163,7 @@ namespace armarx
         TripleBuffer<CtrlParams> ctrlParams;
 
 
+
         DMP::Vec<DMP::DMPState> currentJointState;
         DMP::UMIDMPPtr nullSpaceJointDMPPtr;
 
@@ -202,6 +214,13 @@ namespace armarx
         bool started = false;
         bool stopped = false;
 
+        Eigen::Vector3f filteredForce;
+        Eigen::Vector3f forceOffset;
+        Eigen::Vector3f filteredForceInRoot;
+        std::atomic<float> forceThreshold;
+        std::atomic<bool> useForceStop;
+        std::atomic<float> timeForCalibration;
+
         Eigen::Matrix4f oldPose;
         // NJointController interface
     protected:
-- 
GitLab