27 #include <VirtualRobot/math/Helpers.h>
36 std::lock_guard g{_allMutex};
43 Qt::QueuedConnection);
47 SLOT(onDisconnectComponentQt()),
48 Qt::QueuedConnection);
55 connect(_ui.pushButtonCreateController,
63 connect(_ui.checkBoxAutoKp,
64 SIGNAL(stateChanged(
int)),
67 connect(_ui.checkBoxSetOri,
68 SIGNAL(stateChanged(
int)),
71 connect(_ui.sliderPosVel,
72 SIGNAL(valueChanged(
int)),
77 [&](QPushButton* btn,
float px,
float py,
float pz,
float rx,
float ry,
float rz)
79 _deltaMapPos[btn] = {px, py, pz};
80 _deltaMapOri[btn] = {rx, ry, rz};
85 addBtn(_ui.pushButtonPxp, +1, 0, 0, 0, 0, 0);
86 addBtn(_ui.pushButtonPxn, -1, 0, 0, 0, 0, 0);
87 addBtn(_ui.pushButtonPyp, 0, +1, 0, 0, 0, 0);
88 addBtn(_ui.pushButtonPyn, 0, -1, 0, 0, 0, 0);
89 addBtn(_ui.pushButtonPzp, 0, 0, +1, 0, 0, 0);
90 addBtn(_ui.pushButtonPzn, 0, 0, -1, 0, 0, 0);
92 addBtn(_ui.pushButtonRxp, 0, 0, 0, +1, 0, 0);
93 addBtn(_ui.pushButtonRxn, 0, 0, 0, -1, 0, 0);
94 addBtn(_ui.pushButtonRyp, 0, 0, 0, 0, +1, 0);
95 addBtn(_ui.pushButtonRyn, 0, 0, 0, 0, -1, 0);
96 addBtn(_ui.pushButtonRzp, 0, 0, 0, 0, 0, +1);
97 addBtn(_ui.pushButtonRzn, 0, 0, 0, 0, 0, -1);
100 _timer = startTimer(100);
112 std::lock_guard g{_allMutex};
113 _robotStateComponentName =
114 settings->value(
"rsc",
"Armar6StateComponent").toString().toStdString();
115 _robotUnitName = settings->value(
"ru",
"Armar6Unit").toString().toStdString();
121 std::lock_guard g{_allMutex};
122 settings->setValue(
"rsc", QString::fromStdString(_robotStateComponentName));
123 settings->setValue(
"ru", QString::fromStdString(_robotUnitName));
129 std::lock_guard g{_allMutex};
137 std::lock_guard g{_allMutex};
140 _robotStateComponent =
141 getProxy<RobotStateComponentInterfacePrx>(_robotStateComponentName);
142 _robotUnit = getProxy<RobotUnitInterfacePrx>(_robotUnitName);
147 VirtualRobot::RobotIO::eStructure);
157 _ui.comboBoxSide->addItem(
"Right");
158 _ui.comboBoxSide->addItem(
"Left");
159 _ui.comboBoxSide->setCurrentIndex(0);
165 std::lock_guard g{_allMutex};
166 deleteOldController();
167 _robotStateComponent =
nullptr;
173 std::lock_guard g{_allMutex};
174 deleteOldController();
176 std::string side = _ui.comboBoxSide->currentText().toStdString();
178 VirtualRobot::RobotNodeSetPtr rns = _robot->getRobotNodeSet(side +
"Arm");
180 _ui.gridLayoutNullspaceTargets->removeWidget(_ui.checkBoxExampleJoint1);
181 _ui.gridLayoutNullspaceTargets->removeWidget(_ui.labelExampleJoint1);
182 _ui.gridLayoutNullspaceTargets->removeWidget(_ui.horizontalSliderExampleJoint1);
184 for (
size_t i = 0; i < rns->getSize(); i++)
186 QCheckBox* checkBox =
new QCheckBox(QString::fromStdString(rns->getNode(i)->getName()));
187 QSlider* slider =
new QSlider(Qt::Orientation::Horizontal);
188 slider->setMinimum(rns->getNode(i)->getJointLimitLo() /
M_PI * 180);
189 slider->setMaximum(rns->getNode(i)->getJointLimitHi() /
M_PI * 180);
190 slider->setValue(rns->getNode(i)->getJointValue() /
M_PI * 180);
191 QLabel* label =
new QLabel(QString::number(slider->value()));
192 _ui.gridLayoutNullspaceTargets->addWidget(checkBox, i, 0);
193 _ui.gridLayoutNullspaceTargets->addWidget(slider, i, 1);
194 _ui.gridLayoutNullspaceTargets->addWidget(label, i, 2);
196 SIGNAL(stateChanged(
int)),
200 SIGNAL(valueChanged(
int)),
208 _nullspaceTargets.emplace_back(nt);
212 VirtualRobot::RobotNodePtr cla = rns->getNode(0);
213 VirtualRobot::RobotNodePtr sho1 = rns->getNode(1);
215 cla->setJointValue(0);
216 Eigen::Vector3f shoulder = sho1->getPositionInRootFrame();
217 VirtualRobot::RobotNodePtr elb = rns->getNode(4);
218 VirtualRobot::RobotNodePtr wri1 = rns->getNode(6);
219 VirtualRobot::RobotNodePtr tcp = rns->getTCP();
227 std::vector<float> jointCosts = std::vector<float>(rns->getSize(), 1);
228 jointCosts.at(0) = 4;
232 _tcpTarget = rns->getTCP()->getPoseInRootFrame();
235 float upper_arm_length =
236 (sho1->getPositionInRootFrame() - elb->getPositionInRootFrame()).
norm();
237 float lower_arm_length =
238 (elb->getPositionInRootFrame() - wri1->getPositionInRootFrame()).
norm() +
239 (wri1->getPositionInRootFrame() - tcp->getPositionInRootFrame()).
norm();
242 NJointCartesianNaturalPositionControllerConfigPtr config =
244 config->runCfg.jointCosts = jointCosts;
245 CartesianNaturalPositionControllerConfig runCfg = config->runCfg;
246 updateKpSliders(runCfg);
249 ik, arm, _robotUnit, side +
"NaturalPosition", config));
258 std::lock_guard g{_allMutex};
259 Eigen::Vector3f deltaPos = _deltaMapPos.at(QObject::sender());
260 Eigen::Vector3f deltaOri = _deltaMapOri.at(QObject::sender());
261 newTarget = math::Helpers::TranslatePose(newTarget, deltaPos * _ui.spinBoxDpos->value());
262 if (deltaOri.norm() > 0)
264 deltaOri = deltaOri * _ui.spinBoxDori->value() / 180 *
M_PI;
265 Eigen::AngleAxisf aa(deltaOri.norm(), deltaOri.normalized());
269 updateTarget(newTarget);
273 CartesianNaturalPositionControllerWidgetController::updateTarget(
276 if (!_controller->setTarget(
281 _tcpTarget = newTarget;
282 if (_controller->getDynamicKp().enabled)
284 updateKpSliders(_controller->getRuntimeConfig());
289 CartesianNaturalPositionControllerWidgetController::readRunCfgFromUi(
290 CartesianNaturalPositionControllerConfig& runCfg)
292 runCfg.elbowKp = _ui.sliderKpElbow->value() * 0.01f;
293 runCfg.jointLimitAvoidanceKp = _ui.sliderKpJla->value() * 0.01f;
297 CartesianNaturalPositionControllerWidgetController::updateKpSliderLabels(
298 const CartesianNaturalPositionControllerConfig& runCfg)
300 _ui.labelKpElbow->setText(QString::number(runCfg.elbowKp,
'f', 2));
301 _ui.labelKpJla->setText(QString::number(runCfg.jointLimitAvoidanceKp,
'f', 2));
305 CartesianNaturalPositionControllerWidgetController::updateKpSliders(
306 const CartesianNaturalPositionControllerConfig& runCfg)
308 const QSignalBlocker blockKpElb(_ui.sliderKpElbow);
309 const QSignalBlocker blockKpJla(_ui.sliderKpJla);
310 _ui.sliderKpElbow->setValue(runCfg.elbowKp * 100);
311 _ui.sliderKpJla->setValue(runCfg.jointLimitAvoidanceKp * 100);
312 updateKpSliderLabels(runCfg);
319 CartesianNaturalPositionControllerConfig runCfg = _controller->getRuntimeConfig();
321 readRunCfgFromUi(runCfg);
322 updateKpSliderLabels(runCfg);
323 _controller->setRuntimeConfig(runCfg);
324 _controller->updateBaseKpValues(runCfg);
331 dynamicKp.
enabled = _ui.checkBoxAutoKp->isChecked();
332 _controller->setDynamicKp(dynamicKp);
333 if (_controller->getDynamicKp().enabled)
335 updateKpSliders(_controller->getRuntimeConfig());
342 _setOri = _ui.checkBoxSetOri->isChecked();
343 updateTarget(_tcpTarget);
347 CartesianNaturalPositionControllerWidgetController::updateNullspaceTargets()
349 std::vector<float> nsTargets;
350 for (
const NullspaceTarget& nt : _nullspaceTargets)
352 nsTargets.push_back(nt.checkBox->isChecked() ? nt.slider->value() *
M_PI / 180
354 nt.label->setText(QString::number(nt.slider->value()));
356 _controller->setNullspaceTarget(nsTargets);
362 updateNullspaceTargets();
368 updateNullspaceTargets();
374 _ui.labelPosVel->setText(QString::number(_ui.sliderPosVel->value()));
375 float posVel = _ui.sliderPosVel->value();
376 _controller->setMaxVelocities(posVel);
394 std::lock_guard g{_allMutex};
400 {
"rsc",
"Robot State Component",
"*Component"});
402 return qobject_cast<SimpleConfigDialog*>(_dialog);
408 std::lock_guard g{_allMutex};
409 _robotStateComponentName = _dialog->getProxyName(
"rsc");
410 _robotUnitName = _dialog->getProxyName(
"ru");
443 CartesianNaturalPositionControllerWidgetController::deleteOldController()
445 std::lock_guard g{_allMutex};
448 _controller->cleanup();
453 CartesianNaturalPositionControllerWidgetController::timerEvent(QTimerEvent*)
455 std::lock_guard g{_allMutex};
456 if (!_robot || !_robotStateComponent)
464 _controller->getInternalController()->setVisualizationRobotGlobalPose(
465 _robot->getGlobalPose());