29 #include <RobotAPI/gui-plugins/HandUnitPlugin/ui_HandUnitConfigDialog.h>
38 #include <QMessageBox>
39 #include <QPushButton>
44 #include <QtWidgets/QSlider>
45 #include <QtWidgets/QTableWidgetItem>
51 addWidget<HandUnitWidget>();
55 leftHandName(
"NOT SET YET"),
56 rightHandName(
"NOT SET YET"),
57 leftHandUnitProxyName(
""),
58 rightHandUnitProxyName(
""),
59 setLeftHandJointAnglesFlag(false),
60 setRightHandJointAnglesFlag(false)
69 setLeftHandJointAngleUpdateTask =
71 setRightHandJointAngleUpdateTask =
73 updateInfoTimer =
new QTimer(
this);
88 updateInfoTimer->start(50);
91 setLeftHandJointAngleUpdateTask->start();
93 leftHandUnitProxy = getProxy<HandUnitInterfacePrx>(leftHandUnitProxyName);
94 leftHandName = leftHandUnitProxy->getHandName();
96 if (leftHandName ==
"Hand L" || leftHandName ==
"TCP L")
98 leftHandConversionFactor *=
M_PI / 2;
100 else if (leftHandName !=
"Hand_L_EEF")
102 ARMARX_WARNING <<
"Left hand with name \"" << leftHandName <<
"\" is not supported.";
106 SingleTypeVariantListPtr::dynamicCast(leftHandUnitProxy->getShapeNames());
107 QStringList leftHandList;
108 int leftHandPreshapeCount = leftHandPreshapeStrings->getSize();
110 for (
int i = 0; i < leftHandPreshapeCount; ++i)
112 std::string shape = ((leftHandPreshapeStrings->getVariant(i))->get<std::string>());
114 leftHandList << QString::fromStdString(shape);
117 ui.comboLeftHandPreshapes->clear();
118 ui.comboLeftHandPreshapes->addItems(leftHandList);
121 setRightHandJointAngleUpdateTask->start();
123 rightHandUnitProxy = getProxy<HandUnitInterfacePrx>(rightHandUnitProxyName);
124 rightHandName = rightHandUnitProxy->getHandName();
126 if (rightHandName ==
"Hand R" || rightHandName ==
"TCP R")
128 rightHandConversionFactor *=
M_PI / 2;
130 else if (rightHandName !=
"Hand_R_EEF")
132 ARMARX_WARNING <<
"Right hand with name \"" << rightHandName <<
"\" is not supported.";
136 SingleTypeVariantListPtr::dynamicCast(rightHandUnitProxy->getShapeNames());
137 QStringList rightHandList;
138 int rightHandPreshapeCount = rightHandPreshapeStrings->getSize();
140 for (
int i = 0; i < rightHandPreshapeCount; ++i)
142 std::string shape = ((rightHandPreshapeStrings->getVariant(i))->get<std::string>());
144 rightHandList << QString::fromStdString(shape);
147 ui.comboRightHandPreshapes->clear();
148 ui.comboRightHandPreshapes->addItems(rightHandList);
153 displayJointAngleUpdateTask =
155 displayJointAngleUpdateTask->start();
163 setLeftHandJointAngleUpdateTask->stop();
164 setRightHandJointAngleUpdateTask->stop();
165 displayJointAngleUpdateTask->stop();
166 updateInfoTimer->stop();
184 return qobject_cast<HandUnitConfigDialog*>(dialog);
190 leftHandUnitProxyName = dialog->proxyFinderLeftHand->getSelectedProxyName().toStdString();
191 rightHandUnitProxyName = dialog->proxyFinderRightHand->getSelectedProxyName().toStdString();
197 setLeftHandPreshape(
ui.comboLeftHandPreshapes->currentText().toUtf8().data());
203 setRightHandPreshape(
ui.comboRightHandPreshapes->currentText().toUtf8().data());
209 ARMARX_INFO <<
"Reloading preshapes in robot unit ...";
213 if (leftHandUnitProxy)
215 ARMARX_INFO <<
"Left hand unit: reloading preshapes.";
216 leftHandUnitProxy->reloadPreshapes();
222 if (rightHandUnitProxy)
224 ARMARX_INFO <<
"Right hand unit: reloading preshapes.";
225 rightHandUnitProxy->reloadPreshapes();
234 if (!leftHandUnitProxy)
240 if (!setLeftHandJointAnglesFlag)
245 setLeftHandJointAnglesFlag =
false;
248 NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues();
250 if (leftHandName ==
"Hand L" || leftHandName ==
"TCP L")
252 leftHandConversionFactor *=
M_PI / 2;
254 else if (leftHandName !=
"Hand_L_EEF")
256 ARMARX_WARNING <<
"Left hand with name \"" << leftHandName <<
"\" is not supported.";
260 for (
const auto& pair : currentLeftHandJointValues)
262 if (pair.first == currentLeftHandJoint)
264 value =
static_cast<float>(
ui.horizontalSliderLeftHandJointPos->value() *
265 leftHandConversionFactor);
267 leftHandJa[pair.first] =
value;
273 ui.lcdNumberLeftHandJointValue->display(
value / leftHandConversionFactor);
274 leftHandUnitProxy->setJointAngles(leftHandJa);
281 if (!rightHandUnitProxy)
287 if (!setRightHandJointAnglesFlag)
292 setRightHandJointAnglesFlag =
false;
295 NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues();
297 if (rightHandName ==
"Hand R" || rightHandName ==
"TCP R")
299 rightHandConversionFactor *=
M_PI / 2;
301 else if (rightHandName !=
"Hand_R_EEF")
303 ARMARX_WARNING <<
"Right hand with name \"" << rightHandName <<
"\" is not supported.";
307 for (
const auto& pair : currentRightHandJointValues)
309 if (pair.first == currentRightHandJoint)
311 value =
static_cast<float>(
ui.horizontalSliderRightHandJointPos->value() *
312 rightHandConversionFactor);
314 rightHandJa[pair.first] =
value;
320 ui.lcdNumberRightHandJointValue->display(
value / rightHandConversionFactor);
321 rightHandUnitProxy->setJointAngles(rightHandJa);
327 setLeftHandJointAnglesFlag =
true;
333 setRightHandJointAnglesFlag =
true;
339 setLeftHandPreshape(
"Open");
345 setRightHandPreshape(
"Open");
351 setLeftHandPreshape(
"Close");
357 setRightHandPreshape(
"Close");
363 setLeftHandPreshape(
"Relax");
369 setRightHandPreshape(
"Relax");
375 ui.labelInfoLeftHand->setText(
376 QString::fromStdString(leftHandUnitProxyName +
" :: " + leftHandName +
377 " State: " + leftHandUnitProxy->describeHandState()));
378 ui.labelInfoRightHand->setText(
379 QString::fromStdString(rightHandUnitProxyName +
" :: " + rightHandName +
380 " State: " + rightHandUnitProxy->describeHandState()));
386 NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues();
388 int frameLeftHandRowIdx = 0;
390 for (
const auto& pair : currentLeftHandJointValues)
393 QString name(pair.first.c_str());
394 QTableWidgetItem* newItem =
new QTableWidgetItem(QString::number(pair.second));
395 ui.tableWidgetLeftHand->setItem(frameLeftHandRowIdx, 1, newItem);
396 frameLeftHandRowIdx++;
400 NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues();
402 int frameRightHandRowIdx = 0;
404 for (
const auto& pair : currentRightHandJointValues)
407 QString name(pair.first.c_str());
408 QTableWidgetItem* newItem =
new QTableWidgetItem(QString::number(pair.second));
409 ui.tableWidgetRightHand->setItem(frameRightHandRowIdx, 1, newItem);
410 frameRightHandRowIdx++;
417 bool const isExpert = state == Qt::Checked;
421 ui.leftTare->setEnabled(isExpert);
422 ui.leftReset->setEnabled(isExpert);
426 ui.rightTare->setEnabled(isExpert);
427 ui.rightReset->setEnabled(isExpert);
441 leftHandUnitProxy->tare();
446 rightHandUnitProxy->tare();
459 ARMARX_INFO <<
"Trigger resetting left hand firmware now...";
460 leftHandUnitProxy->resetFirmware();
464 ARMARX_INFO <<
"Trigger resetting right hand firmware now...";
465 rightHandUnitProxy->resetFirmware();
477 NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues();
480 for (
const auto& pair : currentLeftHandJointValues)
484 currentLeftHandJoint = pair.first;
485 int convertedValue =
static_cast<int>(pair.second / leftHandConversionFactor);
486 ui.horizontalSliderLeftHandJointPos->setSliderPosition(convertedValue);
487 ui.lcdNumberLeftHandJointValue->display(convertedValue);
499 NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues();
502 for (
const auto& pair : currentRightHandJointValues)
506 currentRightHandJoint = pair.first;
507 int convertedValue =
static_cast<int>(pair.second / rightHandConversionFactor);
508 ui.horizontalSliderRightHandJointPos->setSliderPosition(convertedValue);
509 ui.lcdNumberRightHandJointValue->display(convertedValue);
518 HandUnitWidget::setLeftHandPreshape(std::string preshape)
521 leftHandUnitProxy->setShape(preshape);
525 HandUnitWidget::setRightHandPreshape(std::string preshape)
528 rightHandUnitProxy->setShape(preshape);
534 leftHandUnitProxyName =
535 settings->value(
"leftHandUnitProxyName", QString::fromStdString(leftHandUnitProxyName))
538 leftHandName = settings->value(
"leftHandName", QString::fromStdString(leftHandName))
541 rightHandUnitProxyName =
543 ->value(
"rightHandUnitProxyName", QString::fromStdString(rightHandUnitProxyName))
546 rightHandName = settings->value(
"rightHandName", QString::fromStdString(rightHandName))
554 settings->setValue(
"leftHandUnitProxyName", QString::fromStdString(leftHandUnitProxyName));
555 settings->setValue(
"leftHandName", QString::fromStdString(leftHandName));
556 settings->setValue(
"rightHandUnitProxyName",
557 QString::fromStdString(rightHandUnitProxyName));
558 settings->setValue(
"rightHandName", QString::fromStdString(rightHandName));
566 NameValueMap currentLeftHandJointValues = leftHandUnitProxy->getCurrentJointValues();
568 int frameLeftHandRowIdx = 0;
570 connect(
ui.buttonPreshapeLeftHand,
574 Qt::UniqueConnection);
575 connect(
ui.buttonOpenLeftHand,
579 Qt::UniqueConnection);
580 connect(
ui.buttonCloseLeftHand,
584 Qt::UniqueConnection);
585 connect(
ui.buttonRelaxLeftHand,
589 Qt::UniqueConnection);
590 ui.horizontalSliderLeftHandJointPos->setMaximum(100);
591 ui.horizontalSliderLeftHandJointPos->setMinimum(0);
592 connect(
ui.horizontalSliderLeftHandJointPos,
593 SIGNAL(sliderMoved(
int)),
596 Qt::UniqueConnection);
597 connect(
ui.comboLeftHandJoints,
598 SIGNAL(currentIndexChanged(
int)),
601 Qt::UniqueConnection);
602 connect(
ui.leftExpertMode,
603 &QCheckBox::stateChanged,
604 [&](
int state) { setExpertMode(side::left, state); });
605 connect(
ui.leftTare, &QPushButton::clicked, [&] { tareHand(side::left); });
606 connect(
ui.leftReset, &QPushButton::clicked, [&] { resetHand(side::left); });
608 ui.tableWidgetLeftHand->setRowCount(currentLeftHandJointValues.size());
609 ui.tableWidgetLeftHand->setColumnCount(2);
611 ui.comboLeftHandJoints->clear();
613 qRegisterMetaType<QVector<int>>(
"QVector<int>");
614 for (
const auto& pair : currentLeftHandJointValues)
617 QString name(pair.first.c_str());
618 QTableWidgetItem* newItem =
new QTableWidgetItem(name);
619 ui.tableWidgetLeftHand->setItem(frameLeftHandRowIdx, 0, newItem);
620 ui.comboLeftHandJoints->addItem(name);
621 frameLeftHandRowIdx++;
624 ui.comboLeftHandJoints->setCurrentIndex(-1);
627 NameValueMap currentRightHandJointValues = rightHandUnitProxy->getCurrentJointValues();
629 int frameRightHandRowIdx = 0;
631 connect(
ui.buttonPreshapeRightHand,
635 Qt::UniqueConnection);
636 connect(
ui.buttonOpenRightHand,
640 Qt::UniqueConnection);
641 connect(
ui.buttonCloseRightHand,
645 Qt::UniqueConnection);
646 connect(
ui.buttonRelaxRightHand,
650 Qt::UniqueConnection);
651 ui.horizontalSliderRightHandJointPos->setMaximum(100);
652 ui.horizontalSliderRightHandJointPos->setMinimum(0);
653 connect(
ui.horizontalSliderRightHandJointPos,
654 SIGNAL(sliderMoved(
int)),
657 Qt::UniqueConnection);
658 connect(
ui.comboRightHandJoints,
659 SIGNAL(currentIndexChanged(
int)),
662 Qt::UniqueConnection);
663 connect(
ui.rightExpertMode,
664 &QCheckBox::stateChanged,
665 [&](
int state) { setExpertMode(side::right, state); });
666 connect(
ui.rightTare, &QPushButton::clicked, [&] { tareHand(side::right); });
667 connect(
ui.rightReset, &QPushButton::clicked, [&] { resetHand(side::right); });
669 ui.tableWidgetRightHand->setRowCount(currentRightHandJointValues.size());
670 ui.tableWidgetRightHand->setColumnCount(2);
672 ui.comboRightHandJoints->clear();
674 qRegisterMetaType<QVector<int>>(
"QVector<int>");
675 for (
const auto& pair : currentRightHandJointValues)
678 QString name(pair.first.c_str());
679 QTableWidgetItem* newItem =
new QTableWidgetItem(name);
680 ui.tableWidgetRightHand->setItem(frameRightHandRowIdx, 0, newItem);
681 ui.comboRightHandJoints->addItem(name);
682 frameRightHandRowIdx++;
685 ui.comboRightHandJoints->setCurrentIndex(-1);
689 connect(
ui.reloadPreshapesButton,
693 Qt::UniqueConnection);
698 const std::string& handShapeName,
706 const std::string& handShapeName,
714 const Ice::Current&
c)
720 const Ice::Current&
c)