From 0e87721ac5f7a11ddc78e08d7267c7184ccd5a86 Mon Sep 17 00:00:00 2001 From: Mirko Waechter <mirko.waechter@kit.edu> Date: Thu, 12 Apr 2018 11:15:40 +0200 Subject: [PATCH] made velocity mode for kinematicunit configurable --- .../ControlTarget1DoFActuator.h | 14 +-- ...ointKinematicUnitPassThroughController.cpp | 18 +--- ...NJointKinematicUnitPassThroughController.h | 5 - .../components/units/RobotUnit/RobotUnit.cpp | 91 +++++++++++-------- .../components/units/RobotUnit/RobotUnit.h | 5 + 5 files changed, 69 insertions(+), 64 deletions(-) diff --git a/source/RobotAPI/components/units/RobotUnit/ControlTargets/ControlTarget1DoFActuator.h b/source/RobotAPI/components/units/RobotUnit/ControlTargets/ControlTarget1DoFActuator.h index db15a4bd3..bd87e5658 100644 --- a/source/RobotAPI/components/units/RobotUnit/ControlTargets/ControlTarget1DoFActuator.h +++ b/source/RobotAPI/components/units/RobotUnit/ControlTargets/ControlTarget1DoFActuator.h @@ -66,29 +66,29 @@ namespace armarx make_ControlTarget1DoFActuator(ControlTarget1DoFActuatorTorque, torque, ControlModes::Torque1DoF); make_ControlTarget1DoFActuator(ControlTarget1DoFActuatorCurrent, current, ControlModes::Current1DoF); - class VelocityTorqueControlTarget: public ControlTarget1DoFActuatorVelocity + class ControlTarget1DoFActuatorTorqueVelocity: public ControlTarget1DoFActuatorVelocity { public: float maxTorque; const std::string& getControlMode() const override { - return ControlModes::Velocity1DoF; + return ControlModes::VelocityTorque; } void reset() override { ControlTarget1DoFActuatorVelocity::reset(); - maxTorque = 10.f; + maxTorque = -1.0f; // if < 0, default value for joint is to be used } bool isValid() const override { - return ControlTarget1DoFActuatorVelocity::isValid() && maxTorque >= 0; + return ControlTarget1DoFActuatorVelocity::isValid() && std::isfinite(maxTorque); } - static ControlTargetInfo<VelocityTorqueControlTarget> GetClassMemberInfo() + static ControlTargetInfo<ControlTarget1DoFActuatorTorqueVelocity> GetClassMemberInfo() { - ControlTargetInfo<VelocityTorqueControlTarget> cti; + ControlTargetInfo<ControlTarget1DoFActuatorTorqueVelocity> cti; cti.addBaseClass<ControlTarget1DoFActuatorVelocity>(); - cti.addMemberVariable(&VelocityTorqueControlTarget::maxTorque, "maxTorque"); + cti.addMemberVariable(&ControlTarget1DoFActuatorTorqueVelocity::maxTorque, "maxTorque"); return cti; } DETAIL_ControlTargetBase_DEFAULT_METHOD_IMPLEMENTATION diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointKinematicUnitPassThroughController.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointKinematicUnitPassThroughController.cpp index 02da648c7..f5e9ee2c8 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointKinematicUnitPassThroughController.cpp +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointKinematicUnitPassThroughController.cpp @@ -43,7 +43,7 @@ NJointKinematicUnitPassThroughController::NJointKinematicUnitPassThroughControll ControlTargetBase* ct = prov->getControlTarget(cfg->deviceName, controlMode); //get sensor - if (controlMode == ControlModes::Position1DoF) + if (ct->isA<ControlTarget1DoFActuatorPosition>()) { ARMARX_CHECK_EXPRESSION(sv->asA<SensorValue1DoFActuatorPosition>()); sensor = &(sv->asA<SensorValue1DoFActuatorPosition>()->position); @@ -51,26 +51,16 @@ NJointKinematicUnitPassThroughController::NJointKinematicUnitPassThroughControll target = &(ct->asA<ControlTarget1DoFActuatorPosition>()->position); sensorToControlOnActivateFactor = 1; } - else if (controlMode == ControlModes::Velocity1DoF) + else if (ct->isA<ControlTarget1DoFActuatorVelocity>()) { ARMARX_CHECK_EXPRESSION(sv->asA<SensorValue1DoFActuatorVelocity>()); sensor = &(sv->asA<SensorValue1DoFActuatorVelocity>()->velocity); ARMARX_CHECK_EXPRESSION(ct->asA<ControlTarget1DoFActuatorVelocity>()); target = &(ct->asA<ControlTarget1DoFActuatorVelocity>()->velocity); sensorToControlOnActivateFactor = 1; - resetZeroThreshold = 0.1; + resetZeroThreshold = 0.1f; // TODO: way to big value?! } - else if (controlMode == ControlModes::VelocityTorque) - { - ARMARX_CHECK_EXPRESSION(sv->asA<SensorValue1DoFActuatorVelocity>()); - sensor = &(sv->asA<SensorValue1DoFActuatorVelocity>()->velocity); - ARMARX_CHECK_EXPRESSION(ct->asA<VelocityTorqueControlTarget>()); - target = &(ct->asA<VelocityTorqueControlTarget>()->velocity); - target2 = &(ct->asA<VelocityTorqueControlTarget>()->maxTorque); - sensorToControlOnActivateFactor = 1; - resetZeroThreshold = 0.1; - } - else if (controlMode == ControlModes::Torque1DoF) + else if (ct->isA<ControlTarget1DoFActuatorTorque>()) { ARMARX_CHECK_EXPRESSION(sv->asA<SensorValue1DoFActuatorTorque>()); sensor = &(sv->asA<SensorValue1DoFActuatorTorque>()->torque); diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointKinematicUnitPassThroughController.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointKinematicUnitPassThroughController.h index 3a651d7f8..bea46eacc 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointKinematicUnitPassThroughController.h +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointKinematicUnitPassThroughController.h @@ -61,10 +61,6 @@ namespace armarx inline void rtRun(const IceUtil::Time&, const IceUtil::Time&) override { *target = control; - if (target2) - { - *target2 = 8; - } } inline void rtPreActivateController() override { @@ -94,7 +90,6 @@ namespace armarx protected: std::atomic<float> control {0}; float* target {nullptr}; - float* target2 {nullptr}; const float* sensor { nullptr diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnit.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnit.cpp index 5791b8bcf..f8fd2a54d 100644 --- a/source/RobotAPI/components/units/RobotUnit/RobotUnit.cpp +++ b/source/RobotAPI/components/units/RobotUnit/RobotUnit.cpp @@ -385,41 +385,13 @@ namespace armarx ARMARX_INFO << "finishDeviceInitialization...done! " << (MicroNow() - beg).count() << " us"; } - void armarx::RobotUnit::initializeDefaultUnits() - { - auto beg = MicroNow(); - { - auto guard = getGuard(); - throwIfStateIsNot(RobotUnitState::InitializingUnits, __FUNCTION__); - ARMARX_INFO << "initializing default units"; - initializeKinematicUnit(); - ARMARX_DEBUG << "KinematicUnit initialized"; - initializePlatformUnit(); - ARMARX_DEBUG << "PlatformUnit initialized"; - initializeForceTorqueUnit(); - ARMARX_DEBUG << "ForceTorqueUnit initialized"; - initializeInertialMeasurementUnit(); - ARMARX_DEBUG << "InertialMeasurementUnit initialized"; - initializeTrajectoryControllerUnit(); - ARMARX_DEBUG << "TrajectoryControllerUnit initialized"; - initializeTcpControllerUnit(); - ARMARX_DEBUG << "TcpControllerUnit initialized"; - } - ARMARX_INFO << "initializing default units...done! " << (MicroNow() - beg).count() << " us"; - } - - void armarx::RobotUnit::initializeKinematicUnit() + ManagedIceObjectPtr RobotUnit::createKinematicSubUnit(const Ice::PropertiesPtr& properties, const std::string& positionControlMode, + const std::string& velocityControlMode, const std::string& torqueControlMode) { using UnitT = KinematicSubUnit; - using IfaceT = KinematicUnitInterface; - auto guard = getGuard(); - throwIfStateIsNot(RobotUnitState::InitializingUnits, __FUNCTION__); - //check if unit is already added - if (getUnit(IfaceT::ice_staticId())) - { - return; - } + + //add ctrl et al std::map<std::string, UnitT::ActuatorData> devs; for (const ControlDevicePtr& controlDevice : controlDevices.values()) @@ -454,9 +426,9 @@ namespace armarx ARMARX_CHECK_EXPRESSION(pt); \ } \ } - initializeKinematicUnit_tmp_helper(ControlModes::Position1DoF, ControlTarget1DoFActuatorPosition, ad.ctrlPos) - initializeKinematicUnit_tmp_helper(ControlModes::Velocity1DoF, ControlTarget1DoFActuatorVelocity, ad.ctrlVel) - initializeKinematicUnit_tmp_helper(ControlModes::Torque1DoF, ControlTarget1DoFActuatorTorque, ad.ctrlTor) + initializeKinematicUnit_tmp_helper(positionControlMode, ControlTarget1DoFActuatorPosition, ad.ctrlPos) + initializeKinematicUnit_tmp_helper(velocityControlMode, ControlTarget1DoFActuatorVelocity, ad.ctrlVel) + initializeKinematicUnit_tmp_helper(torqueControlMode, ControlTarget1DoFActuatorTorque, ad.ctrlTor) #undef initializeKinematicUnit_tmp_helper @@ -469,13 +441,13 @@ namespace armarx if (devs.empty()) { ARMARX_IMPORTANT << "No joint devices found - skipping adding of KinematicUnit"; - return; + return NULL; } ARMARX_CHECK_EXPRESSION_W_HINT(!devs.empty(), "no 1DoF ControlDevice found with matching SensorDevice"); //add it + const std::string configName = getProperty<std::string>("KinematicUnitName"); const std::string confPre = getConfigDomain() + "." + configName + "."; - Ice::PropertiesPtr properties = getIceProperties()->clone(); //properties->setProperty(confPre + "MinimumLoggingLevel", getProperty<std::string>("MinimumLoggingLevel").getValue()); //fill properties properties->setProperty(confPre + "RobotNodeSetName", robotNodeSetName); @@ -493,8 +465,50 @@ namespace armarx ctrlModeGroups.groupsMerged, this ); + return unit; + } + + void armarx::RobotUnit::initializeDefaultUnits() + { + auto beg = MicroNow(); + { + auto guard = getGuard(); + throwIfStateIsNot(RobotUnitState::InitializingUnits, __FUNCTION__); + ARMARX_INFO << "initializing default units"; + initializeKinematicUnit(); + ARMARX_DEBUG << "KinematicUnit initialized"; + initializePlatformUnit(); + ARMARX_DEBUG << "PlatformUnit initialized"; + initializeForceTorqueUnit(); + ARMARX_DEBUG << "ForceTorqueUnit initialized"; + initializeInertialMeasurementUnit(); + ARMARX_DEBUG << "InertialMeasurementUnit initialized"; + initializeTrajectoryControllerUnit(); + ARMARX_DEBUG << "TrajectoryControllerUnit initialized"; + initializeTcpControllerUnit(); + ARMARX_DEBUG << "TcpControllerUnit initialized"; + } + ARMARX_INFO << "initializing default units...done! " << (MicroNow() - beg).count() << " us"; + } + + void armarx::RobotUnit::initializeKinematicUnit() + { + using IfaceT = KinematicUnitInterface; + + auto guard = getGuard(); + throwIfStateIsNot(RobotUnitState::InitializingUnits, __FUNCTION__); + //check if unit is already added + if (getUnit(IfaceT::ice_staticId())) + { + return; + } + + auto unit = createKinematicSubUnit(getIceProperties()->clone()); //add - addUnit(std::move(unit)); + if (unit) + { + addUnit(std::move(unit)); + } } void armarx::RobotUnit::initializePlatformUnit() @@ -690,6 +704,7 @@ namespace armarx void armarx::RobotUnit::addUnit(ManagedIceObjectPtr unit) { + ARMARX_CHECK_EXPRESSION(unit); auto guard = getGuard(); throwIfStateIsNot(RobotUnitState::InitializingUnits, __FUNCTION__); getArmarXManager()->addObjectAsync(unit, "", true, false); diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnit.h b/source/RobotAPI/components/units/RobotUnit/RobotUnit.h index 3bdaee759..706aaced3 100644 --- a/source/RobotAPI/components/units/RobotUnit/RobotUnit.h +++ b/source/RobotAPI/components/units/RobotUnit/RobotUnit.h @@ -690,6 +690,11 @@ namespace armarx // State: InitializingUnits // //////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // protected: + ManagedIceObjectPtr createKinematicSubUnit(const Ice::PropertiesPtr& properties, const std::string& positionControlMode = ControlModes::Position1DoF, + const std::string& velocityControlMode = ControlModes::Velocity1DoF, const std::string& torqueControlMode = ControlModes::Torque1DoF + ); + + virtual void initializeDefaultUnits(); virtual void initializeKinematicUnit(); virtual void initializePlatformUnit(); -- GitLab