From 28624394a8135eaf56556de7d6894f673646bc5c Mon Sep 17 00:00:00 2001
From: ArmarX User <armarx@kit.edu>
Date: Tue, 19 Feb 2019 18:02:02 +0100
Subject: [PATCH] added all changes for VMP

---
 .../NJointTaskSpaceDMPController.ice          |   3 +
 .../DMPController/TaskSpaceDMPController.cpp  |  33 ++--
 .../DMPController/TaskSpaceDMPController.h    |   9 +-
 .../DMPController/NJointTSDMPController.cpp   | 147 ++++++++++++------
 .../DMPController/NJointTSDMPController.h     |   7 +-
 5 files changed, 133 insertions(+), 66 deletions(-)

diff --git a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
index e4af46f9e..8388479b7 100644
--- a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
+++ b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
@@ -86,9 +86,12 @@ module armarx
 
         void setSpeed(double times);
         void setViaPoints(double canVal, Ice::DoubleSeq point);
+        void removeAllViaPoints();
         void setGoals(Ice::DoubleSeq goals);
 
         double getCanVal();
+        void resetDMP();
+        void stopDMP();
 
         void setControllerTarget(float avoidJointLimitsKp, NJointTaskSpaceDMPControllerMode::CartesianSelection mode);
         void setTorqueKp(StringFloatDictionary torqueKp);
diff --git a/source/RobotAPI/libraries/DMPController/TaskSpaceDMPController.cpp b/source/RobotAPI/libraries/DMPController/TaskSpaceDMPController.cpp
index 425a9abf8..eb748893a 100644
--- a/source/RobotAPI/libraries/DMPController/TaskSpaceDMPController.cpp
+++ b/source/RobotAPI/libraries/DMPController/TaskSpaceDMPController.cpp
@@ -78,7 +78,7 @@ void TaskSpaceDMPController::flow(double deltaT, const Eigen::Matrix4f& currentP
 
     double tau = dmpPtr->getTemporalFactor();
     double timeDuration = config.motionTimeDuration;
-    canVal -= 1 / tau * deltaT * 1 / (1 + phaseStop) ;
+    canVal -= deltaT * 1 / (1 + phaseStop) ;
 
 
     for (size_t i = 0; i < 7; ++i)
@@ -86,7 +86,7 @@ void TaskSpaceDMPController::flow(double deltaT, const Eigen::Matrix4f& currentP
         currentState[i].vel = currentState[i].vel * config.DMPAmplitude;
     }
 
-    currentState = dmpPtr->calculateDirectlyVelocity(currentState, canVal / timeDuration, deltaT / timeDuration, targetPoseVec);
+    currentState = dmpPtr->calculateDirectlyVelocity(currentState, canVal / (tau * timeDuration), deltaT / (tau * timeDuration), targetPoseVec);
 
     //    for (size_t i = 0; i < 7; ++i)
     //    {
@@ -102,7 +102,7 @@ void TaskSpaceDMPController::flow(double deltaT, const Eigen::Matrix4f& currentP
         linearVel << twist(0), twist(1), twist(2);
         for (size_t i = 0; i < 3; i++)
         {
-            vel0 = currentState[i].vel / timeDuration;
+            vel0 = currentState[i].vel / (timeDuration * tau);
             vel1 = config.phaseStopParas.Kpos * (targetPoseVec[i] - currentPosition(i)) - config.phaseStopParas.Dpos * linearVel(i);
             targetVel(i) = mpcFactor * vel0 + (1 - mpcFactor) * vel1;
         }
@@ -111,7 +111,7 @@ void TaskSpaceDMPController::flow(double deltaT, const Eigen::Matrix4f& currentP
     {
         for (size_t i = 0; i < 3; i++)
         {
-            targetVel(i) = currentState[i].vel / timeDuration;
+            targetVel(i) = currentState[i].vel / (timeDuration * tau);
         }
     }
 
@@ -167,15 +167,15 @@ void TaskSpaceDMPController::flow(double deltaT, const Eigen::Matrix4f& currentP
 
     if (isPhaseStopControl)
     {
-        targetVel(3) = angularVel0.x() / timeDuration;
-        targetVel(4) = angularVel0.y() / timeDuration;
-        targetVel(5) = angularVel0.z() / timeDuration;
+        targetVel(3) = angularVel0.x() / (timeDuration * tau);
+        targetVel(4) = angularVel0.y() / (timeDuration * tau);
+        targetVel(5) = angularVel0.z() / (timeDuration * tau);
     }
     else
     {
-        targetVel(3) = mpcFactor * angularVel0.x() / timeDuration + (1 - mpcFactor) * angularVel1(0);
-        targetVel(4) = mpcFactor * angularVel0.y() / timeDuration + (1 - mpcFactor) * angularVel1(1);
-        targetVel(5) = mpcFactor * angularVel0.z() / timeDuration + (1 - mpcFactor) * angularVel1(2);
+        targetVel(3) = mpcFactor * angularVel0.x() / (timeDuration * tau) + (1 - mpcFactor) * angularVel1(0);
+        targetVel(4) = mpcFactor * angularVel0.y() / (timeDuration * tau) + (1 - mpcFactor) * angularVel1(1);
+        targetVel(5) = mpcFactor * angularVel0.z() / (timeDuration * tau) + (1 - mpcFactor) * angularVel1(2);
     }
 
     debugData.canVal = canVal;
@@ -258,15 +258,20 @@ void TaskSpaceDMPController::setViaPose(double canVal, const std::vector<double>
     dmpPtr->setViaPoint(canVal, viaPoseWithQuaternion);
 }
 
-void TaskSpaceDMPController::prepareExecution(const Eigen::Matrix4f& currentPose, const Eigen::Matrix4f& goalPose)
+void TaskSpaceDMPController::removeAllViaPoints()
+{
+    dmpPtr->removeViaPoints();
+}
+
+void TaskSpaceDMPController::prepareExecution(const Eigen::Matrix4f& currentPose, const Eigen::Matrix4f& goalPose, double tau)
 {
     std::vector<double> currentPoseVec = eigen4f2vec(currentPose);
     std::vector<double> goalPoseVec = eigen4f2vec(goalPose);
 
-    prepareExecution(currentPoseVec, goalPoseVec);
+    prepareExecution(currentPoseVec, goalPoseVec, tau);
 }
 
-void TaskSpaceDMPController::prepareExecution(const std::vector<double>& currentPoseVec, const std::vector<double>& goalPoseVec)
+void TaskSpaceDMPController::prepareExecution(const std::vector<double>& currentPoseVec, const std::vector<double>& goalPoseVec, double tau)
 {
     ARMARX_CHECK_EQUAL(currentPoseVec.size(), 7);
     ARMARX_CHECK_EQUAL(goalPoseVec.size(), 7);
@@ -278,7 +283,7 @@ void TaskSpaceDMPController::prepareExecution(const std::vector<double>& current
         targetPoseVec.at(i) = currentPoseVec.at(i);
     }
 
-    dmpPtr->prepareExecution(goalPoseVec, currentState, 1,  1);
+    dmpPtr->prepareExecution(goalPoseVec, currentState, 1,  tau);
     this->goalPoseVec = goalPoseVec;
     isDisturbance = false;
     canVal = config.motionTimeDuration;
diff --git a/source/RobotAPI/libraries/DMPController/TaskSpaceDMPController.h b/source/RobotAPI/libraries/DMPController/TaskSpaceDMPController.h
index d95e1b62c..777c75da7 100644
--- a/source/RobotAPI/libraries/DMPController/TaskSpaceDMPController.h
+++ b/source/RobotAPI/libraries/DMPController/TaskSpaceDMPController.h
@@ -142,8 +142,10 @@ namespace armarx
         void setViaPose(double canVal, const Eigen::Matrix4f& viaPose);
         void setViaPose(double canVal, const std::vector<double>& viaPoseWithQuaternion);
 
-        void prepareExecution(const Eigen::Matrix4f& currentPose, const Eigen::Matrix4f& goalPose);
-        void prepareExecution(const std::vector<double>& currentPoseVec, const std::vector<double>& goalPoseVec);
+        void removeAllViaPoints();
+
+        void prepareExecution(const Eigen::Matrix4f& currentPose, const Eigen::Matrix4f& goalPose, double tau = 1);
+        void prepareExecution(const std::vector<double>& currentPoseVec, const std::vector<double>& goalPoseVec, double tau = 1);
 
         void setSpeed(double times);
 
@@ -168,6 +170,8 @@ namespace armarx
         double canVal;
         bool isPhaseStopControl;
         std::string dmpName;
+        TaskSpaceDMPControllerConfig config;
+
     private:
 
 
@@ -178,7 +182,6 @@ namespace armarx
 
         DMP::UMITSMPPtr dmpPtr;
         DMP::Vec<DMP::DMPState > currentState;
-        TaskSpaceDMPControllerConfig config;
 
 
         bool isDisturbance;
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
index 37dcd2291..ec9bf0b23 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
@@ -71,19 +71,7 @@ namespace armarx
         initSensorData.currentTwist.setZero();
         controllerSensorData.reinitAllBuffers(initSensorData);
 
-        targetVels.resize(6);
-        NJointTSDMPControllerControlData initData;
-        initData.targetTSVel.resize(6);
-        for (size_t i = 0; i < 6; ++i)
-        {
-            initData.targetTSVel(i) = 0;
-            targetVels(i) = 0;
-        }
-        initData.nullspaceJointVelocities.resize(tcpController->rns->getSize(), 0);
-        initData.torqueKp.resize(tcpController->rns->getSize(), 0);
-        initData.torqueKd.resize(tcpController->rns->getSize(), 0);
-        initData.mode = ModeFromIce(cfg->mode);
-        reinitTripleBuffer(initData);
+
 
         debugName = cfg->debugName;
 
@@ -111,6 +99,12 @@ namespace armarx
             jointLowLimits(i) = rn->getJointLimitLo();
             jointHighLimits(i) = rn->getJointLimitHi();
         }
+
+        started = false;
+
+        NJointTSDMPControllerInterfaceData initInterfaceData;
+        initInterfaceData.currentTcpPose = tcp->getPoseInRootFrame();
+        interfaceData.reinitAllBuffers(initInterfaceData);
     }
 
     std::string NJointTSDMPController::getClassName(const Ice::Current&) const
@@ -120,6 +114,11 @@ namespace armarx
 
     void NJointTSDMPController::controllerRun()
     {
+        if (!started)
+        {
+            return;
+        }
+
         if (!controllerSensorData.updateReadBuffer() || !taskSpaceDMPController)
         {
             return;
@@ -128,6 +127,8 @@ namespace armarx
         Eigen::Matrix4f currentPose = controllerSensorData.getReadBuffer().currentPose;
         Eigen::VectorXf currentTwist = controllerSensorData.getReadBuffer().currentTwist;
 
+
+        LockGuardType guard {controllerMutex};
         taskSpaceDMPController->flow(deltaT, currentPose, currentTwist);
 
 
@@ -140,6 +141,7 @@ namespace armarx
         std::vector<double> targetState = taskSpaceDMPController->getTargetPose();
 
         //        ARMARX_IMPORTANT << "CanVal: " << taskSpaceDMPController->canVal;
+        //        ARMARX_IMPORTANT << "currentPose: " << currentPose;
         //        ARMARX_IMPORTANT << "targetVels: " << targetVels;
         //        ARMARX_IMPORTANT << "targetPose: " << targetPose;
 
@@ -179,16 +181,30 @@ namespace armarx
 
         writeControlStruct();
 
-        NJointTSDMPControllerInterfaceData initInterfaceData;
-        initInterfaceData.currentTcpPose = Eigen::Matrix4f::Identity();
-        interfaceData.reinitAllBuffers(initInterfaceData);
     }
 
 
     void NJointTSDMPController::rtRun(const IceUtil::Time& sensorValuesTimestamp, const IceUtil::Time& timeSinceLastIteration)
     {
         Eigen::Matrix4f currentPose = tcp->getPoseInRootFrame();
+        interfaceData.getWriteBuffer().currentTcpPose = currentPose;
+        interfaceData.commitWrite();
 
+        if (firstRun)
+        {
+            filtered_position = currentPose.block<3, 1>(0, 3);
+
+            firstRun = false;
+            for (size_t i = 0; i < targets.size(); ++i)
+            {
+                targets.at(i)->velocity = 0;
+            }
+            return;
+        }
+        else
+        {
+            filtered_position = (1 - pos_filter_factor) * filtered_position + pos_filter_factor * currentPose.block<3, 1>(0, 3);
+        }
 
         double deltaT = timeSinceLastIteration.toSecondsDouble();
 
@@ -213,25 +229,27 @@ namespace armarx
         controllerSensorData.getWriteBuffer().currentTime += deltaT;
         controllerSensorData.commitWrite();
 
-        interfaceData.getWriteBuffer().currentTcpPose = currentPose;
-        interfaceData.commitWrite();
+
 
         Eigen::VectorXf targetVel = rtGetControlStruct().targetTSVel;
         Eigen::Matrix4f targetPose = rtGetControlStruct().targetPose;
 
-
-        Eigen::Matrix3f diffMat = targetPose.block<3, 3>(0, 0) * currentPose.block<3, 3>(0, 0).inverse();
-        Eigen::Vector3f errorRPY = VirtualRobot::MathTools::eigen3f2rpy(diffMat);
-
-        if (firstRun)
+        if (started)
         {
-            filtered_position = currentPose.block<3, 1>(0, 3);
-            firstRun = false;
+            targetVel = rtGetControlStruct().targetTSVel;
+            targetPose = rtGetControlStruct().targetPose;
         }
         else
         {
-            filtered_position = (1 - pos_filter_factor) * filtered_position + pos_filter_factor * currentPose.block<3, 1>(0, 3);
+            targetVel.setZero(6);
+            targetPose = currentPose;
         }
+
+        ARMARX_IMPORTANT << "targetPose: " << targetPose;
+
+        Eigen::Matrix3f diffMat = targetPose.block<3, 3>(0, 0) * currentPose.block<3, 3>(0, 0).inverse();
+        Eigen::Vector3f errorRPY = VirtualRobot::MathTools::eigen3f2rpy(diffMat);
+
         Eigen::VectorXf rtTargetVel;
         rtTargetVel.resize(6);
         rtTargetVel.block<3, 1>(0, 0) = KpF * (targetPose.block<3, 1>(0, 3) - filtered_position) + DpF * (targetVel.block<3, 1>(0, 0) - tcptwist.block<3, 1>(0, 0));
@@ -298,17 +316,6 @@ namespace armarx
         for (size_t i = 0; i < tcpController->rns->getSize(); i++)
         {
             jnv(i) += rtGetControlStruct().nullspaceJointVelocities.at(i);
-
-            //            if (torqueSensors.at(i) && gravityTorqueSensors.at(i) && rtGetControlStruct().torqueKp.at(i) != 0)
-            //            {
-            //                torquePIDs.at(i).Kp = rtGetControlStruct().torqueKp.at(i);
-            //                torquePIDs.at(i).Kd = rtGetControlStruct().torqueKd.at(i);
-            //                jnv(i) += torquePIDs.at(i).update(deltaT, torqueSensors.at(i)->torque - gravityTorqueSensors.at(i)->gravityTorque);
-            //            }
-            //            else
-            //            {
-            //                torquePIDs.at(i).lastError = 0;
-            //            }
         }
 
         Eigen::VectorXf jointTargetVelocities = tcpController->calculate(x, jnv, mode);
@@ -325,11 +332,6 @@ namespace armarx
                 targets.at(i)->velocity = 0.0f;
             }
 
-            //            if (qpos(i) > jointHighLimits(i) || qpos(i) < jointLowLimits(i))
-            //            {
-            //                targets.at(i)->velocity = 0;
-            //            }
-
         }
 
 
@@ -345,17 +347,24 @@ namespace armarx
 
     void NJointTSDMPController::setSpeed(Ice::Double times, const Ice::Current&)
     {
-        LockGuardType guard(controllerMutex);
+        LockGuardType guard {controllerMutex};
         taskSpaceDMPController->setSpeed(times);
     }
 
     void NJointTSDMPController::setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&)
     {
-        LockGuardType guard(controllerMutex);
+        LockGuardType guard {controllerMutex};
         ARMARX_INFO << "setting via points ";
         taskSpaceDMPController->setViaPose(u, viapoint);
     }
 
+    void NJointTSDMPController::removeAllViaPoints(const Ice::Current&)
+    {
+        LockGuardType guard {controllerMutex};
+        ARMARX_INFO << "setting via points ";
+        taskSpaceDMPController->removeAllViaPoints();
+    }
+
 
     void NJointTSDMPController::setGoals(const Ice::DoubleSeq& goals, const Ice::Current& ice)
     {
@@ -409,25 +418,47 @@ namespace armarx
         writeControlStruct();
     }
 
+    void NJointTSDMPController::resetDMP(const Ice::Current&)
+    {
+        if (started)
+        {
+            ARMARX_INFO << "Cannot reset running DMP";
+        }
+        firstRun = true;
+    }
+
+    void NJointTSDMPController::stopDMP(const Ice::Current&)
+    {
+        started = false;
+        firstRun = true;
+    }
+
     void NJointTSDMPController::runDMP(const Ice::DoubleSeq&  goals, double tau, const Ice::Current&)
     {
+        firstRun = true;
+        while (firstRun)
+        {
+            usleep(100);
+        }
         while (!interfaceData.updateReadBuffer())
         {
             usleep(100);
         }
 
         Eigen::Matrix4f pose = interfaceData.getReadBuffer().currentTcpPose;
-
+        ARMARX_INFO << "current pose: " << pose;
         //        Eigen::Matrix4f pose = tcp->getPoseInRootFrame();
-        taskSpaceDMPController->prepareExecution(taskSpaceDMPController->eigen4f2vec(pose), goals);
+        LockGuardType guard {controllerMutex};
+        taskSpaceDMPController->prepareExecution(taskSpaceDMPController->eigen4f2vec(pose), goals, tau);
         finished = false;
 
         ARMARX_INFO << "run DMP";
-        controllerTask->start();
-
+        started = true;
     }
 
 
+
+
     void NJointTSDMPController::rtPreActivateController()
     {
     }
@@ -482,7 +513,27 @@ namespace armarx
     void NJointTSDMPController::onInitComponent()
     {
         ARMARX_INFO << "init ...";
+        targetVels.resize(6);
+        NJointTSDMPControllerControlData initData;
+        initData.targetTSVel.resize(6);
+        for (size_t i = 0; i < 6; ++i)
+        {
+            initData.targetTSVel(i) = 0;
+            targetVels(i) = 0;
+            initData.targetPose = tcp->getPoseInRootFrame();
+        }
+        initData.nullspaceJointVelocities.resize(tcpController->rns->getSize(), 0);
+        initData.torqueKp.resize(tcpController->rns->getSize(), 0);
+        initData.torqueKd.resize(tcpController->rns->getSize(), 0);
+        initData.mode = ModeFromIce(cfg->mode);
+        reinitTripleBuffer(initData);
+
+
+
         controllerTask = new PeriodicTask<NJointTSDMPController>(this, &NJointTSDMPController::controllerRun, 0.3);
+        controllerTask->start();
+
+
     }
 
     void NJointTSDMPController::onDisconnectComponent()
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.h
index 498ec423e..e50b9890b 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.h
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.h
@@ -79,6 +79,7 @@ namespace armarx
         void runDMP(const Ice::DoubleSeq& goals, Ice::Double tau, const Ice::Current&) override;
         void setSpeed(Ice::Double times, const Ice::Current&) override;
         void setViaPoints(Ice::Double u, const Ice::DoubleSeq& viapoint, const Ice::Current&) override;
+        void removeAllViaPoints(const Ice::Current&) override;
 
         void setGoals(const Ice::DoubleSeq& goals, const Ice::Current&) override;
 
@@ -86,9 +87,12 @@ namespace armarx
         void setTorqueKp(const StringFloatDictionary& torqueKp, const Ice::Current&) override;
         void setNullspaceJointVelocities(const StringFloatDictionary& nullspaceJointVelocities, const Ice::Current&) override;
 
+
+        void resetDMP(const Ice::Current&) override;
+        void stopDMP(const Ice::Current&) override;
         double getCanVal(const Ice::Current&) override
         {
-            return taskSpaceDMPController->canVal;
+            return taskSpaceDMPController->canVal / cfg->timeDuration;
         }
 
     protected:
@@ -150,6 +154,7 @@ namespace armarx
 
         // dmp parameters
         bool finished;
+        bool started;
 
         VirtualRobot::DifferentialIKPtr ik;
         VirtualRobot::RobotNodePtr tcp;
-- 
GitLab