diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.cpp index 34c384badfbc7b1a56d372a4216a84b40aedffcd..460e20be4a2c0e04069fe1f1522ba40cf60f064c 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.cpp +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.cpp @@ -68,6 +68,7 @@ namespace armarx phaseKpOri = cfg->phaseKpOri; posToOriRatio = cfg->posToOriRatio; + tau = cfg->tau; // initialize tcp position and orientation Eigen::Matrix4f pose = tcp->getPoseInRootFrame(); @@ -100,6 +101,8 @@ namespace armarx initData.torqueKd.resize(tcpController->rns->getSize(), 0); initData.mode = ModeFromIce(cfg->mode); reinitTripleBuffer(initData); + + learnedDMP.clear(); } std::string NJointCCDMPController::getClassName(const Ice::Current&) const @@ -113,7 +116,9 @@ namespace armarx { return; } + double deltaT = controllerSensorData.getReadBuffer().deltaT; + Eigen::Matrix4f currentPose = controllerSensorData.getReadBuffer().currentPose; Eigen::Vector3f currentPosition; currentPosition << currentPose(0, 3), currentPose(1, 3), currentPose(2, 3); @@ -277,14 +282,12 @@ namespace armarx void NJointCCDMPController::rtRun(const IceUtil::Time& sensorValuesTimestamp, const IceUtil::Time& timeSinceLastIteration) { - double deltaT = sensorValuesTimestamp.toSecondsDouble(); + double deltaT = timeSinceLastIteration.toSecondsDouble(); controllerSensorData.getWriteBuffer().currentPose = tcp->getPoseInRootFrame(); controllerSensorData.getWriteBuffer().deltaT = deltaT; controllerSensorData.getWriteBuffer().currentTime += deltaT; controllerSensorData.commitWrite(); - - // cartesian vel controller Eigen::VectorXf x; auto mode = rtGetControlStruct().mode; @@ -430,6 +433,8 @@ namespace armarx dmpPtrList[dmpId]->prepareExecution(goals, currentState, 1, tau); dmpPtrList[dmpId]->setTemporalFactor(tau); + + learnedDMP.push_back(dmpId); ARMARX_INFO << "Learned DMP ... "; } @@ -498,7 +503,16 @@ namespace armarx finished = false; - + if (dmpTypes.size() != cfg->dmpNum || + dmpPtrList.size() != cfg->dmpNum || + learnedDMP.size() != cfg->dmpNum || + canVals.size() != cfg->dmpNum || + currentStates.size() != cfg->dmpNum || + targetSubStates.size() != cfg->dmpNum) + { + ARMARX_ERROR << "Error: cannot run CCDMP controller. The reason is that some parameters have different sizes"; + return; + } ARMARX_INFO << "run DMP"; controllerTask->start(); diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.h index 80ecfc3a8b1783a7066895b6d26f7e8321760185..2247c56390202d995283df7edac40918f38f6378 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.h +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointCCDMPController.h @@ -148,6 +148,7 @@ namespace armarx std::vector<float> targetVels; + std::vector<int> learnedDMP; NJointCCDMPControllerConfigPtr cfg; VirtualRobot::RobotNodePtr tcp; Eigen::Vector3f tcpPosition; diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.cpp index 6837a99be3afdb55d7f08b7ab6c0ea8aac75bc2c..bcf0d7893db6d82964c70cd456f85a2803e4f2b7 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.cpp +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointJSDMPController.cpp @@ -63,10 +63,16 @@ namespace armarx void NJointJSDMPController::controllerRun() { + if (!controllerSensorData.updateReadBuffer()) + { + return; + } + + currentState = controllerSensorData.getUpToDateReadBuffer().currentState; + double deltaT = controllerSensorData.getUpToDateReadBuffer().deltaT; if (canVal > 1e-8) { - currentState = controllerSensorData.getUpToDateReadBuffer().currentState; - double deltaT = controllerSensorData.getUpToDateReadBuffer().deltaT; + double phaseStop = 0; double error = 0; std::vector<double> currentPosition;