26#include <RobotAPI/gui-plugins/KinematicUnitPlugin/ui_kinematicunitguiplugin.h>
28#include <SimoxUtility/algorithm/string.h>
29#include <SimoxUtility/json.h>
30#include <VirtualRobot/Nodes/RobotNode.h>
31#include <VirtualRobot/Robot.h>
32#include <VirtualRobot/RobotNodeSet.h>
33#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualization.h>
34#include <VirtualRobot/Visualization/VisualizationFactory.h>
35#include <VirtualRobot/XML/RobotIO.h>
50#include <RobotAPI/gui-plugins/KinematicUnitPlugin/ui_KinematicUnitConfigDialog.h>
51#include <RobotAPI/interface/core/NameValueMap.h>
52#include <RobotAPI/interface/units/KinematicUnitInterface.h>
59#include <QInputDialog>
65#include <QTableWidget>
72#include <Inventor/Qt/SoQt.h>
73#include <Inventor/SoDB.h>
90#define KINEMATIC_UNIT_NAME_DEFAULT "Robot"
103 qRegisterMetaType<DebugInfo>(
"DebugInfo");
110 enableValueValidator(true),
112 currentValueMax(5.0f)
118 ui = std::make_unique<Ui::KinematicUnitGuiPlugin>();
124 ui->radioButtonUnknown->setHidden(
true);
141 std::string debugDrawerComponentName =
"KinemticUnitGUIDebugDrawer_" +
getName();
142 ARMARX_INFO <<
"Creating component " << debugDrawerComponentName;
162 std::unique_lock lock(*
mutex3D);
178 jointCurrentHistory.clear();
179 jointCurrentHistory.set_capacity(5);
190 Ice::StringSeq includePaths;
199 for (
const std::string& projectName : packages)
201 if (projectName.empty())
207 auto pathsString = project.getDataDir();
208 ARMARX_VERBOSE <<
"Data paths of ArmarX package " << projectName <<
": "
210 Ice::StringSeq projectIncludePaths =
Split(pathsString,
";,",
true,
true);
211 ARMARX_VERBOSE <<
"Result: Data paths of ArmarX package " << projectName <<
": "
212 << projectIncludePaths;
214 includePaths.end(), projectIncludePaths.begin(), projectIncludePaths.end());
231 ARMARX_INFO <<
"Loading robot from file " << rfile;
232 robot = loadRobotFile(rfile);
234 catch (
const std::exception& e)
254 if (not simox::alg::starts_with(
robot->getName(),
"Armar3"))
256 ARMARX_VERBOSE <<
"Disable the SetZero button because the robot name is '"
257 <<
robot->getName() <<
"'.";
258 ui->pushButtonKinematicUnitPos1->setDisabled(
true);
278 QMetaObject::invokeMethod(
this,
"resetSlider");
297 ARMARX_INFO <<
"Connection to kinemetic unit lost. Update task terminates.";
316 std::unique_lock lock(mutexNodeSet);
323 std::unique_lock lock(*
mutex3D);
344 std::unique_lock lock(*
mutex3D);
384 dialog->setName(dialog->getDefaultName());
387 return qobject_cast<KinematicUnitConfigDialog*>(dialog);
395 enableValueValidator = dialog->ui->checkBox->isChecked();
396 viewerEnabled = dialog->ui->checkBox3DViewerEnabled->isChecked();
397 historyTime = dialog->ui->spinBoxHistory->value() * 1000;
398 currentValueMax = dialog->ui->doubleSpinBoxMaxMinCurrent->value();
407 enableValueValidator = settings->value(
"enableValueValidator",
true).toBool();
408 viewerEnabled = settings->value(
"viewerEnabled",
true).toBool();
409 historyTime = settings->value(
"historyTime", 100).toInt() * 1000;
410 currentValueMax = settings->value(
"currentValueMax", 5.0).toFloat();
416 settings->setValue(
"kinematicUnitName", QString::fromStdString(
kinematicUnitName));
417 settings->setValue(
"enableValueValidator", enableValueValidator);
418 settings->setValue(
"viewerEnabled", viewerEnabled);
419 assert(historyTime % 1000 == 0);
420 settings->setValue(
"historyTime",
static_cast<int>(historyTime / 1000));
421 settings->setValue(
"currentValueMax", currentValueMax);
445 std::unique_lock lock(mutexNodeSet);
452 if (selectedControlMode == ePositionControl)
454 values = debugInfo.jointAngles;
456 else if (selectedControlMode == eVelocityControl)
458 values = debugInfo.jointVelocities;
463 for (
auto& kv : values)
465 serializer->setFloat(kv.first, kv.second);
467 const QString json = QString::fromStdString(serializer->asString(
true));
468 QClipboard* clipboard = QApplication::clipboard();
469 clipboard->setText(json);
470 QApplication::processEvents();
499 ARMARX_INFO <<
"viewer disabled - returning null scene";
507 connect(
ui->pushButtonKinematicUnitPos1,
510 SLOT(kinematicUnitZeroPosition()));
513 ui->nodeListComboBox, SIGNAL(currentIndexChanged(
int)),
this, SLOT(
selectJoint(
int)));
514 connect(
ui->horizontalSliderKinematicUnitPos,
515 SIGNAL(valueChanged(
int)),
519 connect(
ui->horizontalSliderKinematicUnitPos,
520 SIGNAL(sliderReleased()),
524 connect(
ui->radioButtonPositionControl,
525 SIGNAL(clicked(
bool)),
528 connect(
ui->radioButtonVelocityControl,
529 SIGNAL(clicked(
bool)),
538 connect(
ui->showDebugLayer,
539 SIGNAL(toggled(
bool)),
542 Qt::QueuedConnection);
548 Qt::QueuedConnection);
553 Qt::QueuedConnection);
558 Qt::QueuedConnection);
563 Qt::QueuedConnection);
568 Qt::QueuedConnection);
573 Qt::QueuedConnection);
578 Qt::QueuedConnection);
580 connect(
ui->tableJointList,
581 SIGNAL(cellDoubleClicked(
int,
int)),
584 Qt::QueuedConnection);
586 connect(
ui->checkBoxUseDegree,
590 Qt::QueuedConnection);
609 ui->widgetSliderFactor->setVisible(
false);
622 std::unique_lock lock(mutexNodeSet);
623 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
625 NameControlModeMap jointModes;
627 for (
unsigned int i = 0; i < rn.size(); i++)
629 jointModes[rn[i]->getName()] = eVelocityControl;
630 vels[rn[i]->getName()] = 0.0f;
643 if (selectedControlMode == eVelocityControl)
645 ui->horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION);
654 if (selectedControlMode == eVelocityControl || selectedControlMode == eTorqueControl)
658 else if (selectedControlMode == ePositionControl)
665 const bool isDeg =
ui->checkBoxUseDegree->isChecked();
668 const float conversionFactor = isDeg ? 180.0 /
M_PI : 1.0f;
669 const float pos =
currentNode->getJointValue() * conversionFactor;
671 ui->lcdNumberKinematicUnitJointValue->display((
int)pos);
672 ui->horizontalSliderKinematicUnitPos->setSliderPosition((
int)(pos * factor));
680 ui->lcdNumberKinematicUnitJointValue->display((
int)pos);
681 ui->horizontalSliderKinematicUnitPos->setSliderPosition((
int)(pos * factor));
692 if (selectedControlMode == eVelocityControl || selectedControlMode == eTorqueControl)
694 ui->horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION);
695 ui->lcdNumberKinematicUnitJointValue->display(SLIDER_ZERO_POSITION);
702 ARMARX_VERBOSE <<
"Setting control mode of radio button group to " << controlMode;
708 case ePositionVelocityControl:
709 ui->radioButtonUnknown->setChecked(
true);
711 case ePositionControl:
712 ui->radioButtonPositionControl->setChecked(
true);
714 case eVelocityControl:
715 ui->radioButtonVelocityControl->setChecked(
true);
718 ui->radioButtonTorqueControl->setChecked(
true);
726 if (!
ui->radioButtonPositionControl->isChecked())
730 NameControlModeMap jointModes;
732 ui->widgetSliderFactor->setVisible(
false);
738 const QString unit = [&]() -> QString
743 if (
ui->checkBoxUseDegree->isChecked())
756 throw std::invalid_argument(
"unknown/unsupported joint type");
759 ui->labelUnit->setText(unit);
762 const auto [factor, conversionFactor] = [&]() -> std::pair<float, float>
767 const bool isDeg =
ui->checkBoxUseDegree->isChecked();
780 throw std::invalid_argument(
"unknown/unsupported joint type");
783 jointModes[
currentNode->getName()] = ePositionControl;
790 const float lo =
currentNode->getJointLimitLo() * conversionFactor;
791 const float hi =
currentNode->getJointLimitHi() * conversionFactor;
807 const float pos =
currentNode->getJointValue() * conversionFactor;
808 ARMARX_INFO <<
"Setting position control for current node "
809 <<
"(name '" <<
currentNode->getName() <<
"' with current value " << pos
814 ui->horizontalSliderKinematicUnitPos->blockSignals(
true);
816 const float sliderMax =
hi * factor;
817 const float sliderMin =
lo * factor;
819 ui->horizontalSliderKinematicUnitPos->setMaximum(sliderMax);
820 ui->horizontalSliderKinematicUnitPos->setMinimum(sliderMin);
822 const std::size_t desiredNumberOfTicks = 1'000;
824 const float tickInterval = (sliderMax - sliderMin) / desiredNumberOfTicks;
827 ui->horizontalSliderKinematicUnitPos->setTickInterval(tickInterval);
828 ui->lcdNumberKinematicUnitJointValue->display(pos);
830 ui->horizontalSliderKinematicUnitPos->blockSignals(
false);
838 if (!
ui->radioButtonVelocityControl->isChecked())
842 NameControlModeMap jointModes;
843 NameValueMap jointVelocities;
847 jointModes[
currentNode->getName()] = eVelocityControl;
853 const QString unit = [&]() -> QString
858 if (
ui->checkBoxUseDegree->isChecked())
863 return "rad/(100*s)";
871 throw std::invalid_argument(
"unknown/unsupported joint type");
875 ui->labelUnit->setText(unit);
876 ARMARX_INFO <<
"setting velocity control for current Node Name: "
879 const bool isDeg =
ui->checkBoxUseDegree->isChecked();
880 const bool isRot =
currentNode->isRotationalJoint() or
883 const float lo = isRot ? (isDeg ? -90 : -
M_PI * 100) : -1000;
884 const float hi = isRot ? (isDeg ? +90 : +
M_PI * 100) : 1000;
898 ui->widgetSliderFactor->setVisible(
true);
900 ui->horizontalSliderKinematicUnitPos->blockSignals(
true);
901 ui->horizontalSliderKinematicUnitPos->setMaximum(
hi);
902 ui->horizontalSliderKinematicUnitPos->setMinimum(
lo);
903 ui->horizontalSliderKinematicUnitPos->blockSignals(
false);
911 if (
ui->radioButtonPositionControl->isChecked())
913 return ControlMode::ePositionControl;
916 if (
ui->radioButtonVelocityControl->isChecked())
918 return ControlMode::eVelocityControl;
921 if (
ui->radioButtonTorqueControl->isChecked())
923 return ControlMode::eTorqueControl;
928 return ControlMode::eUnknown;
934 if (!
ui->radioButtonTorqueControl->isChecked())
938 NameControlModeMap jointModes;
942 jointModes[
currentNode->getName()] = eTorqueControl;
943 ui->labelUnit->setText(
"Ncm");
944 ARMARX_INFO <<
"setting torque control for current Node Name: "
958 ui->horizontalSliderKinematicUnitPos->blockSignals(
true);
959 ui->horizontalSliderKinematicUnitPos->setMaximum(20000.0);
960 ui->horizontalSliderKinematicUnitPos->setMinimum(-20000.0);
962 ui->widgetSliderFactor->setVisible(
true);
964 ui->horizontalSliderKinematicUnitPos->blockSignals(
false);
970 KinematicUnitWidgetController::loadRobotFile(std::string fileName)
982 ARMARX_INFO <<
"Could not find Robot XML file with name " << fileName <<
flush;
985 robot = VirtualRobot::RobotIO::loadRobot(fileName);
989 ARMARX_INFO <<
"Could not find Robot XML file with name " << fileName <<
"("
996 VirtualRobot::CoinVisualizationPtr
999 VirtualRobot::CoinVisualizationPtr coinVisualization;
1004 coinVisualization =
robot->getVisualization();
1006 if (!coinVisualization || !coinVisualization->getCoinVisualization())
1012 return coinVisualization;
1015 VirtualRobot::RobotNodeSetPtr
1017 std::string nodeSetName)
1019 VirtualRobot::RobotNodeSetPtr nodeSetPtr;
1023 nodeSetPtr =
robot->getRobotNodeSet(nodeSetName);
1027 ARMARX_INFO <<
"RobotNodeSet with name " << nodeSetName <<
" is not defined"
1036 KinematicUnitWidgetController::initGUIComboBox(VirtualRobot::RobotNodeSetPtr robotNodeSet)
1038 ui->nodeListComboBox->clear();
1042 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1044 for (
unsigned int i = 0; i < rn.size(); i++)
1047 QString name(rn[i]->
getName().c_str());
1048 ui->nodeListComboBox->addItem(name);
1050 ui->nodeListComboBox->setCurrentIndex(-1);
1057 KinematicUnitWidgetController::initGUIJointListTable(VirtualRobot::RobotNodeSetPtr robotNodeSet)
1059 uint numberOfColumns = 10;
1068 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1074 ui->tableJointList->setRowCount(rn.size());
1086 <<
"Angle [deg]/Position [mm]"
1087 <<
"Velocity [deg/s]/[mm/s]"
1088 <<
"Torque [Nm] / PWM"
1090 <<
"Temperature [C]"
1094 <<
"Emergency Stop";
1095 ui->tableJointList->setHorizontalHeaderLabels(s);
1097 <<
"Current table size: " <<
ui->tableJointList->columnCount();
1101 for (
unsigned int i = 0; i < rn.size(); i++)
1104 QString name(rn[i]->
getName().c_str());
1106 QTableWidgetItem* newItem =
new QTableWidgetItem(name);
1111 for (
unsigned int i = 0; i < rn.size(); i++)
1113 for (
unsigned int j = 1; j < numberOfColumns; j++)
1115 QString state =
"--";
1116 QTableWidgetItem* newItem =
new QTableWidgetItem(state);
1117 ui->tableJointList->setItem(i, j, newItem);
1138 std::unique_lock lock(mutexNodeSet);
1140 ARMARX_INFO <<
"Selected index: " <<
ui->nodeListComboBox->currentIndex();
1151 if (controlModes.count(
currentNode->getName()) == 0)
1154 <<
"` from kinematic unit!";
1158 const auto controlMode = controlModes.at(
currentNode->getName());
1161 if (controlMode == ePositionControl)
1165 else if (controlMode == eVelocityControl)
1168 ui->horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION);
1170 else if (controlMode == eTorqueControl)
1173 ui->horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION);
1182 ui->nodeListComboBox->setCurrentIndex(row);
1190 std::unique_lock lock(mutexNodeSet);
1197 const float value =
static_cast<float>(
ui->horizontalSliderKinematicUnitPos->value());
1201 const bool isDeg =
ui->checkBoxUseDegree->isChecked();
1205 if (currentControlMode == ePositionControl)
1209 float conversionFactor = isRot && isDeg ? 180.0 /
M_PI : 1.0f;
1211 NameValueMap jointAngles;
1213 jointAngles[
currentNode->getName()] = value / conversionFactor / factor;
1214 ui->lcdNumberKinematicUnitJointValue->display(value / factor);
1226 else if (currentControlMode == eVelocityControl)
1228 float conversionFactor = isRot ? (isDeg ? 180.0 /
M_PI : 100.f) : 1.0f;
1229 NameValueMap jointVelocities;
1231 value / conversionFactor *
1232 static_cast<float>(
ui->doubleSpinBoxKinematicUnitPosFactor->value());
1233 ui->lcdNumberKinematicUnitJointValue->display(value);
1246 else if (currentControlMode == eTorqueControl)
1248 NameValueMap jointTorques;
1249 float torqueTargetValue =
1251 static_cast<float>(
ui->doubleSpinBoxKinematicUnitPosFactor->value());
1252 jointTorques[
currentNode->getName()] = torqueTargetValue;
1253 ui->lcdNumberKinematicUnitJointValue->display(torqueTargetValue);
1274 const NameControlModeMap& reportedJointControlModes)
1281 std::unique_lock lock(mutexNodeSet);
1282 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1284 for (
unsigned int i = 0; i < rn.size(); i++)
1286 NameControlModeMap::const_iterator it;
1287 it = reportedJointControlModes.find(rn[i]->
getName());
1290 if (it == reportedJointControlModes.end())
1296 ControlMode currentMode = it->second;
1299 switch (currentMode)
1317 case ePositionControl:
1321 case eVelocityControl:
1325 case eTorqueControl:
1330 case ePositionVelocityControl:
1331 state =
"Position + Velocity";
1336 state = QString(
"<nyi Mode: %1>").arg(
static_cast<int>(currentMode));
1341 QTableWidgetItem* newItem =
new QTableWidgetItem(state);
1348 const NameStatusMap& reportedJointStatuses)
1355 std::unique_lock lock(mutexNodeSet);
1356 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1358 for (
unsigned int i = 0; i < rn.size(); i++)
1361 auto it = reportedJointStatuses.find(rn[i]->
getName());
1362 if (it == reportedJointStatuses.end())
1365 << rn[i]->getName() <<
" was not reported!";
1368 JointStatus currentStatus = it->second;
1371 QTableWidgetItem* newItem =
new QTableWidgetItem(state);
1375 newItem =
new QTableWidgetItem(state);
1378 state = currentStatus.enabled ?
"yes" :
"no";
1379 newItem =
new QTableWidgetItem(state);
1382 state = currentStatus.emergencyStop ?
"yes" :
"no";
1383 newItem =
new QTableWidgetItem(state);
1406 return "Initialized";
1435 std::unique_lock lock(mutexNodeSet);
1441 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1444 for (
unsigned int i = 0; i < rn.size(); i++)
1446 NameValueMap::const_iterator it;
1447 VirtualRobot::RobotNodePtr node = rn[i];
1448 it = reportedJointAngles.find(node->getName());
1450 if (it == reportedJointAngles.end())
1455 const float currentValue = it->second;
1458 float conversionFactor =
ui->checkBoxUseDegree->isChecked() &&
1459 (node->isRotationalJoint() or
1460 node->isHemisphereJoint() or node->isFourBarJoint())
1463 ui->tableJointList->model()->setData(
1465 (
int)(cutJitter(currentValue * conversionFactor) * 100) / 100.0f,
1467 ui->tableJointList->model()->setData(
1469 ui->tableJointList->model()->setData(
1476 const NameValueMap& reportedJointVelocities)
1483 std::unique_lock lock(mutexNodeSet);
1488 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1489 QTableWidgetItem* newItem;
1491 for (
unsigned int i = 0; i < rn.size(); i++)
1493 NameValueMap::const_iterator it;
1494 it = reportedJointVelocities.find(rn[i]->
getName());
1496 if (it == reportedJointVelocities.end())
1501 float currentValue = it->second;
1502 if (
ui->checkBoxUseDegree->isChecked() &&
1503 (rn[i]->isRotationalJoint() or rn[i]->isHemisphereJoint() or
1504 rn[i]->isFourBarJoint()))
1506 currentValue *= 180.0 /
M_PI;
1508 const QString Text = QString::number(cutJitter(currentValue),
'g', 2);
1509 newItem =
new QTableWidgetItem(Text);
1519 std::unique_lock lock(mutexNodeSet);
1524 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1525 QTableWidgetItem* newItem;
1526 NameValueMap::const_iterator it;
1528 for (
unsigned int i = 0; i < rn.size(); i++)
1530 it = reportedJointTorques.find(rn[i]->
getName());
1532 if (it == reportedJointTorques.end())
1537 const float currentValue = it->second;
1538 newItem =
new QTableWidgetItem(QString::number(cutJitter(currentValue)));
1545 const NameValueMap& reportedJointCurrents,
1546 const NameStatusMap& reportedJointStatuses)
1550 std::unique_lock lock(mutexNodeSet);
1555 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1556 QTableWidgetItem* newItem;
1560 NameValueMap::const_iterator it;
1562 for (
unsigned int i = 0; i < rn.size(); i++)
1564 it = reportedJointCurrents.find(rn[i]->
getName());
1566 if (it == reportedJointCurrents.end())
1571 const float currentValue = it->second;
1572 newItem =
new QTableWidgetItem(QString::number(cutJitter(currentValue)));
1581 const NameValueMap& reportedJointTemperatures)
1585 std::unique_lock lock(mutexNodeSet);
1590 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1591 QTableWidgetItem* newItem;
1592 NameValueMap::const_iterator it;
1594 for (
unsigned int i = 0; i < rn.size(); i++)
1596 it = reportedJointTemperatures.find(rn[i]->
getName());
1598 if (it == reportedJointTemperatures.end())
1603 const float currentValue = it->second;
1604 newItem =
new QTableWidgetItem(QString::number(cutJitter(currentValue)));
1614 std::unique_lock lock(mutexNodeSet);
1619 robot->setJointValues(reportedJointAngles);
1622 std::optional<float>
1623 mean(
const boost::circular_buffer<NameValueMap>& buffer,
const std::string& key)
1626 std::size_t count = 0;
1628 for (
const auto& element : buffer)
1630 if (element.count(key) > 0)
1632 sum += element.at(key);
1638 return std::nullopt;
1641 return sum /
static_cast<float>(count);
1646 const NameStatusMap& reportedJointStatuses)
1648 if (!enableValueValidator)
1653 std::unique_lock lock(mutexNodeSet);
1655 std::vector<VirtualRobot::RobotNodePtr> rn =
robotNodeSet->getAllRobotNodes();
1658 static std::vector<QBrush> standardColors;
1659 if (standardColors.size() == 0)
1661 for (
unsigned int i = 0; i < rn.size(); i++)
1664 standardColors.push_back(
1670 for (
unsigned int i = 0; i < rn.size(); i++)
1672 const auto& jointName = rn[i]->getName();
1674 const auto currentSmoothValOpt =
mean(jointCurrentHistory, jointName);
1675 if (not currentSmoothValOpt.has_value())
1680 const float smoothValue = std::fabs(currentSmoothValOpt.value());
1682 if (jointCurrentHistory.front().count(jointName) == 0)
1687 const float startValue = jointCurrentHistory.front().at(jointName);
1688 const bool isStatic = (smoothValue == startValue);
1690 NameStatusMap::const_iterator it;
1691 it = reportedJointStatuses.find(rn[i]->
getName());
1692 JointStatus currentStatus = it->second;
1696 if (currentStatus.operation != eOffline)
1702 else if (std::abs(smoothValue) > currentValueMax)
1731 customToolbar->setParent(parent);
1735 customToolbar =
new QToolBar(parent);
1738 return customToolbar.data();
1742 KinematicUnitWidgetController::cutJitter(
float value)
1744 return (
abs(value) <
static_cast<float>(
ui->jitterThresholdSpinBox->value())) ? 0 : value;
1780 RangeValueDelegate::paint(QPainter* painter,
1781 const QStyleOptionViewItem&
option,
1782 const QModelIndex&
index)
const
1790 if (hiDeg - loDeg <= 0)
1792 QStyledItemDelegate::paint(painter,
option,
index);
1796 QStyleOptionProgressBar progressBarOption;
1797 progressBarOption.rect =
option.rect;
1798 progressBarOption.minimum = loDeg;
1799 progressBarOption.maximum = hiDeg;
1800 progressBarOption.progress = jointValue;
1801 progressBarOption.text = QString::number(jointValue);
1802 progressBarOption.textVisible =
true;
1804 pal.setColor(QPalette::Background, Qt::red);
1805 progressBarOption.palette = pal;
1806 QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter);
1810 QStyledItemDelegate::paint(painter,
option,
index);
1830 const auto text = QInputDialog::getMultiLineText(
1831 __widget, tr(
"JSON Joint values"), tr(
"Json:"),
"{\n}", &ok)
1834 if (!ok || text.empty())
1839 NameValueMap jointAngles;
1842 jointAngles = simox::json::json2NameValueMap(text);
1849 NameControlModeMap jointModes;
1850 for (
const auto& [key, _] : jointAngles)
1852 jointModes[key] = ePositionControl;
1870 robot->setJointValues(currentJointAngles);
constexpr float SLIDER_POS_RAD_MULTIPLIER
#define KINEMATIC_UNIT_NAME_DEFAULT
constexpr float SLIDER_POS_DEG_MULTIPLIER
constexpr float SLIDER_POS_HEMI_MULTIPLIER
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
static const std::string & GetProjectName()
static bool getAbsolutePath(const std::string &relativeFilename, std::string &storeAbsoluteFilename, const std::vector< std::string > &additionalSearchPaths={}, bool verbose=true)
std::enable_if<!HasGetWidgetName< ArmarXWidgetType >::value >::type addWidget()
The CMakePackageFinder class provides an interface to the CMake Package finder capabilities.
static DateTime Now()
Current time on the virtual clock.
static TPtr create(Ice::PropertiesPtr properties=Ice::createProperties(), const std::string &configName="", const std::string &configDomain="ArmarX")
Factory method for a component.
static Frequency Hertz(std::int64_t hertz)
The JSONObject class is used to represent and (de)serialize JSON objects.
bool usingProxy(const std::string &name, const std::string &endpoints="")
Registers a proxy for retrieval after initialization and adds it to the dependency list.
ArmarXObjectSchedulerPtr getObjectScheduler() const
std::string getName() const
Retrieve name of object.
Ice::ObjectPrx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Returns the proxy of this object (optionally it waits for the proxy)
ArmarXManagerPtr getArmarXManager() const
Returns the ArmarX manager used to add and remove components.
Ice::PropertiesPtr getIceProperties() const
Returns the set of Ice properties.
Simple rate limiter for use in loops to maintain a certain frequency given a clock.
Duration waitForNextTick() const
Wait and block until the target period is met.
#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_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
#define ARMARX_INFO
The normal logging level.
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_VERBOSE
The logging level for verbose information.
std::shared_ptr< class Robot > RobotPtr
double s(double t, double s0, double v0, double a0, double j)
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceUtil::Handle< ArmarXManager > ArmarXManagerPtr
std::optional< float > mean(const boost::circular_buffer< NameValueMap > &buffer, const std::string &key)
std::vector< std::string > Split(const std::string &source, const std::string &splitBy, bool trimElements=false, bool removeEmptyElements=false)
std::vector< T > abs(const std::vector< T > &v)
IceInternal::Handle< JSONObject > JSONObjectPtr
const LogSender::manipulator flush