From bafa5e1c3ba454bfded6b1aba856b5a8a3e98ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Gr=C3=B6ger?= <tobias.groeger@student.kit.edu> Date: Sun, 28 Apr 2024 15:03:10 +0200 Subject: [PATCH] Implement controller --- ...omicPlatformVelocityControllerWithRamp.cpp | 41 +++++++++++++++---- ...onomicPlatformVelocityControllerWithRamp.h | 16 +++++--- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp index 475f9c37b..77486fe6d 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp @@ -29,10 +29,9 @@ namespace armarx { NJointHolonomicPlatformVelocityControllerWithRamp:: - NJointHolonomicPlatformUnitVelocityPassThroughController( - RobotUnit* prov, - NJointHolonomicPlatformUnitVelocityPassThroughControllerConfigPtr cfg, - const VirtualRobot::RobotPtr&) : + NJointHolonomicPlatformVelocityControllerWithRamp(RobotUnit* prov, + ConfigPtrT cfg, + const VirtualRobot::RobotPtr&) : maxCommandDelay(IceUtil::Time::milliSeconds(500)) { target = useControlTarget(cfg->platformName, ControlModes::HolonomicPlatformVelocity) @@ -41,16 +40,26 @@ namespace armarx << "The actuator " << cfg->platformName << " has no control mode " << ControlModes::HolonomicPlatformVelocity; + NJointHolonomicPlatformVelocityControllerWithRampControlData initialSettings; initialSettings.velocityX = cfg->initialVelocityX; initialSettings.velocityY = cfg->initialVelocityY; initialSettings.velocityRotation = cfg->initialVelocityRotation; reinitTripleBuffer(initialSettings); + + // init velocity ramp + Eigen::VectorXf state(6); + state << initialSettings.velocityX, initialSettings.velocityY, 0, 0, 0, + initialSettings.velocityRotation; + ramp.setState(state, VirtualRobot::IKSolver::CartesianSelection::All); + + ramp.setMaxPositionAcceleration(cfg->maxPositionAcceleration); + ramp.setMaxOrientationAcceleration(cfg->maxOrientationAcceleration); } void NJointHolonomicPlatformVelocityControllerWithRamp::rtRun( const IceUtil::Time& sensorValuesTimestamp, - const IceUtil::Time&) + const IceUtil::Time& timeSinceLastIteration) { auto commandAge = sensorValuesTimestamp - rtGetControlStruct().commandTimestamp; @@ -66,9 +75,14 @@ namespace armarx } else { - target->velocityX = rtGetControlStruct().velocityX; - target->velocityY = rtGetControlStruct().velocityY; - target->velocityRotation = rtGetControlStruct().velocityRotation; + Eigen::VectorXf x(6); + x << rtGetControlStruct().velocityX, rtGetControlStruct().velocityY, 0, 0, 0, + rtGetControlStruct().velocityRotation; + + Eigen::VectorXf result = ramp.update(x, timeSinceLastIteration.toSecondsDouble()); + target->velocityX = result(0); + target->velocityY = result(1); + target->velocityRotation = result(5); } } @@ -85,6 +99,15 @@ namespace armarx writeControlStruct(); } + void + NJointHolonomicPlatformVelocityControllerWithRamp::setMaxAccelerations( + float maxPositionAcceleration, + float maxOrientationAcceleration) + { + ramp.setMaxPositionAcceleration(maxPositionAcceleration); + ramp.setMaxOrientationAcceleration(maxOrientationAcceleration); + } + IceUtil::Time NJointHolonomicPlatformVelocityControllerWithRamp::getMaxCommandDelay() const { @@ -99,6 +122,6 @@ namespace armarx } NJointControllerRegistration<NJointHolonomicPlatformVelocityControllerWithRamp> - registrationNJointHolonomicPlatformUnitVelocityPassThroughController( + registrationNJointHolonomicPlatformVelocityControllerWithRamp( "NJointHolonomicPlatformVelocityControllerWithRamp"); } // namespace armarx diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h index 12d8f43e6..186d7c581 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h @@ -43,6 +43,9 @@ namespace armarx float initialVelocityX; float initialVelocityY; float initialVelocityRotation; + + float maxPositionAcceleration; + float maxOrientationAcceleration; }; TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformVelocityControllerWithRampControlData); @@ -65,15 +68,18 @@ namespace armarx public: using ConfigPtrT = NJointHolonomicPlatformVelocityControllerWithRampConfigPtr; - NJointHolonomicPlatformVelocityControllerWithRampConfig(RobotUnit* prov, - ConfigPtrT config, - const VirtualRobot::RobotPtr&); + NJointHolonomicPlatformVelocityControllerWithRamp(RobotUnit* prov, + ConfigPtrT config, + const VirtualRobot::RobotPtr&); - void rtRun(const IceUtil::Time&, const IceUtil::Time&) override; + void rtRun(const IceUtil::Time& sensorValuesTimestamp, + const IceUtil::Time& timeSinceLastIteration) override; //for the platform unit void setVelocites(float velocityX, float velocityY, float velocityRotation); + void setMaxAccelerations(float maxPositionAcceleration, float maxOrientationAcceleration); + //ice interface std::string getClassName(const Ice::Current& = Ice::emptyCurrent) const override @@ -84,12 +90,12 @@ namespace armarx IceUtil::Time getMaxCommandDelay() const; void setMaxCommandDelay(const IceUtil::Time& value); + protected: IceUtil::Time maxCommandDelay; CartesianVelocityRamp ramp; ControlTargetHolonomicPlatformVelocity* target; - NJointHolonomicPlatformVelocityControllerWithRampControlData initialSettings; }; } // namespace armarx -- GitLab