From 1025359e7c6c310a6a3ad199055a27e2ffb48887 Mon Sep 17 00:00:00 2001 From: zhou <you.zhou@kit.edu> Date: Thu, 4 Jun 2020 13:20:55 +0200 Subject: [PATCH] added interface func for changing control parameters in NJointBimanualObjLevelController --- .../NJointBimanualObjLevelController.ice | 9 +- .../NJointBimanualObjLevelController.cpp | 134 +++++++++++++++++- .../NJointBimanualObjLevelController.h | 25 ++++ 3 files changed, 166 insertions(+), 2 deletions(-) diff --git a/source/RobotAPI/interface/units/RobotUnit/NJointBimanualObjLevelController.ice b/source/RobotAPI/interface/units/RobotUnit/NJointBimanualObjLevelController.ice index 2707d344c..9053a1d8a 100644 --- a/source/RobotAPI/interface/units/RobotUnit/NJointBimanualObjLevelController.ice +++ b/source/RobotAPI/interface/units/RobotUnit/NJointBimanualObjLevelController.ice @@ -112,7 +112,14 @@ module armarx void setViaPoints(double u, Ice::DoubleSeq viapoint); double getVirtualTime(); - + void setKpImpedance(Ice::FloatSeq value); + void setKdImpedance(Ice::FloatSeq value); + void setKmAdmittance(Ice::FloatSeq value); + void setKpAdmittance(Ice::FloatSeq value); + void setKdAdmittance(Ice::FloatSeq value); + + Ice::FloatSeq getCurrentObjVel(); + Ice::FloatSeq getCurrentObjForce(); }; diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/BimanualForceControllers/NJointBimanualObjLevelController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/BimanualForceControllers/NJointBimanualObjLevelController.cpp index 02e92853f..1baf81f98 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/BimanualForceControllers/NJointBimanualObjLevelController.cpp +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/BimanualForceControllers/NJointBimanualObjLevelController.cpp @@ -104,6 +104,7 @@ namespace armarx tcpLeft = leftRNS->getTCP(); tcpRight = rightRNS->getTCP(); + //initialize control parameters KpImpedance.setZero(cfg->KpImpedance.size()); ARMARX_CHECK_EQUAL(cfg->KpImpedance.size(), 12); @@ -144,6 +145,15 @@ namespace armarx KmAdmittance(i) = cfg->KmAdmittance.at(i); } + + Inferface2rtData initInt2rtData; + initInt2rtData.KpImpedance = KpImpedance; + initInt2rtData.KdImpedance = KdImpedance; + initInt2rtData.KmAdmittance = KmAdmittance; + initInt2rtData.KpAdmittance = KpAdmittance; + initInt2rtData.KdAdmittance = KdAdmittance; + interface2rtBuffer.reinitAllBuffers(initInt2rtData); + leftDesiredJointValues.resize(leftTargets.size()); ARMARX_CHECK_EQUAL(cfg->leftDesiredJointValues.size(), leftTargets.size()); @@ -191,6 +201,9 @@ namespace armarx ControlInterfaceData initInterfaceData; initInterfaceData.currentLeftPose = tcpLeft->getPoseInRootFrame(); initInterfaceData.currentRightPose = tcpRight->getPoseInRootFrame(); + initInterfaceData.currentObjPose = boxInitialPose; + initInterfaceData.currentObjForce.setZero(); + initInterfaceData.currentObjVel.setZero(); controlInterfaceBuffer.reinitAllBuffers(initInterfaceData); @@ -254,6 +267,10 @@ namespace armarx { targetWrench(i) = cfg->targetWrench[i]; } + + + + } @@ -314,7 +331,6 @@ namespace armarx controlInterfaceBuffer.getWriteBuffer().currentLeftPose = currentLeftPose; controlInterfaceBuffer.getWriteBuffer().currentRightPose = currentRightPose; - controlInterfaceBuffer.commitWrite(); double deltaT = timeSinceLastIteration.toSecondsDouble(); ftcalibrationTimer += deltaT; @@ -342,6 +358,13 @@ namespace armarx ARMARX_INFO << "modified right pose:\n " << rightPose; } + // --------------------------------------------- get control parameters --------------------------------------- + KpImpedance = interface2rtBuffer.getUpToDateReadBuffer().KpImpedance; + KdImpedance = interface2rtBuffer.getUpToDateReadBuffer().KdImpedance; + KmAdmittance = interface2rtBuffer.getUpToDateReadBuffer().KmAdmittance; + KpAdmittance = interface2rtBuffer.getUpToDateReadBuffer().KpAdmittance; + KdAdmittance = interface2rtBuffer.getUpToDateReadBuffer().KdAdmittance; + if (ftcalibrationTimer < cfg->ftCalibrationTime) { ftOffset.block<3, 1>(0, 0) = 0.5 * ftOffset.block<3, 1>(0, 0) + 0.5 * leftForceTorque->force; @@ -453,6 +476,8 @@ namespace armarx rt2ControlBuffer.getWriteBuffer().currentTime += deltaT; rt2ControlBuffer.commitWrite(); + + // --------------------------------------------- get ft sensor --------------------------------------------- // static compensation Eigen::Vector3f gravity; @@ -503,11 +528,20 @@ namespace armarx } } + // pass sensor value to statechart + controlInterfaceBuffer.getWriteBuffer().currentObjPose = boxCurrentPose; + controlInterfaceBuffer.getWriteBuffer().currentObjVel = boxCurrentTwist.head(3); + controlInterfaceBuffer.getWriteBuffer().currentObjForce = objFTValue.head(3); + controlInterfaceBuffer.commitWrite(); + // --------------------------------------------- get MP target --------------------------------------------- Eigen::Matrix4f boxPose = rtGetControlStruct().boxPose; Eigen::VectorXf boxTwist = rtGetControlStruct().boxTwist; + + + // --------------------------------------------- obj admittance control --------------------------------------------- // admittance Eigen::VectorXf objPoseError(6); @@ -746,6 +780,102 @@ namespace armarx } + void NJointBimanualObjLevelController::setKpImpedance(const Ice::FloatSeq& value, const Ice::Current&) + { + Eigen::VectorXf setpoint; + setpoint.setZero(value.size()); + ARMARX_CHECK_EQUAL(value.size(), 12); + + for (size_t i = 0; i < value.size(); ++i) + { + setpoint(i) = value.at(i); + } + + LockGuardType guard {interfaceDataMutex}; + interface2rtBuffer.getWriteBuffer().KpImpedance = setpoint; + interface2rtBuffer.commitWrite(); + + } + + void NJointBimanualObjLevelController::setKdImpedance(const Ice::FloatSeq& value, const Ice::Current&) + { + Eigen::VectorXf setpoint; + setpoint.setZero(value.size()); + ARMARX_CHECK_EQUAL(value.size(), 12); + + for (size_t i = 0; i < value.size(); ++i) + { + setpoint(i) = value.at(i); + } + + LockGuardType guard {interfaceDataMutex}; + interface2rtBuffer.getWriteBuffer().KdImpedance = setpoint; + interface2rtBuffer.commitWrite(); + } + + void NJointBimanualObjLevelController::setKpAdmittance(const Ice::FloatSeq& value, const Ice::Current&) + { + Eigen::VectorXf setpoint; + setpoint.setZero(value.size()); + ARMARX_CHECK_EQUAL(value.size(), 6); + + for (size_t i = 0; i < value.size(); ++i) + { + setpoint(i) = value.at(i); + } + + LockGuardType guard {interfaceDataMutex}; + interface2rtBuffer.getWriteBuffer().KpAdmittance = setpoint; + interface2rtBuffer.commitWrite(); + } + + void NJointBimanualObjLevelController::setKdAdmittance(const Ice::FloatSeq& value, const Ice::Current&) + { + Eigen::VectorXf setpoint; + setpoint.setZero(value.size()); + ARMARX_CHECK_EQUAL(value.size(), 6); + + for (size_t i = 0; i < value.size(); ++i) + { + setpoint(i) = value.at(i); + } + + LockGuardType guard {interfaceDataMutex}; + interface2rtBuffer.getWriteBuffer().KdAdmittance = setpoint; + interface2rtBuffer.commitWrite(); + } + + std::vector<float> NJointBimanualObjLevelController::getCurrentObjVel(const Ice::Current&) + { + Eigen::Vector3f tvel = controlInterfaceBuffer.getUpToDateReadBuffer().currentObjVel; + std::vector<float> tvelvec = {tvel(0), tvel(1), tvel(2)}; + return tvelvec; + } + + std::vector<float> NJointBimanualObjLevelController::getCurrentObjForce(const Ice::Current&) + { + Eigen::Vector3f fvel = controlInterfaceBuffer.getUpToDateReadBuffer().currentObjForce; + std::vector<float> fvelvec = {fvel(0), fvel(1), fvel(2)}; + return fvelvec; + } + + void NJointBimanualObjLevelController::setKmAdmittance(const Ice::FloatSeq& value, const Ice::Current&) + { + Eigen::VectorXf setpoint; + setpoint.setZero(value.size()); + ARMARX_CHECK_EQUAL(value.size(), 6); + + for (size_t i = 0; i < value.size(); ++i) + { + setpoint(i) = value.at(i); + } + + LockGuardType guard {interfaceDataMutex}; + interface2rtBuffer.getWriteBuffer().KmAdmittance = setpoint; + interface2rtBuffer.commitWrite(); + } + + void NJointBimanualObjLevelController::onPublish(const SensorAndControl&, const DebugDrawerInterfacePrx&, const DebugObserverInterfacePrx& debugObs) { @@ -890,6 +1020,8 @@ namespace armarx void NJointBimanualObjLevelController::onInitNJointController() { + + ARMARX_INFO << "init ..."; runTask("NJointBimanualObjLevelController", [&] { diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/BimanualForceControllers/NJointBimanualObjLevelController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/BimanualForceControllers/NJointBimanualObjLevelController.h index 7f1c10d71..8cf7c3d2c 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/BimanualForceControllers/NJointBimanualObjLevelController.h +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/BimanualForceControllers/NJointBimanualObjLevelController.h @@ -75,6 +75,15 @@ namespace armarx return virtualtimer; } + void setKpImpedance(const Ice::FloatSeq& value, const Ice::Current&); + void setKdImpedance(const Ice::FloatSeq& value, const Ice::Current&); + void setKmAdmittance(const Ice::FloatSeq& value, const Ice::Current&); + void setKpAdmittance(const Ice::FloatSeq& value, const Ice::Current&); + void setKdAdmittance(const Ice::FloatSeq& value, const Ice::Current&); + + std::vector<float> getCurrentObjVel(const Ice::Current&); + std::vector<float> getCurrentObjForce(const Ice::Current&); + protected: virtual void onPublish(const SensorAndControl&, const DebugDrawerInterfacePrx&, const DebugObserverInterfacePrx&); @@ -175,10 +184,25 @@ namespace armarx { Eigen::Matrix4f currentLeftPose; Eigen::Matrix4f currentRightPose; + Eigen::Matrix4f currentObjPose; + Eigen::Vector3f currentObjVel; + Eigen::Vector3f currentObjForce; }; TripleBuffer<ControlInterfaceData> controlInterfaceBuffer; + struct Inferface2rtData + { + Eigen::VectorXf KpImpedance; + Eigen::VectorXf KdImpedance; + Eigen::VectorXf KmAdmittance; + Eigen::VectorXf KpAdmittance; + Eigen::VectorXf KdAdmittance; + }; + TripleBuffer<Inferface2rtData> interface2rtBuffer; + + + std::vector<ControlTarget1DoFActuatorTorque*> leftTargets; std::vector<const SensorValue1DoFActuatorAcceleration*> leftAccelerationSensors; std::vector<const SensorValue1DoFActuatorVelocity*> leftVelocitySensors; @@ -203,6 +227,7 @@ namespace armarx double virtualtimer; mutable MutexType controllerMutex; + mutable MutexType interfaceDataMutex; Eigen::VectorXf leftDesiredJointValues; Eigen::VectorXf rightDesiredJointValues; -- GitLab