From c9382a82778a72bf16d48a353efbf93488b1cf6e Mon Sep 17 00:00:00 2001 From: ArmarX User <armarx@kit.edu> Date: Thu, 7 Feb 2019 18:32:21 +0100 Subject: [PATCH] added more sensor processing --- .../ParallelGripperPositionController.cpp | 3 +- .../ParallelGripperVelocityController.cpp | 2 +- .../KITGripperBasisBoard.cpp | 30 ++++++++- .../KITGripperBasisBoardData.cpp | 66 ++++++++++++++++--- .../KITGripperBasisBoardData.h | 18 ++++- 5 files changed, 103 insertions(+), 16 deletions(-) diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/ParallelGripperPositionController.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/ParallelGripperPositionController.cpp index 3dcc0692d..969260fe5 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/ParallelGripperPositionController.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/ParallelGripperPositionController.cpp @@ -23,7 +23,7 @@ ParallelGripperPositionController::ParallelGripperPositionController(const std:: PWMVelocityControllerConfigurationCPtr velocityControllerConfigDataPtr) : JointPWMPositionController(deviceName, board, jointData, velocityControllerConfigDataPtr) { - linkedJointConnectorIndex = jointData->getParallelControlActorIndex(); + linkedJointConnectorIndex = jointData->getSiblingControlActorIndex(); } ParallelGripperPositionController::~ParallelGripperPositionController() noexcept(true) @@ -39,7 +39,6 @@ void ParallelGripperPositionController::rtRun(const IceUtil::Time& sensorValuesT target.position += (linkedDataPtr->getRelativePosition() * linkedPositionFactor); ARMARX_RT_LOGF_INFO("target.position %.2f, relative partner pos: %.2f", target.position, linkedDataPtr->getRelativePosition()).deactivateSpam(0.5); JointPWMPositionController::rtRun(sensorValuesTimestamp, timeSinceLastIteration); - } else { diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/ParallelGripperVelocityController.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/ParallelGripperVelocityController.cpp index c04ca78ab..a4473c5b2 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/ParallelGripperVelocityController.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/JointController/ParallelGripperVelocityController.cpp @@ -21,7 +21,7 @@ ParallelGripperVelocityController::ParallelGripperVelocityController(const std:: PWMVelocityControllerConfigurationCPtr velocityControllerConfigDataPtr) : JointPWMVelocityController(deviceName, board, jointData, velocityControllerConfigDataPtr) { - this->linkedJointConnectorIndex = jointData->getParallelControlActorIndex(); + this->linkedJointConnectorIndex = jointData->getSiblingControlActorIndex(); } diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoard.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoard.cpp index d14e66c6a..ca6298143 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoard.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoard.cpp @@ -174,8 +174,35 @@ namespace armarx defaultConfigurationNode.first_node("JointPWMZeroTorqueControllerDefaultConfiguration") .add_node_at_end(configNode.first_node("JointPWMZeroTorqueControllerConfig"))); - if (actorDataPtr->getParallelControlActorIndex() != -1) + // ARMARX_CHECK_EQUAL_W_HINT( + // configNode.has_node("ParallelGripperDecoupplingFactor"), + // configNode.has_node("SiblingConnectorId"), + // "Either both or none have to be set."); + // auto tempConfigNode = defaultConfigurationNode.first_node("KITGripperActorDefaultConfiguration"). + // add_node_at_end(configNode); + // parallelGripperDecouplingFactor = tempConfigNode.first_node("ParallelGripperDecoupplingFactor").value_as_float(); + + // if (configNode.has_node("ParallelGripperDecoupplingFactor")) + // { + // const int siblingConnectorId = configNode.first_node("SiblingConnectorId").value_as_int32(); + + // //get sibling + // for (const ActorRobotUnitDevicePtr& dev : board->devices) + // { + // if (dev->actorIndex == siblingConnectorId) + // { + // sibling = dev.get(); + // break; + // } + // } + // ARMARX_CHECK_NOT_NULL_W_HINT(sibling, "Sibling with connector index " << siblingConnectorId << " not found"); + // ARMARX_INFO << "Device " << board->getDeviceName() << ", actor " << getDeviceName() << " is using " + // << sibling->getDeviceName() << " as a sibling for relative position sensor values"; + // } + + if (false && actorDataPtr->getSiblingControlActorIndex() != -1) { + ARMARX_IMPORTANT << "Using coupled mode for " << getDeviceName(); // Add Controllers for ParallelGripper if (actorDataPtr->getVelocityControlEnabled()) { @@ -240,6 +267,7 @@ namespace armarx sensorValue.position = actorDataPtr->getPosition(); sensorValue.relativePosition = actorDataPtr->getRelativePosition(); sensorValue.velocity = actorDataPtr->getVelocity(); + sensorValue.absoluteEncoderVelocity = actorDataPtr->getAbsoluteEncoderVelocity(); sensorValue.targetPWM = actorDataPtr->getTargetPWM(); sensorValue.motorCurrent = actorDataPtr->getTargetPWM(); sensorValue.minPWM = actorDataPtr->getCurrentMinPWM(); diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.cpp b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.cpp index a3550e98c..aa0fe7399 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.cpp +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.cpp @@ -59,7 +59,9 @@ namespace armarx actorData.at(connectorIndex)->velocityTicks = velocity; actorData.at(connectorIndex)->positionControlEnabled = positionControlEnabled; actorData.at(connectorIndex)->velocityControlEnabled = velocityControlEnabled; - actorData.at(connectorIndex)->parallelControlEnabled = configNode.first_node("ParallelControlEnabled").value_as_int32(); + + actorData.at(connectorIndex)->parallelGripperDecouplingFactor = configNode.first_node("ParallelGripperDecouplingFactor").value_as_float(); + actorData.at(connectorIndex)->parallelControlEnabled = configNode.first_node("ParallelControlSiblingIndex").value_as_int32(); actorData.at(connectorIndex)->currentPWMBoundGradient = configNode.first_node("CurrentPWMBoundGradient").value_as_float(); actorData.at(connectorIndex)->currentPWMBoundOffset = configNode.first_node("CurrentPWMBoundOffset").value_as_int32(); }; @@ -93,6 +95,25 @@ namespace armarx } ActorData& d = *ptr; + + d.relativePosition.read(); + + if (d.getSiblingControlActorIndex() >= 0) + { + auto& d2 = actorData.at(d.getSiblingControlActorIndex()); + d.adjustedRelativePosition = d.relativePosition.value + + d2->relativePosition.value * d.parallelGripperDecouplingFactor; + } + else + { + d.adjustedRelativePosition = d.relativePosition.value; + } + + if (std::isnan(d.relativePositionOffset)) // initialize on first run + { + d.relativePositionOffset = -d.relativePosition.value + d.position.value; + } + if (i == 0) { d.rawABSEncoderTicks = (((uint32_t)sensorOUT->RawABSEncoderValueBytes[0] << 24 | (uint32_t)sensorOUT->RawABSEncoderValueBytes[1] << 16 | (uint32_t)sensorOUT->RawABSEncoderValueBytes[2] << 8 | (uint32_t)sensorOUT->RawABSEncoderValueBytes[3]) & 0xFFFFF000) >> 12; @@ -106,16 +127,25 @@ namespace armarx d.rawABSEncoderTicks = 0; } - d.position.read(); - d.relativePosition.read(); - if (std::isnan(d.relativePositionOffset)) // initialize on first run + if (i > 1) { - d.relativePositionOffset = -d.relativePosition.value + d.position.value; + d.position.value = d.adjustedRelativePosition; + } + else + { + d.position.read(); } + d.sanitizedAbsolutePosition = math::MathUtils::angleModPI(d.position.value); //ARMARX_RT_LOGF_INFO("position %d, relative position: %d", (int)d.rawABSEncoderTicks, d.relativePosition.value).deactivateSpam(0.5); + if (!std::isnan(d.lastAbsolutePosition)) + { + d.absoluteEncoderVelocity = math::MathUtils::AngleDelta(d.lastAbsolutePosition, d.sanitizedAbsolutePosition) / timeSinceLastIteration.toSecondsDouble(); + } + d.lastAbsolutePosition = d.sanitizedAbsolutePosition; d.velocity.read(); + d.velocity.value = d.velocityFilter.update(sensorValuesTimestamp, d.velocity.value); d.torque.read(); d.currentMaxPWM = std::round(*d.velocityTicks * d.currentPWMBoundGradient + d.currentPWMBoundOffset); d.currentMinPWM = std::round(*d.velocityTicks * d.currentPWMBoundGradient - d.currentPWMBoundOffset); @@ -151,6 +181,12 @@ namespace armarx return actorData.at(actorIndex); } + ActorData::ActorData() : + velocityFilter(10) + { + + } + void ActorData::setTargetPWM(int32_t targetPWM) { targetPWM = math::MathUtils::LimitMinMax(currentMinPWM, currentMaxPWM, targetPWM); @@ -163,17 +199,17 @@ namespace armarx float ActorData::getPosition() const { - return position.value; + return sanitizedAbsolutePosition; } float ActorData::getRelativePosition() const { - return relativePosition.value; + return adjustedRelativePosition; } - float ActorData::getAdjustedRelativePosition() const + float ActorData::getCompensatedRelativePosition() const { - return relativePosition.value + relativePositionOffset; + return adjustedRelativePosition + relativePositionOffset; } float ActorData::getVelocity() const @@ -221,7 +257,7 @@ namespace armarx return currentMaxPWM; } - int32_t ActorData::getParallelControlActorIndex() const + int32_t ActorData::getSiblingControlActorIndex() const { return parallelControlEnabled; } @@ -246,4 +282,14 @@ namespace armarx return currentPWMBoundOffset; } + float ActorData::getParallelGripperDecouplingFactor() const + { + return parallelGripperDecouplingFactor; + } + + float ActorData::getAbsoluteEncoderVelocity() const + { + return absoluteEncoderVelocity; + } + } // namespace armarx diff --git a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.h b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.h index d93760904..f0d9ae529 100644 --- a/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.h +++ b/source/RobotAPI/libraries/KITGripperEtherCAT/KITGripperBasisBoard/KITGripperBasisBoardData.h @@ -27,6 +27,7 @@ #include <RobotAPI/components/units/RobotUnit/SensorValues/SensorValue1DoFActuator.h> #include <RobotAPI/components/units/RobotUnit/SensorValues/SensorValueIMU.h> #include <VirtualRobot/Nodes/RobotNode.h> +#include <ArmarXCore/observers/filters/rtfilters/AverageFilter.h> #include "KITGripperBasisBoardSlave.h" namespace armarx @@ -54,6 +55,7 @@ namespace armarx int32_t targetPWM; float relativePosition; float velocityTicksPerMs; + float absoluteEncoderVelocity; int32_t maxPWM; int32_t minPWM; @@ -67,6 +69,7 @@ namespace armarx svi.addMemberVariable(&KITGripperActorSensorData::maxPWM, "maxPWM"); svi.addMemberVariable(&KITGripperActorSensorData::minPWM, "minPWM"); svi.addMemberVariable(&KITGripperActorSensorData::velocityTicksPerMs, "velocityTicksPerMs"); + svi.addMemberVariable(&KITGripperActorSensorData::absoluteEncoderVelocity, "absoluteEncoderVelocity"); return svi; } @@ -76,10 +79,11 @@ namespace armarx class ActorData { public: + ActorData(); void setTargetPWM(int32_t targetPWM); float getPosition() const; float getRelativePosition() const; - float getAdjustedRelativePosition() const; + float getCompensatedRelativePosition() const; float getVelocity() const; float getTorque() const; float getSoftLimitHi() const; @@ -92,7 +96,7 @@ namespace armarx int32_t getCurrentMaxPWM() const; - int32_t getParallelControlActorIndex() const; + int32_t getSiblingControlActorIndex() const; bool getPositionControlEnabled() const; @@ -102,12 +106,22 @@ namespace armarx int32_t getCurrentPWMBoundOffset() const; + float getParallelGripperDecouplingFactor() const; + + float getAbsoluteEncoderVelocity() const; + private: u_int32_t rawABSEncoderTicks; LinearConvertedValue<int32_t> relativePosition; + float adjustedRelativePosition; float relativePositionOffset = std::nan(""); + float parallelGripperDecouplingFactor = std::nanf(""); LinearConvertedValue<u_int32_t> position; + float sanitizedAbsolutePosition; LinearConvertedValue<int32_t> velocity; + rtfilters::AverageFilter velocityFilter; + float absoluteEncoderVelocity = 0.0f; + float lastAbsolutePosition = std::nanf(""); LinearConvertedValue<int32_t> torque; LinearConvertedValue<int32_t> targetPWM; int32_t* velocityTicks; -- GitLab