26 #include <VirtualRobot/IK/DifferentialIK.h>
27 #include <VirtualRobot/Robot.h>
28 #include <VirtualRobot/RobotNodeSet.h>
32 #include "../RobotUnit.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();
123 if (mode == VirtualRobot::IKSolver::All)
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());
378 if (mode ==
"Position")
382 if (mode ==
"Orientation")
388 return VirtualRobot::IKSolver::CartesianSelection::All;
397 if (mode ==
"Position")
401 if (mode ==
"Orientation")
427 return VirtualRobot::IKSolver::CartesianSelection::All;