From 1df18ff589b37131769de68bb649befedede78c5 Mon Sep 17 00:00:00 2001 From: ArmarX User <armarx@kit.edu> Date: Wed, 28 Aug 2019 17:25:32 +0200 Subject: [PATCH] fix kitgripper joint controllers after merge --- .../KITGripperEtherCAT/CMakeLists.txt | 2 + ...JointKITGripperEmergencyStopController.cpp | 2 +- .../JointPWMPositionController.cpp | 64 ++++++++++--------- .../JointPWMPositionController.h | 1 + .../JointPWMVelocityController.cpp | 2 +- .../KITGripperBasisBoard.cpp | 1 + .../KITGripperBasisBoardData.cpp | 5 +- .../KITGripperBasisBoardData.h | 11 +--- 8 files changed, 45 insertions(+), 43 deletions(-) diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/CMakeLists.txt b/source/RobotAPI/libraries/KITGripperEtherCAT/CMakeLists.txt index ce5236543..425e679db 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/CMakeLists.txt +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/CMakeLists.txt @@ -58,6 +58,7 @@ set(LIB_FILES KITGripperBasisBoard/JointController/JointPWMTorqueController.cpp KITGripperBasisBoard/JointController/JointKITGripperEmergencyStopController.cpp KITGripperBasisBoard/JointController/JointKITGripperStopMovementController.cpp + KITGripperBasisBoard/JointController/JointKITGripperPWMPassThroughController.cpp KITGripperBasisBoard/JointController/PWMVelocityController.cpp KITGripperBasisBoard/JointController/JointZeroTorqueController.cpp KITGripperBasisBoard/JointController/ParallelGripperPositionController.cpp @@ -74,6 +75,7 @@ set(LIB_HEADERS KITGripperBasisBoard/JointController/JointPWMVelocityController.h KITGripperBasisBoard/JointController/JointPWMPositionController.h KITGripperBasisBoard/JointController/JointPWMTorqueController.h + KITGripperBasisBoard/JointController/JointKITGripperPWMPassThroughController.h KITGripperBasisBoard/JointController/JointKITGripperEmergencyStopController.h KITGripperBasisBoard/JointController/JointKITGripperStopMovementController.h KITGripperBasisBoard/JointController/PWMVelocityController.h diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointKITGripperEmergencyStopController.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointKITGripperEmergencyStopController.cpp index 3bbf673c0..83a7a9855 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointKITGripperEmergencyStopController.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointKITGripperEmergencyStopController.cpp @@ -18,7 +18,7 @@ namespace armarx targetPwm = 0.0f; } // dataPtr->setTargetPWM(targetPwm); - lastPWM *= 0.9997; + lastPWM *= 0.0; // ARMARX_RT_LOGF_INFO("old pwm %d, new pwm: %.2f", dataPtr->getTargetPWM(), lastPWM); dataPtr->setTargetPWM(lastPWM); diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMPositionController.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMPositionController.cpp index e4bf73b8c..cf2a124f5 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMPositionController.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMPositionController.cpp @@ -34,14 +34,14 @@ JointPWMPositionController::JointPWMPositionController(const std::string deviceN // add limitless joint controller to solve the flipping sensor value problem limitlessController.positionPeriodLo = dataPtr->getSoftLimitLo(); limitlessController.positionPeriodHi = dataPtr->getSoftLimitHi(); - limitlessController.maxDt = velocityControllerConfigDataPtr->maxDt; - limitlessController.maxV = velocityControllerConfigDataPtr->maxVelocityRad; - limitlessController.p = velocityControllerConfigDataPtr->posControlP; + limitlessController.maxDt = positionControllerConfigDataPtr->maxDt; + limitlessController.maxV = positionControllerConfigDataPtr->maxVelocityRad; + limitlessController.pid->Kp = positionControllerConfigDataPtr->posControlP; // ARMARX_INFO << deviceName << " pos P: " << limitlessController.p; // limitlessController.p = 10.0f; // for bit joint // limitlessController.p = 3.0f; // for base joint - limitlessController.acceleration = velocityControllerConfigDataPtr->maxAccelerationRad; - limitlessController.deceleration = velocityControllerConfigDataPtr->maxDecelerationRad; + limitlessController.acceleration = positionControllerConfigDataPtr->maxAccelerationRad; + limitlessController.deceleration = positionControllerConfigDataPtr->maxDecelerationRad; limitlessController.accuracy = 0.001f; // ARMARX_INFO << "period low: " << limitlessController.positionPeriodLo << ", period high: " << limitlessController.positionPeriodHi; // ARMARX_INFO << "maxDt: " << limitlessController.maxDt << ", maxV: " << limitlessController.maxV; @@ -96,30 +96,32 @@ void JointPWMPositionController::rtRun(const IceUtil::Time& sensorValuesTimestam newVel = limitlessController.run(); // ARMARX_IMPORTANT << "using limitless position controller"; // ARMARX_RT_LOGF_WARNING("Position controller not implemented for limitless joints").deactivateSpam(10); + if (std::isnan(newVel)) + { + newVel = 0; + } + newVel = math::MathUtils::LimitTo(newVel, posController.maxV); + pidPosController->update(timeSinceLastIteration.toSecondsDouble(), dataPtr->getVelocity(), newVel); } else { // posController.currentPosition = currentPosition; - posController.currentV = lastTargetVelocity; - posController.dt = timeSinceLastIteration.toSecondsDouble(); - posController.setTargetPosition(target.position); - // ARMARX_CHECK_EXPRESSION(posController.validParameters()); - auto r = posController.run(); - posController.currentPosition = r.position; - posController.currentAcc = r.acceleration; - newVel = r.velocity; - } + posController.currentV = lastTargetVelocity; + posController.dt = timeSinceLastIteration.toSecondsDouble(); + posController.setTargetPosition(target.position); + // ARMARX_CHECK_EXPRESSION(posController.validParameters()); + auto r = posController.run(); + posController.currentPosition = r.position; + posController.currentAcc = r.acceleration; + newVel = r.velocity; + pidPosController->update(timeSinceLastIteration.toSecondsDouble(), currentPosition, r.position); + } // double newVel = posController.p * (posController.targetPosition - posController.currentPosition); // newVel = math::MathUtils::LimitTo(newVel, posController.maxV); // ARMARX_INFO << deactivateSpam(1) << VAROUT(newVel); - if (std::isnan(newVel)) - { - newVel = 0; - } - pidPosController->update(timeSinceLastIteration.toSecondsDouble(), currentPosition, r.position); + auto targetPWM = pidPosController->getControlValue(); // auto targetPWM = static_cast<int>(controller.run(timeSinceLastIteration, dataPtr->getVelocity(), newVel)); - newVel = math::MathUtils::LimitTo(newVel, posController.maxV); float torqueFF = config->feedforwardTorqueToPWMFactor * -sensorValue->gravityTorque; targetPWM += torqueFF; @@ -134,18 +136,19 @@ void JointPWMPositionController::rtRun(const IceUtil::Time& sensorValuesTimestam ARMARX_ERROR << deactivateSpam(1) << "Target PWM of " << getParent().getDeviceName() << " is NaN!"; targetPWM = 0.0f; } - float updateRatio = 0.3; - this->targetPWM = (1.0 - updateRatio) * this->targetPWM + updateRatio * targetPWM; - float pwmDiff = std::abs(dataPtr->getTargetPWM() - targetPWM); - // ARMARX_INFO << deactivateSpam(0.3) << VAROUT(pwmDiff) << VAROUT(dataPtr->getTargetPWM()) << VAROUT(targetPWM) << VAROUT(dataPtr->getVelocity()); - if (pwmDiff > 5 || dataPtr->getVelocity() > 0.01) // avoid jittering when standing still - { - // ARMARX_INFO << deactivateSpam(0.0, std::to_string(targetPWM)) << "Setting new targetPWM to" << targetPWM << " diff: " << pwmDiff << " vel: " << dataPtr->getVelocity(); - dataPtr->setTargetPWM(targetPWM); - } + // float updateRatio = 0.3; + // this->targetPWM = (1.0 - updateRatio) * this->targetPWM + updateRatio * targetPWM; + // float pwmDiff = std::abs(dataPtr->getTargetPWM() - targetPWM); + // // ARMARX_INFO << deactivateSpam(0.3) << VAROUT(pwmDiff) << VAROUT(dataPtr->getTargetPWM()) << VAROUT(targetPWM) << VAROUT(dataPtr->getVelocity()); + // if (pwmDiff > 5 || dataPtr->getVelocity() > 0.01) // avoid jittering when standing still + // { + // // ARMARX_INFO << deactivateSpam(0.0, std::to_string(targetPWM)) << "Setting new targetPWM to" << targetPWM << " diff: " << pwmDiff << " vel: " << dataPtr->getVelocity(); + // dataPtr->setTargetPWM(targetPWM); + // } this->targetPWM = targetPWM; lastTargetVelocity = newVel; + dataPtr->setTargetPWM(targetPWM); // auto name = getParent().getDeviceName().c_str(); // ARMARX_RT_LOGF_INFO("%s: position: %.f, target position: %.f, targetvelocity: %.f, target PWM: %d", name, // currentPosition, targetPosition, newVel, targetPWM).deactivateSpam(1); @@ -168,10 +171,12 @@ void JointPWMPositionController::rtPreActivateController() { targetPWM = 0.0f; lastTargetVelocity = dataPtr->getVelocity(); + posController.reset(); posController.currentAcc = dataPtr->getAcceleration(); posController.currentPosition = dataPtr->getPosition(); posController.currentV = dataPtr->getVelocity(); pidPosController->reset(); + // controller.reset(dataPtr->getVelocity()); } @@ -328,6 +333,7 @@ PWMPositionControllerConfigurationCPtr PWMPositionControllerConfiguration::Creat configData.maxAccelerationRad = node.first_node("maxAccelerationRad").value_as_float(); configData.maxDecelerationRad = node.first_node("maxDecelerationRad").value_as_float(); configData.maxDt = node.first_node("maxDt").value_as_float(); + configData.posControlP = node.first_node("posControlP").value_as_float(); configData.p = node.first_node("p").value_as_float(); configData.i = node.first_node("i").value_as_float(); configData.d = node.first_node("d").value_as_float(); diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMPositionController.h b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMPositionController.h index d409d5769..cf20557db 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMPositionController.h +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMPositionController.h @@ -32,6 +32,7 @@ namespace armarx float maxAccelerationRad; float maxDecelerationRad; float maxDt; + float posControlP; float p; float i; float d; diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMVelocityController.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMVelocityController.cpp index 67da10653..019649a88 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMVelocityController.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/JointPWMVelocityController.cpp @@ -30,7 +30,7 @@ JointPWMVelocityController::JointPWMVelocityController(const std::string deviceN // velController.acceleration = velocityControllerConfigDataPtr->maxAccelerationRad; velController.deceleration = velocityControllerConfigDataPtr->maxDecelerationRad; - velController.jerk = 30; + velController.jerk = 10; velController.maxDt = velocityControllerConfigDataPtr->maxDt; velController.maxV = velocityControllerConfigDataPtr->maxVelocityRad; velController.directSetVLimit = velocityControllerConfigDataPtr->directSetVLimit; diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoard.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoard.cpp index 834674e21..4da369637 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoard.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoard.cpp @@ -323,3 +323,4 @@ namespace armarx + diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.cpp index 8f85a09ff..4f29f113f 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.cpp @@ -125,7 +125,6 @@ namespace armarx } ActorData& d = *ptr; - d.relativePosition.read(); if (d.getSiblingControlActorIndex() >= 0) // if >=0 (0, 1, 2), device is coupled with another motor @@ -209,6 +208,8 @@ namespace armarx d.absoluteEncoderVelocity = math::MathUtils::AngleDelta(d.lastAbsolutePosition, d.sanitizedAbsolutePosition) / timeSinceLastIteration.toSecondsDouble(); } d.lastAbsolutePosition = d.sanitizedAbsolutePosition; + float oldVelocity = d.velocity.value; + if (d.getUseABSEncoderForVelocity() >= 0) { d.velocity.value = d.absoluteEncoderVelocity; @@ -281,7 +282,7 @@ namespace armarx } ActorData::ActorData(int32_t filterWindowSize): - velocityFilter(filterWindowSize){} + velocityFilter(filterWindowSize) {} int8_t KITGripperBasisBoardData::getIMUTemperature() const { diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.h b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.h index 31dd7c18f..c308bf68c 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.h +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.h @@ -38,10 +38,7 @@ namespace armarx { public: DETAIL_SensorValueBase_DEFAULT_METHOD_IMPLEMENTATION - int IMUTemperature; - - static SensorValueInfo<SensorValueKITGripperBasisBoard> GetClassMemberInfo() { SensorValueInfo<SensorValueKITGripperBasisBoard> svi; @@ -72,7 +69,6 @@ namespace armarx float absoluteEncoderVelocity; int32_t maxPWM; int32_t minPWM; - float torque; float torqueWithInertia; float rawVelocity; float filteredVelocity; @@ -88,7 +84,6 @@ namespace armarx svi.addMemberVariable(&KITGripperActorSensorData::minPWM, "minPWM"); svi.addMemberVariable(&KITGripperActorSensorData::velocityTicksPerMs, "velocityTicksPerMs"); svi.addMemberVariable(&KITGripperActorSensorData::absoluteEncoderVelocity, "absoluteEncoderVelocity"); - svi.addMemberVariable(&KITGripperActorSensorData::torque, "torque"); svi.addMemberVariable(&KITGripperActorSensorData::torqueWithInertia, "torqueWithInertia"); svi.addMemberVariable(&KITGripperActorSensorData::rawVelocity, "rawVelocity"); svi.addMemberVariable(&KITGripperActorSensorData::filteredVelocity, "filteredVelocity"); @@ -102,11 +97,10 @@ namespace armarx { public: ActorData(); - void setTargetPWM(int32_t targetPWM); + ActorData(int32_t filterWindowSize); float getPosition() const; float getRelativePosition() const; float getCompensatedRelativePosition() const; - float getVelocity() const; float getAcceleration() const; int32_t getRelativePositionSensorOnly() const; bool getPositionControlEnabled() const; @@ -142,9 +136,7 @@ namespace armarx int32_t getSiblingControlActorIndex() const; float getParallelGripperDecouplingFactor() const; - float getParallelGripperDecouplingFactor() const; - float getAbsoluteEncoderVelocity() const; private: // parallel gripper controller configuration @@ -157,7 +149,6 @@ namespace armarx LinearConvertedValue<int32_t> relativePosition; float adjustedRelativePosition; float relativePositionOffset = std::nan(""); - float parallelGripperDecouplingFactor = std::nanf(""); LinearConvertedValue<u_int32_t> position; float sanitizedAbsolutePosition; float lastAbsolutePosition = std::nanf(""); -- GitLab