From efa2917d9dcc6d9437c0bf695e430c0619a496aa Mon Sep 17 00:00:00 2001
From: ArmarX User <armarx@kit.edu>
Date: Wed, 2 Oct 2019 14:12:18 +0200
Subject: [PATCH] add dmp serialization

---
 .../NJointTaskSpaceDMPController.ice          |  3 ++
 .../DMPController/NJointJSDMPController.cpp   |  6 +++-
 .../DMPController/NJointJSDMPController.h     |  1 +
 .../DMPController/NJointTSDMPController.cpp   | 30 ++++++++++++-------
 .../DMPController/NJointTSDMPController.h     |  2 ++
 5 files changed, 31 insertions(+), 11 deletions(-)

diff --git a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
index 5d5a40944..ca8d23856 100644
--- a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
+++ b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice
@@ -98,6 +98,9 @@ module armarx
         void setControllerTarget(float avoidJointLimitsKp, NJointTaskSpaceDMPControllerMode::CartesianSelection mode);
         void setTorqueKp(StringFloatDictionary torqueKp);
         void setNullspaceJointVelocities(StringFloatDictionary nullspaceJointVelocities);
+        string getDMPAsString();
+        void createDMPFromString(string dmpString);
+
     };
 
     class NJointCCDMPControllerConfig extends NJointControllerConfig
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.cpp
index 85746f5c1..510557089 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.cpp
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.cpp
@@ -285,7 +285,6 @@ namespace armarx
                 ARMARX_INFO << "dim name: " << dimNames[i] <<  " current state: qpos: " << currentPos.pos << " orig target: " << goals[i] << " current goal: " << tjv;
             }
 
-
         }
 
         dmpPtr->prepareExecution(goalVec, currentDMPState, 1,  1);
@@ -303,6 +302,11 @@ namespace armarx
     {
     }
 
+    //    std::string NJointJSDMPController::getDMPAsString(const Ice::Current &)
+    //    {
+
+    //    }
+
     void NJointJSDMPController::setSpeed(double times, const Ice::Current&)
     {
         LockGuardType guard(controllerMutex);
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.h
index 9b3e627f6..163a34bcc 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.h
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.h
@@ -52,6 +52,7 @@ namespace armarx
         void runDMP(const Ice::DoubleSeq& goals, double times, const Ice::Current&) override;
 
         void showMessages(const Ice::Current&) override;
+        //        std::string getDMPAsString(const Ice::Current&) override;
 
     protected:
         void rtPreActivateController() override;
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
index e7c02120f..2f1220aa9 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.cpp
@@ -1,4 +1,6 @@
 #include "NJointTSDMPController.h"
+#include <boost/archive/text_oarchive.hpp>
+#include <boost/archive/text_iarchive.hpp>
 
 namespace armarx
 {
@@ -137,9 +139,6 @@ namespace armarx
 
         started = false;
 
-        //        NJointTSDMPControllerInterfaceData initInterfaceData;
-        //        initInterfaceData.currentTcpPose = tcp->getPoseInRootFrame();
-        //        interfaceData.reinitAllBuffers(initInterfaceData);
         RTToUserData initInterfaceData;
         initInterfaceData.currentTcpPose = Eigen::Matrix4f::Identity();
         rt2UserData.reinitAllBuffers(initInterfaceData);
@@ -208,12 +207,9 @@ namespace armarx
 
         debugOutputData.commitWrite();
 
-
         getWriterControlStruct().targetTSVel = targetVels;
         getWriterControlStruct().targetPose = targetPose;
         writeControlStruct();
-
-
     }
 
 
@@ -345,9 +341,6 @@ namespace armarx
 
         rtDebugData.getWriteBuffer().targetJointVels = jointTargetVelocities;
         rtDebugData.commitWrite();
-
-
-
     }
 
 
@@ -357,7 +350,6 @@ namespace armarx
 
         LockGuardType guard {controllerMutex};
         dmpCtrl->learnDMPFromFiles(fileNames);
-
     }
 
     void NJointTSDMPController::setSpeed(Ice::Double times, const Ice::Current&)
@@ -440,6 +432,24 @@ namespace armarx
         firstRun = true;
     }
 
+    string NJointTSDMPController::getDMPAsString(const Ice::Current&)
+    {
+        std::stringstream ss;
+        boost::archive::text_oarchive oa{ss};
+        oa << dmpCtrl->getDMP().get();
+        return ss.str();
+    }
+
+    void NJointTSDMPController::createDMPFromString(const string& dmpString, const Ice::Current&)
+    {
+        std::stringstream ss;
+        ss.str() = dmpString;
+        boost::archive::text_iarchive ia{ss};
+        UMITSMP* dmpPtr;
+        ia >> dmpPtr;
+        dmpCtrl->getDMP().reset(dmpPtr);
+    }
+
     VirtualRobot::IKSolver::CartesianSelection NJointTSDMPController::ModeFromIce(const NJointTaskSpaceDMPControllerMode::CartesianSelection mode)
     {
         if (mode == NJointTaskSpaceDMPControllerMode::CartesianSelection::ePosition)
diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.h
index d69508151..0f09333b6 100644
--- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.h
+++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTSDMPController.h
@@ -100,6 +100,8 @@ namespace armarx
         {
             return dmpCtrl->canVal;
         }
+        std::string getDMPAsString(const Ice::Current&) override;
+        void createDMPFromString(const std::string& dmpString, const Ice::Current&) override;
 
         VirtualRobot::IKSolver::CartesianSelection ModeFromIce(const NJointTaskSpaceDMPControllerMode::CartesianSelection mode);
     protected:
-- 
GitLab