From d4bc11c2c32e44894d351b82479190c9a01c5bb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20Gr=C3=B6ger?= <tobias.groeger@student.kit.edu> Date: Mon, 29 Apr 2024 18:40:37 +0200 Subject: [PATCH] Implement properties to choose controller Add a common base class for both HolonomicPlatformVelocity controllers and add a property with which to choose one. Make the acceleration limits also configurable via properties. --- .../components/units/RobotUnit/CMakeLists.txt | 3 + ...tformUnitVelocityPassThroughController.cpp | 29 +------- ...latformUnitVelocityPassThroughController.h | 26 +------ ...micPlatformVelocityControllerInterface.cpp | 63 ++++++++++++++++ ...nomicPlatformVelocityControllerInterface.h | 59 +++++++++++++++ ...HolonomicPlatformVelocityControllerTypes.h | 43 +++++++++++ ...omicPlatformVelocityControllerWithRamp.cpp | 53 ++++---------- ...onomicPlatformVelocityControllerWithRamp.h | 34 ++------- .../RobotUnitModules/RobotUnitModuleUnits.cpp | 73 ++++++++++++++----- .../RobotUnitModules/RobotUnitModuleUnits.h | 20 +++++ .../units/RobotUnit/Units/PlatformSubUnit.h | 5 +- 11 files changed, 272 insertions(+), 136 deletions(-) create mode 100644 source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp create mode 100644 source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h create mode 100644 source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerTypes.h diff --git a/source/RobotAPI/components/units/RobotUnit/CMakeLists.txt b/source/RobotAPI/components/units/RobotUnit/CMakeLists.txt index bfbe4b911..16f091a3a 100755 --- a/source/RobotAPI/components/units/RobotUnit/CMakeLists.txt +++ b/source/RobotAPI/components/units/RobotUnit/CMakeLists.txt @@ -43,6 +43,7 @@ set(LIB_FILES NJointControllers/NJointController.cpp NJointControllers/NJointTrajectoryController.cpp NJointControllers/NJointKinematicUnitPassThroughController.cpp + NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.cpp NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp NJointControllers/NJointHolonomicPlatformRelativePositionController.cpp @@ -122,6 +123,8 @@ set(LIB_HEADERS NJointControllers/NJointControllerRegistry.h NJointControllers/NJointControllerWithTripleBuffer.h NJointControllers/NJointTrajectoryController.h + NJointControllers/NJointHolonomicPlatformVelocityControllerTypes.h + NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h NJointControllers/NJointKinematicUnitPassThroughController.h NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.h NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.cpp index bd440c1b0..892a1ae7e 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.cpp +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.cpp @@ -32,8 +32,7 @@ namespace armarx NJointHolonomicPlatformUnitVelocityPassThroughController( RobotUnit* prov, NJointHolonomicPlatformUnitVelocityPassThroughControllerConfigPtr cfg, - const VirtualRobot::RobotPtr&) : - maxCommandDelay(IceUtil::Time::milliSeconds(500)) + const VirtualRobot::RobotPtr&) { target = useControlTarget(cfg->platformName, ControlModes::HolonomicPlatformVelocity) ->asA<ControlTargetHolonomicPlatformVelocity>(); @@ -72,32 +71,6 @@ namespace armarx } } - void - NJointHolonomicPlatformUnitVelocityPassThroughController::setVelocites(float velocityX, - float velocityY, - float velocityRotation) - { - LockGuardType guard{controlDataMutex}; - getWriterControlStruct().velocityX = velocityX; - getWriterControlStruct().velocityY = velocityY; - getWriterControlStruct().velocityRotation = velocityRotation; - getWriterControlStruct().commandTimestamp = IceUtil::Time::now(); - writeControlStruct(); - } - - IceUtil::Time - NJointHolonomicPlatformUnitVelocityPassThroughController::getMaxCommandDelay() const - { - return maxCommandDelay; - } - - void - NJointHolonomicPlatformUnitVelocityPassThroughController::setMaxCommandDelay( - const IceUtil::Time& value) - { - maxCommandDelay = value; - } - NJointControllerRegistration<NJointHolonomicPlatformUnitVelocityPassThroughController> registrationNJointHolonomicPlatformUnitVelocityPassThroughController( "NJointHolonomicPlatformUnitVelocityPassThroughController"); diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.h index 37df1f055..ef08635a5 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.h +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.h @@ -24,6 +24,8 @@ #include <VirtualRobot/Robot.h> +#include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h> + #include "../ControlTargets/ControlTargetHolonomicPlatformVelocity.h" #include "../util.h" #include "NJointControllerWithTripleBuffer.h" @@ -45,24 +47,12 @@ namespace armarx TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformUnitVelocityPassThroughController); - class NJointHolonomicPlatformUnitVelocityPassThroughControllerControlData - { - public: - float velocityX = 0; - float velocityY = 0; - float velocityRotation = 0; - IceUtil::Time commandTimestamp; - }; - - TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformUnitVelocityPassThroughController); - /** * @brief The NJointHolonomicPlatformUnitVelocityPassThroughController class * @ingroup Library-RobotUnit-NJointControllers */ class NJointHolonomicPlatformUnitVelocityPassThroughController : - virtual public NJointControllerWithTripleBuffer< - NJointHolonomicPlatformUnitVelocityPassThroughControllerControlData> + virtual public NJointHolonomicPlatformVelocityControllerInterface { public: using ConfigPtrT = NJointHolonomicPlatformUnitVelocityPassThroughControllerConfigPtr; @@ -74,9 +64,6 @@ namespace armarx void rtRun(const IceUtil::Time&, const IceUtil::Time&) override; - //for the platform unit - void setVelocites(float velocityX, float velocityY, float velocityRotation); - //ice interface std::string getClassName(const Ice::Current& = Ice::emptyCurrent) const override @@ -84,13 +71,8 @@ namespace armarx return "NJointHolonomicPlatformUnitVelocityPassThroughController"; } - IceUtil::Time getMaxCommandDelay() const; - void setMaxCommandDelay(const IceUtil::Time& value); - protected: - IceUtil::Time maxCommandDelay; - ControlTargetHolonomicPlatformVelocity* target; - NJointHolonomicPlatformUnitVelocityPassThroughControllerControlData initialSettings; + NJointHolonomicPlatformVelocityControllerControlData initialSettings; }; } // namespace armarx diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp new file mode 100644 index 000000000..0db22289e --- /dev/null +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp @@ -0,0 +1,63 @@ +/* + * This file is part of ArmarX. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @package RobotAPI::ArmarXObjects::NJointHolonomicPlatformUnitVelocityPassThroughController + * @author Raphael Grimm ( raphael dot grimm at kit dot edu ) + * @date 2017 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#include "NJointHolonomicPlatformVelocityControllerInterface.h" + +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> + +#include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointControllerRegistry.h> + +namespace armarx +{ + NJointHolonomicPlatformVelocityControllerInterface:: + NJointHolonomicPlatformVelocityControllerInterface() : + maxCommandDelay(IceUtil::Time::milliSeconds(500)) + { + } + + void + NJointHolonomicPlatformVelocityControllerInterface::setVelocites(float velocityX, + float velocityY, + float velocityRotation) + { + LockGuardType guard{controlDataMutex}; + getWriterControlStruct().velocityX = velocityX; + getWriterControlStruct().velocityY = velocityY; + getWriterControlStruct().velocityRotation = velocityRotation; + getWriterControlStruct().commandTimestamp = IceUtil::Time::now(); + writeControlStruct(); + } + + IceUtil::Time + NJointHolonomicPlatformVelocityControllerInterface::getMaxCommandDelay() const + { + return maxCommandDelay; + } + + void + NJointHolonomicPlatformVelocityControllerInterface::setMaxCommandDelay( + const IceUtil::Time& value) + { + maxCommandDelay = value; + } + +} // namespace armarx diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h new file mode 100644 index 000000000..7a9acbe71 --- /dev/null +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h @@ -0,0 +1,59 @@ +/* + * This file is part of ArmarX. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @package RobotAPI::NJointHolonomicPlatformVelocityControllerInterface + * @author Tobias Gröger ( tobias dot groeger at student dot kit dot edu ) + * @date 2024 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + +#include "NJointControllerWithTripleBuffer.h" + +namespace armarx +{ + + TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformVelocityControllerControlData); + + class NJointHolonomicPlatformVelocityControllerControlData + { + public: + float velocityX = 0; + float velocityY = 0; + float velocityRotation = 0; + IceUtil::Time commandTimestamp; + }; + + TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformVelocityControllerInterface); + + class NJointHolonomicPlatformVelocityControllerInterface : + virtual public NJointControllerWithTripleBuffer< + NJointHolonomicPlatformVelocityControllerControlData> + { + public: + NJointHolonomicPlatformVelocityControllerInterface(); + + + void setVelocites(float velocityX, float velocityY, float velocityRotation); + + IceUtil::Time getMaxCommandDelay() const; + void setMaxCommandDelay(const IceUtil::Time& value); + + protected: + IceUtil::Time maxCommandDelay; + }; +} // namespace armarx diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerTypes.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerTypes.h new file mode 100644 index 000000000..c864e700d --- /dev/null +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerTypes.h @@ -0,0 +1,43 @@ +/* + * This file is part of ArmarX. + * + * ArmarX is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * ArmarX is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @package RobotAPI::NJointHolonomicPlatformVelocityControllerTypes + * @author Tobias Gröger ( tobias dot groeger at student dot kit dot edu ) + * @date 2024 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + +#include <SimoxUtility/meta/enum/EnumNames.hpp> + +namespace armarx +{ + enum class NJointHolonomicPlatformVelocityControllerTypes + { + PassThroughController, + ControllerWithRamp + }; + + + inline const simox::meta::EnumNames<NJointHolonomicPlatformVelocityControllerTypes> + NJointHolonomicPlatformVelocityControllerTypesNames{ + {NJointHolonomicPlatformVelocityControllerTypes::PassThroughController, + "PassThroughController"}, + {NJointHolonomicPlatformVelocityControllerTypes::ControllerWithRamp, + "ControllerWithRamp"}}; + +} // namespace armarx diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp index 77486fe6d..5b5d9f5d1 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp @@ -31,8 +31,7 @@ namespace armarx NJointHolonomicPlatformVelocityControllerWithRamp:: NJointHolonomicPlatformVelocityControllerWithRamp(RobotUnit* prov, ConfigPtrT cfg, - const VirtualRobot::RobotPtr&) : - maxCommandDelay(IceUtil::Time::milliSeconds(500)) + const VirtualRobot::RobotPtr&) { target = useControlTarget(cfg->platformName, ControlModes::HolonomicPlatformVelocity) ->asA<ControlTargetHolonomicPlatformVelocity>(); @@ -40,20 +39,24 @@ 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); + const auto sensor = useSensorValue(cfg->platformName); + ARMARX_CHECK_EXPRESSION(sensor) << "No sensor value for " << cfg->platformName; + velocitySensor = sensor->asA<SensorValueHolonomicPlatformVelocity>(); + ARMARX_CHECK_EXPRESSION(velocitySensor) + << "Sensor value for " << cfg->platformName << " has invalid type"; + ramp.setMaxPositionAcceleration(cfg->maxPositionAcceleration); + ramp.setMaxOrientationAcceleration(cfg->maxOrientationAcceleration); + } + + void + NJointHolonomicPlatformVelocityControllerWithRamp::rtPreActivateController() + { // init velocity ramp Eigen::VectorXf state(6); - state << initialSettings.velocityX, initialSettings.velocityY, 0, 0, 0, - initialSettings.velocityRotation; + state << velocitySensor->velocityX, velocitySensor->velocityY, 0, 0, 0, + velocitySensor->velocityRotation; ramp.setState(state, VirtualRobot::IKSolver::CartesianSelection::All); - - ramp.setMaxPositionAcceleration(cfg->maxPositionAcceleration); - ramp.setMaxOrientationAcceleration(cfg->maxOrientationAcceleration); } void @@ -86,19 +89,6 @@ namespace armarx } } - void - NJointHolonomicPlatformVelocityControllerWithRamp::setVelocites(float velocityX, - float velocityY, - float velocityRotation) - { - LockGuardType guard{controlDataMutex}; - getWriterControlStruct().velocityX = velocityX; - getWriterControlStruct().velocityY = velocityY; - getWriterControlStruct().velocityRotation = velocityRotation; - getWriterControlStruct().commandTimestamp = IceUtil::Time::now(); - writeControlStruct(); - } - void NJointHolonomicPlatformVelocityControllerWithRamp::setMaxAccelerations( float maxPositionAcceleration, @@ -108,19 +98,6 @@ namespace armarx ramp.setMaxOrientationAcceleration(maxOrientationAcceleration); } - IceUtil::Time - NJointHolonomicPlatformVelocityControllerWithRamp::getMaxCommandDelay() const - { - return maxCommandDelay; - } - - void - NJointHolonomicPlatformVelocityControllerWithRamp::setMaxCommandDelay( - const IceUtil::Time& value) - { - maxCommandDelay = value; - } - NJointControllerRegistration<NJointHolonomicPlatformVelocityControllerWithRamp> registrationNJointHolonomicPlatformVelocityControllerWithRamp( "NJointHolonomicPlatformVelocityControllerWithRamp"); diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h index 9070f0287..e5110624a 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h @@ -13,9 +13,9 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * - * @package RobotAPI::ArmarXObjects::NJointHolonomicPlatformUnitVelocityPassThroughController - * @author Raphael Grimm ( raphael dot grimm at kit dot edu ) - * @date 2017 + * @package RobotAPI::NJointHolonomicPlatformVelocityControllerInterface + * @author Tobias Gröger ( tobias dot groeger at student dot kit dot edu ) + * @date 2024 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt * GNU General Public License */ @@ -24,6 +24,7 @@ #include <VirtualRobot/Robot.h> +#include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h> #include <RobotAPI/libraries/core/CartesianVelocityRamp.h> #include "../ControlTargets/ControlTargetHolonomicPlatformVelocity.h" @@ -39,30 +40,15 @@ namespace armarx { public: std::string platformName; - float initialVelocityX; - float initialVelocityY; - float initialVelocityRotation; float maxPositionAcceleration; float maxOrientationAcceleration; }; - TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformVelocityControllerWithRampControlData); - - class NJointHolonomicPlatformVelocityControllerWithRampControlData - { - public: - float velocityX = 0; - float velocityY = 0; - float velocityRotation = 0; - IceUtil::Time commandTimestamp; - }; - TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformVelocityControllerWithRamp); class NJointHolonomicPlatformVelocityControllerWithRamp : - virtual public NJointControllerWithTripleBuffer< - NJointHolonomicPlatformVelocityControllerWithRampControlData> + virtual public NJointHolonomicPlatformVelocityControllerInterface { public: using ConfigPtrT = NJointHolonomicPlatformVelocityControllerWithRampConfigPtr; @@ -74,8 +60,6 @@ namespace armarx 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); @@ -86,15 +70,13 @@ namespace armarx return "NJointHolonomicPlatformVelocityControllerWithRamp"; } - IceUtil::Time getMaxCommandDelay() const; - void setMaxCommandDelay(const IceUtil::Time& value); - - protected: - IceUtil::Time maxCommandDelay; + void rtPreActivateController() override; + protected: CartesianVelocityRamp ramp; ControlTargetHolonomicPlatformVelocity* target; + const SensorValueHolonomicPlatformVelocity* velocitySensor; }; } // namespace armarx diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp index 7a60318dc..80c426cc9 100644 --- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp +++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp @@ -28,6 +28,8 @@ #include "RobotAPI/components/units/RobotUnit/SensorValues/SensorValueHolonomicPlatform.h" #include "RobotAPI/components/units/RobotUnit/Units/LocalizationSubUnit.h" #include <RobotAPI/components/units/RobotUnit/Devices/GlobalRobotPoseSensorDevice.h> +#include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.h> +#include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h> #include "../RobotUnit.h" #include "../SensorValues/SensorValue1DoFActuator.h" @@ -449,27 +451,60 @@ namespace armarx::RobotUnitModule Component::create<UnitT>(properties, configName, getConfigDomain()); //config ARMARX_TRACE; - NJointHolonomicPlatformVelocityControllerWithRampConfigPtr config = - new NJointHolonomicPlatformVelocityControllerWithRampConfig; - config->initialVelocityX = 0; - config->initialVelocityY = 0; - config->initialVelocityRotation = 0; - config->platformName = _module<RobotData>().getRobotPlatformName(); + const NJointHolonomicPlatformVelocityControllerTypes platformControllerType = + getProperty<NJointHolonomicPlatformVelocityControllerTypes>( + "PlatformUnitVelocityControllerType"); + if (platformControllerType == + NJointHolonomicPlatformVelocityControllerTypes::PassThroughController) + { + NJointHolonomicPlatformUnitVelocityPassThroughControllerConfigPtr config = + new NJointHolonomicPlatformUnitVelocityPassThroughControllerConfig; + config->initialVelocityX = 0; + config->initialVelocityY = 0; + config->initialVelocityRotation = 0; + config->platformName = _module<RobotData>().getRobotPlatformName(); + + auto ctrl = NJointHolonomicPlatformUnitVelocityPassThroughControllerPtr::dynamicCast( + _module<ControllerManagement>().createNJointController( + "NJointHolonomicPlatformUnitVelocityPassThroughController", + getName() + "_" + configName + "_VelPTContoller", + config, + false, + true)); + ARMARX_TRACE; + ARMARX_CHECK_EXPRESSION(ctrl); + unit->pt = ctrl; + ARMARX_TRACE; + } + else if (platformControllerType == + NJointHolonomicPlatformVelocityControllerTypes::ControllerWithRamp) + { + NJointHolonomicPlatformVelocityControllerWithRampConfigPtr config = + new NJointHolonomicPlatformVelocityControllerWithRampConfig; + config->platformName = _module<RobotData>().getRobotPlatformName(); - config->maxPositionAcceleration = 800; - config->maxOrientationAcceleration = 80; + config->maxPositionAcceleration = + getProperty<float>("PlatformUnitMaximumPositionAcceleration"); + config->maxOrientationAcceleration = + getProperty<float>("PlatformUnitMaximumOrientationAcceleration"); - auto ctrl = NJointHolonomicPlatformVelocityControllerWithRampPtr::dynamicCast( - _module<ControllerManagement>().createNJointController( - "NJointHolonomicPlatformVelocityControllerWithRamp", - getName() + "_" + configName + "_VelPTContoller", - config, - false, - true)); - ARMARX_TRACE; - ARMARX_CHECK_EXPRESSION(ctrl); - unit->pt = ctrl; - ARMARX_TRACE; + auto ctrl = NJointHolonomicPlatformVelocityControllerWithRampPtr::dynamicCast( + _module<ControllerManagement>().createNJointController( + "NJointHolonomicPlatformVelocityControllerWithRamp", + getName() + "_" + configName + "_VelPTContoller", + config, + false, + true)); + ARMARX_TRACE; + ARMARX_CHECK_EXPRESSION(ctrl); + unit->pt = ctrl; + ARMARX_TRACE; + } + else + { + ARMARX_ERROR << "Invalid Platform velocity controller specified " + << ""; //platformControllerType; + } NJointHolonomicPlatformRelativePositionControllerConfigPtr configRelativePositionCtrlCfg = new NJointHolonomicPlatformRelativePositionControllerConfig; diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h index 6a4237226..f33c7ee47 100644 --- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h +++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.h @@ -22,6 +22,7 @@ #pragma once +#include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerTypes.h> #include <RobotAPI/interface/units/RobotUnit/RobotUnitInterface.h> #include "../Units/RobotUnitSubUnit.h" @@ -43,6 +44,25 @@ namespace armarx::RobotUnitModule defineOptionalProperty<std::string>( "PlatformUnitName", "PlatformUnit", "The name of the created platform unit"); + auto& types = defineOptionalProperty<NJointHolonomicPlatformVelocityControllerTypes>( + "PlatformUnitVelocityControllerType", + NJointHolonomicPlatformVelocityControllerTypes::PassThroughController, + "Which controller to use for velocity control of the platform"); + for (const auto& [type, name] : + NJointHolonomicPlatformVelocityControllerTypesNames.map()) + { + types.map(name, type); + } + + defineOptionalProperty<float>( + "PlatformUnitMaximumPositionAcceleration", + 800, + "The maximum allowed acceleration for the position of the platform"); + defineOptionalProperty<float>( + "PlatformUnitMaximumOrientationAcceleration", + 80, + "The maximum allowed acceleration for the orientation of the platform"); + defineOptionalProperty<std::string>( "ForceTorqueUnitName", "ForceTorqueUnit", diff --git a/source/RobotAPI/components/units/RobotUnit/Units/PlatformSubUnit.h b/source/RobotAPI/components/units/RobotUnit/Units/PlatformSubUnit.h index 5c2bb4a8d..dd41099f1 100755 --- a/source/RobotAPI/components/units/RobotUnit/Units/PlatformSubUnit.h +++ b/source/RobotAPI/components/units/RobotUnit/Units/PlatformSubUnit.h @@ -31,11 +31,10 @@ #include <RobotAPI/components/units/PlatformUnit.h> #include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformGlobalPositionController.h> #include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformRelativePositionController.h> -#include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h> +#include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h> #include <RobotAPI/interface/core/RobotState.h> #include <RobotAPI/libraries/core/Pose.h> -#include "../NJointControllers/NJointHolonomicPlatformUnitVelocityPassThroughController.h" #include "../SensorValues/SensorValueHolonomicPlatform.h" #include "RobotUnitSubUnit.h" @@ -94,7 +93,7 @@ namespace armarx void stopPlatform(const Ice::Current& c = Ice::emptyCurrent) override; - NJointHolonomicPlatformVelocityControllerWithRampPtr pt; + NJointHolonomicPlatformVelocityControllerInterfacePtr pt; NJointHolonomicPlatformRelativePositionControllerPtr relativePosCtrl; NJointHolonomicPlatformGlobalPositionControllerPtr globalPosCtrl; -- GitLab