26#include <VirtualRobot/IK/DifferentialIK.h>
27#include <VirtualRobot/Robot.h>
28#include <VirtualRobot/RobotNodeSet.h>
34#define DEFAULT_TCP_STRING "default TCP"
39 NJointControllerRegistration<NJointCartesianVelocityControllerWithRamp>
41 "NJointCartesianVelocityControllerWithRamp");
46 return "NJointCartesianVelocityControllerWithRamp";
51 const NJointCartesianVelocityControllerWithRampConfigPtr& config,
57 VirtualRobot::RobotNodeSetPtr rns =
rtGetRobot()->getRobotNodeSet(config->nodeSetName);
59 for (
size_t i = 0; i < rns->getSize(); ++i)
61 std::string jointName = rns->getNode(i)->getName();
64 targets.push_back(ct->
asA<ControlTarget1DoFActuatorVelocity>());
66 const SensorValue1DoFActuatorFilteredVelocity* filteredVelocitySensor =
67 sv->
asA<SensorValue1DoFActuatorFilteredVelocity>();
68 const SensorValue1DoFActuatorVelocity* velocitySensor =
69 sv->
asA<SensorValue1DoFActuatorVelocity>();
71 if (filteredVelocitySensor)
74 velocitySensors.push_back(&filteredVelocitySensor->filteredvelocity);
76 else if (velocitySensor)
79 velocitySensors.push_back(&velocitySensor->velocity);
83 VirtualRobot::RobotNodePtr tcp =
89 nodeSetName = config->nodeSetName;
90 jointLimitAvoidanceScale = config->jointLimitAvoidanceScale;
91 KpJointLimitAvoidance = config->KpJointLimitAvoidance;
96 Eigen::VectorXf::Zero(rns->getSize()),
98 config->maxPositionAcceleration,
99 config->maxOrientationAcceleration,
100 config->maxNullspaceAcceleration));
106#pragma GCC diagnostic push
107#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
108 Eigen::VectorXf currentJointVelocities(velocitySensors.size());
109 for (
size_t i = 0; i < velocitySensors.size(); i++)
111 currentJointVelocities(i) = *velocitySensors.at(i);
113 controller->setCurrentJointVelocity(currentJointVelocities);
114#pragma GCC diagnostic pop
115 ARMARX_IMPORTANT <<
"initial joint velocities: " << currentJointVelocities.transpose();
120 const IceUtil::Time& timeSinceLastIteration)
123 if (mode == VirtualRobot::IKSolver::All)
130 else if (mode == VirtualRobot::IKSolver::Position)
135 else if (mode == VirtualRobot::IKSolver::Orientation)
147 Eigen::VectorXf jnv =
148 KpJointLimitAvoidance *
controller->controller.calculateJointLimitAvoidance();
149 jnv +=
controller->controller.calculateNullspaceVelocity(
x, jointLimitAvoidanceScale, mode);
150 Eigen::VectorXf jointTargetVelocities =
151 controller->calculate(
x, jnv, timeSinceLastIteration.toSecondsDouble());
152 for (
size_t i = 0; i < targets.size(); ++i)
154 targets.at(i)->velocity = jointTargetVelocities(i);
160 float maxOrientationAcceleration,
161 float maxNullspaceAcceleration,
165 maxPositionAcceleration, maxOrientationAcceleration, maxNullspaceAcceleration);
189 float jointLimitAvoidanceScale,
192 this->jointLimitAvoidanceScale = jointLimitAvoidanceScale;
199 this->KpJointLimitAvoidance = KpJointLimitAvoidance;
206#pragma GCC diagnostic push
207#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
208 controller->setCurrentJointVelocity(Eigen::VectorXf::Zero(velocitySensors.size()));
209#pragma GCC diagnostic pop
239 const std::string& name,
243 if (name ==
"ControllerTarget")
252 KpJointLimitAvoidance = valueMap.at(
"KpJointLimitAvoidance")->getFloat();
253 jointLimitAvoidanceScale = valueMap.at(
"jointLimitAvoidanceScale")->getFloat();
256 else if (name ==
"ControllerParameters")
260 valueMap.at(
"maxOrientationAcceleration")->getFloat(),
261 valueMap.at(
"maxNullspaceAcceleration")->getFloat());
269 WidgetDescription::VBoxLayoutPtr
280 layout.
addSlider(
"KpJointLimitAvoidance", -10, 10, KpJointLimitAvoidance);
281 layout.
addSlider(
"jointLimitAvoidanceScale", -10, 10, jointLimitAvoidanceScale);
285 WidgetDescription::VBoxLayoutPtr
290 "maxPositionAcceleration", 0, 1000,
controller->getMaxPositionAcceleration());
292 "maxOrientationAcceleration", 0, 100,
controller->getMaxOrientationAcceleration());
294 "maxNullspaceAcceleration", 0, 100,
controller->getMaxNullspaceAcceleration());
301 const std::map<std::string, ConstControlDevicePtr>& controlDevices,
302 const std::map<std::string, ConstSensorDevicePtr>&)
307 LabelPtr label =
new Label;
308 label->text =
"nodeset name";
309 layout->children.emplace_back(label);
310 StringComboBoxPtr box =
new StringComboBox;
311 box->defaultIndex = 0;
313 box->options = robot->getRobotNodeSetNames();
314 box->name =
"nodeSetName";
315 layout->children.emplace_back(box);
317 LabelPtr labelTCP =
new Label;
318 labelTCP->text =
"tcp name";
319 layout->children.emplace_back(labelTCP);
320 StringComboBoxPtr boxTCP =
new StringComboBox;
321 boxTCP->defaultIndex = 0;
323 boxTCP->options = robot->getRobotNodeNames();
325 boxTCP->name =
"tcpName";
326 layout->children.emplace_back(boxTCP);
328 LabelPtr labelMode =
new Label;
329 labelMode->text =
"mode";
330 layout->children.emplace_back(labelMode);
331 StringComboBoxPtr boxMode =
new StringComboBox;
333 boxMode->options = {
"Position",
"Orientation",
"Both"};
334 boxMode->name =
"mode";
335 layout->children.emplace_back(boxMode);
336 layout->children.emplace_back(
new HSpacer);
337 boxMode->defaultIndex = 2;
340 auto addSlider = [&](
const std::string& label,
float max,
float defaultValue)
342 layout->children.emplace_back(
new Label(
false, label));
344 floatSlider->name = label;
345 floatSlider->min = 0;
346 floatSlider->defaultValue = defaultValue;
347 floatSlider->max =
max;
348 layout->children.emplace_back(floatSlider);
350 addSlider(
"maxPositionAcceleration", 1000, 100);
351 addSlider(
"maxOrientationAcceleration", 10, 1);
352 addSlider(
"maxNullspaceAcceleration", 10, 2);
353 addSlider(
"KpJointLimitAvoidance", 10, 2);
354 addSlider(
"jointLimitAvoidanceScale", 10, 2);
359 NJointCartesianVelocityControllerWithRampConfigPtr
363 return new NJointCartesianVelocityControllerWithRampConfig(
364 values.at(
"nodeSetName")->getString(),
365 values.at(
"tcpName")->getString(),
367 values.at(
"maxPositionAcceleration")->getFloat(),
368 values.at(
"maxOrientationAcceleration")->getFloat(),
369 values.at(
"maxNullspaceAcceleration")->getFloat(),
370 values.at(
"KpJointLimitAvoidance")->getFloat(),
371 values.at(
"jointLimitAvoidanceScale")->getFloat());
374 VirtualRobot::IKSolver::CartesianSelection
378 if (mode ==
"Position")
380 return VirtualRobot::IKSolver::CartesianSelection::Position;
382 if (mode ==
"Orientation")
384 return VirtualRobot::IKSolver::CartesianSelection::Orientation;
388 return VirtualRobot::IKSolver::CartesianSelection::All;
391 return (VirtualRobot::IKSolver::CartesianSelection)0;
394 CartesianSelectionMode::CartesianSelection
397 if (mode ==
"Position")
399 return CartesianSelectionMode::CartesianSelection::ePosition;
401 if (mode ==
"Orientation")
403 return CartesianSelectionMode::CartesianSelection::eOrientation;
407 return CartesianSelectionMode::CartesianSelection::eAll;
410 return (CartesianSelectionMode::CartesianSelection)0;
413 VirtualRobot::IKSolver::CartesianSelection
415 const CartesianSelectionMode::CartesianSelection mode)
417 if (mode == CartesianSelectionMode::CartesianSelection::ePosition)
419 return VirtualRobot::IKSolver::CartesianSelection::Position;
421 if (mode == CartesianSelectionMode::CartesianSelection::eOrientation)
423 return VirtualRobot::IKSolver::CartesianSelection::Orientation;
425 if (mode == CartesianSelectionMode::CartesianSelection::eAll)
427 return VirtualRobot::IKSolver::CartesianSelection::All;
430 return (VirtualRobot::IKSolver::CartesianSelection)0;
int Label(int n[], int size, int *curLabel, MiscLib::Vector< std::pair< int, size_t > > *labels)
#define DEFAULT_TCP_STRING
Brief description of class JointControlTargetBase.
WidgetDescription::VBoxLayoutPtr getLayout() const
void addSlider(const std::string &label, float min, float max, float value)
NJointCartesianVelocityControllerWithRamp(RobotUnit *robotUnit, const NJointCartesianVelocityControllerWithRampConfigPtr &config, const VirtualRobot::RobotPtr &)
void setMaxAccelerations(float maxPositionAcceleration, float maxOrientationAcceleration, float maxNullspaceAcceleration, const Ice::Current &=Ice::emptyCurrent) override
static WidgetDescription::WidgetPtr GenerateConfigDescription(const VirtualRobot::RobotPtr &, const std::map< std::string, ConstControlDevicePtr > &, const std::map< std::string, ConstSensorDevicePtr > &)
WidgetDescription::StringWidgetDictionary getFunctionDescriptions(const Ice::Current &) const override
static NJointCartesianVelocityControllerWithRampConfigPtr GenerateConfigFromVariants(const StringVariantBaseMap &values)
void immediateHardStop(const Ice::Current &) override
const std::string & getNodeSetName() const
static VirtualRobot::IKSolver::CartesianSelection ModeFromString(const std::string mode)
WidgetDescription::VBoxLayoutPtr createTargetLayout() const
static VirtualRobot::IKSolver::CartesianSelection ModeFromIce(const CartesianSelectionMode::CartesianSelection mode)
WidgetDescription::VBoxLayoutPtr createParameterLayout() const
void rtPostDeactivateController() override
This function is called after the controller is deactivated.
void rtRun(const IceUtil::Time &sensorValuesTimestamp, const IceUtil::Time &timeSinceLastIteration) override
TODO make protected and use attorneys.
void setJointLimitAvoidanceScale(float jointLimitAvoidanceScale, const Ice::Current &) override
void setKpJointLimitAvoidance(float KpJointLimitAvoidance, const Ice::Current &) override
void setTargetVelocity(float vx, float vy, float vz, float vrx, float vry, float vrz, const Ice::Current &) override
std::string getClassName(const Ice::Current &) const override
static CartesianSelectionMode::CartesianSelection IceModeFromString(const std::string mode)
void callDescribedFunction(const std::string &name, const StringVariantBaseMap &valueMap, const Ice::Current &) override
void rtPreActivateController() override
This function is called before the controller is activated.
const SensorValueBase * useSensorValue(const std::string &sensorDeviceName) const
Get a const ptr to the given SensorDevice's SensorValue.
const VirtualRobot::RobotPtr & useSynchronizedRtRobot(bool updateCollisionModel=false)
Requests a VirtualRobot for use in rtRun *.
const VirtualRobot::RobotPtr & rtGetRobot()
TODO make protected and use attorneys.
ControlTargetBase * useControlTarget(const std::string &deviceName, const std::string &controlMode)
Declares to calculate the ControlTarget for the given ControlDevice in the given ControlMode when rtR...
const NJointCartesianVelocityControllerWithRampControlData & rtGetControlStruct() const
MutexType controlDataMutex
std::lock_guard< std::recursive_mutex > LockGuardType
void writeControlStruct()
NJointCartesianVelocityControllerWithRampControlData & getWriterControlStruct()
The RobotUnit class manages a robot and its controllers.
The SensorValueBase class.
#define ARMARX_CHECK_EXPRESSION(expression)
This macro evaluates the expression and if it turns out to be false it will throw an ExpressionExcept...
#define ARMARX_ERROR_S
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
std::shared_ptr< class Robot > RobotPtr
This file offers overloads of toIce() and fromIce() functions for STL container types.
std::map< std::string, VariantBasePtr > StringVariantBaseMap
NJointControllerRegistration< NJointCartesianVelocityControllerWithRamp > registrationControllerNJointCartesianVelocityControllerWithRamp("NJointCartesianVelocityControllerWithRamp")
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)