diff --git a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice index d39e94c87ce0ea5d5ed5b21e252d31f1e2ca41f9..b00a86caf56aec6a6e3f6c59e734ded8aea893b8 100644 --- a/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice +++ b/source/RobotAPI/interface/units/RobotUnit/NJointTaskSpaceDMPController.ice @@ -345,10 +345,12 @@ module armarx void setMPWeights(DoubleSeqSeq weights); DoubleSeqSeq getMPWeights(); - void setLinearVelocityKd(Ice::FloatSeq kd); - void setLinearVelocityKp(Ice::FloatSeq kp); - void setAngularVelocityKd(Ice::FloatSeq kd); - void setAngularVelocityKp(Ice::FloatSeq kp); + void setLinearVelocityKd(Eigen::Vector3f kd); + void setLinearVelocityKp(Eigen::Vector3f kp); + void setAngularVelocityKd(Eigen::Vector3f kd); + void setAngularVelocityKp(Eigen::Vector3f kp); + void setNullspaceVelocityKd(Eigen::VectorXf jointValues); + void setNullspaceVelocityKp(Eigen::VectorXf jointValues); }; diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp index 6bd72fd26162491f6128f3fddce78b7eced8c1f3..762d3f240eb99b6f37b4ecf7d47b63a55e7932f0 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp @@ -84,22 +84,21 @@ namespace armarx Eigen::Vector3f dpos(cfg->Dpos[0], cfg->Dpos[1], cfg->Dpos[2]); Eigen::Vector3f kori(cfg->Kori[0], cfg->Kori[1], cfg->Kori[2]); Eigen::Vector3f dori(cfg->Dori[0], cfg->Dori[1], cfg->Dori[2]); - - CtrlParams initParams = {kpos, dpos, kori, dori}; - ctrlParams.reinitAllBuffers(initParams); + Eigen::VectorXf knull(targets.size()); + Eigen::VectorXf dnull(targets.size()); ARMARX_CHECK_EQUAL(cfg->Knull.size(), targets.size()); ARMARX_CHECK_EQUAL(cfg->Dnull.size(), targets.size()); - knull.setZero(targets.size()); - dnull.setZero(targets.size()); - for (size_t i = 0; i < targets.size(); ++i) { knull(i) = cfg->Knull.at(i); dnull(i) = cfg->Dnull.at(i); } + CtrlParams initParams = {kpos, dpos, kori, dori, knull, dnull}; + ctrlParams.reinitAllBuffers(initParams); + torqueLimit = cfg->torqueLimit; timeDuration = cfg->timeDuration; @@ -284,6 +283,8 @@ namespace armarx Eigen::Vector3f dpos = ctrlParams.getUpToDateReadBuffer().dpos; Eigen::Vector3f kori = ctrlParams.getUpToDateReadBuffer().kori; Eigen::Vector3f dori = ctrlParams.getUpToDateReadBuffer().dori; + Eigen::Vector3f knull = ctrlParams.getUpToDateReadBuffer().knull; + Eigen::Vector3f dnull = ctrlParams.getUpToDateReadBuffer().dnull; Eigen::Vector6f jointControlWrench; { @@ -375,6 +376,26 @@ namespace armarx debugOutputData.getWriteBuffer().currentPose_qz = currentQuat.z; debugOutputData.getWriteBuffer().deltaT = deltaT; + debugOutputData.getWriteBuffer().currentKpos_x = kpos.x(); + debugOutputData.getWriteBuffer().currentKpos_y = kpos.y(); + debugOutputData.getWriteBuffer().currentKpos_z = kpos.z(); + debugOutputData.getWriteBuffer().currentKori_x = kori.x(); + debugOutputData.getWriteBuffer().currentKori_y = kori.y(); + debugOutputData.getWriteBuffer().currentKori_z = kori.z(); + debugOutputData.getWriteBuffer().currentKnull_x = knull.x(); + debugOutputData.getWriteBuffer().currentKnull_y = knull.y(); + debugOutputData.getWriteBuffer().currentKnull_z = knull.z(); + + debugOutputData.getWriteBuffer().currentDpos_x = dpos.x(); + debugOutputData.getWriteBuffer().currentDpos_y = dpos.y(); + debugOutputData.getWriteBuffer().currentDpos_z = dpos.z(); + debugOutputData.getWriteBuffer().currentDori_x = dori.x(); + debugOutputData.getWriteBuffer().currentDori_y = dori.y(); + debugOutputData.getWriteBuffer().currentDori_z = dori.z(); + debugOutputData.getWriteBuffer().currentDnull_x = dnull.x(); + debugOutputData.getWriteBuffer().currentDnull_y = dnull.y(); + debugOutputData.getWriteBuffer().currentDnull_z = dnull.z(); + debugOutputData.commitWrite(); } @@ -548,6 +569,26 @@ namespace armarx datafields["currentPose_qy"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentPose_qy); datafields["currentPose_qz"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentPose_qz); + datafields["currentKpos_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKpos_x); + datafields["currentKpos_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKpos_y); + datafields["currentKpos_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKpos_z); + datafields["currentKori_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKori_x); + datafields["currentKori_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKori_y); + datafields["currentKori_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKori_z); + datafields["currentKnull_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKnull_x); + datafields["currentKnull_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKnull_y); + datafields["currentKnull_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentKnull_z); + + datafields["currentDpos_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDpos_x); + datafields["currentDpos_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDpos_y); + datafields["currentDpos_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDpos_z); + datafields["currentDori_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDori_x); + datafields["currentDori_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDori_y); + datafields["currentDori_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDori_z); + datafields["currentDnull_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDnull_x); + datafields["currentDnull_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDnull_y); + datafields["currentDnull_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().currentDnull_z); + datafields["forceDesired_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().forceDesired_x); datafields["forceDesired_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().forceDesired_y); datafields["forceDesired_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().forceDesired_z); @@ -614,42 +655,64 @@ namespace armarx dmpCtrl->removeAllViaPoints(); } - void NJointTaskSpaceImpedanceDMPController::setLinearVelocityKd(const Ice::FloatSeq& kd, const Ice::Current&) + void NJointTaskSpaceImpedanceDMPController::setLinearVelocityKd(const Eigen::Vector3f& kd, const Ice::Current&) { ARMARX_CHECK_EQUAL(kd.size(), 3); + ARMARX_INFO << "set linear kd " << VAROUT(kd); LockGuardType guard(controllerMutex); - ctrlParams.getWriteBuffer().dpos << kd[0], kd[1], kd[2]; + ctrlParams.getWriteBuffer().dpos = kd; ctrlParams.commitWrite(); } - void NJointTaskSpaceImpedanceDMPController::setLinearVelocityKp(const Ice::FloatSeq& kp, const Ice::Current&) + void NJointTaskSpaceImpedanceDMPController::setLinearVelocityKp(const Eigen::Vector3f& kp, const Ice::Current&) { ARMARX_CHECK_EQUAL(kp.size(), 3); + ARMARX_INFO << "set linear kp " << VAROUT(kp); LockGuardType guard(controllerMutex); - ctrlParams.getWriteBuffer().kpos << kp[0], kp[1], kp[2]; + ctrlParams.getWriteBuffer().kpos = kp; ctrlParams.commitWrite(); } - void NJointTaskSpaceImpedanceDMPController::setAngularVelocityKd(const Ice::FloatSeq& kd, const Ice::Current&) + void NJointTaskSpaceImpedanceDMPController::setAngularVelocityKd(const Eigen::Vector3f& kd, const Ice::Current&) { ARMARX_CHECK_EQUAL(kd.size(), 3); + ARMARX_INFO << "set angular kd " << VAROUT(kd); LockGuardType guard(controllerMutex); - ctrlParams.getWriteBuffer().dori << kd[0], kd[1], kd[2]; + ctrlParams.getWriteBuffer().dori = kd; ctrlParams.commitWrite(); - } - void NJointTaskSpaceImpedanceDMPController::setAngularVelocityKp(const Ice::FloatSeq& kp, const Ice::Current&) + void NJointTaskSpaceImpedanceDMPController::setAngularVelocityKp(const Eigen::Vector3f& kp, const Ice::Current&) { ARMARX_CHECK_EQUAL(kp.size(), 3); + ARMARX_INFO << "set angular kp " << VAROUT(kp); LockGuardType guard(controllerMutex); - ctrlParams.getWriteBuffer().kori << kp[0], kp[1], kp[2]; + ctrlParams.getWriteBuffer().kori = kp; ctrlParams.commitWrite(); } + void NJointTaskSpaceImpedanceDMPController::setNullspaceVelocityKd(const Eigen::VectorXf& kd, const Ice::Current&) + { + ARMARX_CHECK_EQUAL(kd.size(), targets.size()); + ARMARX_INFO << "set nullspace kd " << VAROUT(kd); + LockGuardType guard(controllerMutex); + ctrlParams.getWriteBuffer().dnull = kd; + ctrlParams.commitWrite(); + } + + void NJointTaskSpaceImpedanceDMPController::setNullspaceVelocityKp(const Eigen::VectorXf& kp, const Ice::Current&) + { + ARMARX_CHECK_EQUAL(kp.size(), targets.size()); + ARMARX_INFO << "set linear kp " << VAROUT(kp); + LockGuardType guard(controllerMutex); + ctrlParams.getWriteBuffer().knull = kp; + ctrlParams.commitWrite(); + } + + void NJointTaskSpaceImpedanceDMPController::setDefaultNullSpaceJointValues(const Eigen::VectorXf& jointValues, const Ice::Current&) { diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h index ea8cef187de6296e07eeb270e4ca5ac2ad7b78f6..9ded363e9e110bf803ada28b5523057b69b3bd4f 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h @@ -76,10 +76,12 @@ namespace armarx void removeAllViaPoints(const Ice::Current&) override; - void setLinearVelocityKd(const Ice::FloatSeq& kd, const Ice::Current&) override; - void setLinearVelocityKp(const Ice::FloatSeq& kp, const Ice::Current&) override; - void setAngularVelocityKd(const Ice::FloatSeq& kd, const Ice::Current&) override; - void setAngularVelocityKp(const Ice::FloatSeq& kp, const Ice::Current&) override; + void setLinearVelocityKd(const Eigen::Vector3f& kd, const Ice::Current&) override; + void setLinearVelocityKp(const Eigen::Vector3f& kp, const Ice::Current&) override; + void setAngularVelocityKd(const Eigen::Vector3f& kd, const Ice::Current&) override; + void setAngularVelocityKp(const Eigen::Vector3f& kp, const Ice::Current&) override; + void setNullspaceVelocityKd(const Eigen::VectorXf& kd, const Ice::Current&) override; + void setNullspaceVelocityKp(const Eigen::VectorXf& kp, const Ice::Current&) override; void setUseNullSpaceJointDMP(bool enable, const Ice::Current&) override; void setDefaultNullSpaceJointValues(const Eigen::VectorXf& jointValues, const Ice::Current&) override; @@ -112,6 +114,26 @@ namespace armarx float currentPose_qy; float currentPose_qz; + float currentKpos_x; + float currentKpos_y; + float currentKpos_z; + float currentKori_x; + float currentKori_y; + float currentKori_z; + float currentKnull_x; + float currentKnull_y; + float currentKnull_z; + + float currentDpos_x; + float currentDpos_y; + float currentDpos_z; + float currentDori_x; + float currentDori_y; + float currentDori_z; + float currentDnull_x; + float currentDnull_y; + float currentDnull_z; + StringFloatDictionary desired_torques; StringFloatDictionary desired_nullspaceJoint; float forceDesired_x; @@ -123,9 +145,11 @@ namespace armarx float deltaT; + + }; - TripleBuffer<DebugBufferData> debugOutputData; + WriteBufferedTripleBuffer<DebugBufferData> debugOutputData; struct NJointTaskSpaceImpedanceDMPControllerSensorData { @@ -134,14 +158,14 @@ namespace armarx Eigen::Matrix4f currentPose; Eigen::VectorXf currentTwist; }; - TripleBuffer<NJointTaskSpaceImpedanceDMPControllerSensorData> controllerSensorData; + WriteBufferedTripleBuffer<NJointTaskSpaceImpedanceDMPControllerSensorData> controllerSensorData; struct NJointTaskSpaceImpedanceDMPControllerInterfaceData { Eigen::Matrix4f currentTcpPose; }; - TripleBuffer<NJointTaskSpaceImpedanceDMPControllerInterfaceData> interfaceData; + WriteBufferedTripleBuffer<NJointTaskSpaceImpedanceDMPControllerInterfaceData> interfaceData; struct CtrlParams { @@ -149,9 +173,11 @@ namespace armarx Eigen::Vector3f dpos; Eigen::Vector3f kori; Eigen::Vector3f dori; + Eigen::VectorXf knull; + Eigen::VectorXf dnull; }; - TripleBuffer<CtrlParams> ctrlParams; + WriteBufferedTripleBuffer<CtrlParams> ctrlParams; DMP::Vec<DMP::DMPState> currentJointState; @@ -188,15 +214,15 @@ namespace armarx // Eigen::Vector3f kori; // Eigen::Vector3f dpos; // Eigen::Vector3f dori; - Eigen::VectorXf knull; - Eigen::VectorXf dnull; + // Eigen::VectorXf knull; + // Eigen::VectorXf dnull; int numOfJoints; std::atomic_bool useNullSpaceJointDMP; bool isNullSpaceJointDMPLearned; - armarx::TripleBuffer<Eigen::VectorXf> defaultNullSpaceJointValues; + WriteBufferedTripleBuffer<Eigen::VectorXf> defaultNullSpaceJointValues; std::vector<std::string> jointNames; mutable MutexType controllerMutex; PeriodicTask<NJointTaskSpaceImpedanceDMPController>::pointer_type controllerTask;