From 8d4fc131013c191167aac10cc6a2fa1f54315e76 Mon Sep 17 00:00:00 2001 From: Christoph Pohl <christoph.pohl@kit.edu> Date: Tue, 8 Aug 2023 11:00:14 +0200 Subject: [PATCH] autoformatting Signed-off-by: ARMAR-DE <> --- .../KinematicUnitGuiPlugin.cpp | 2506 +++++++++-------- 1 file changed, 1316 insertions(+), 1190 deletions(-) diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp index dd14b34d3..fa8011d66 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp @@ -22,59 +22,59 @@ * GNU General Public License */ #include "KinematicUnitGuiPlugin.h" -#include "KinematicUnitConfigDialog.h" -#include <RobotAPI/gui-plugins/KinematicUnitPlugin/ui_KinematicUnitConfigDialog.h> -#include <RobotAPI/interface/core/NameValueMap.h> -#include <RobotAPI/interface/units/KinematicUnitInterface.h> +#include <SimoxUtility/algorithm/string.h> +#include <SimoxUtility/json.h> +#include <VirtualRobot/XML/RobotIO.h> #include "ArmarXCore/core/exceptions/local/ExpressionException.h" #include "ArmarXCore/core/logging/Logging.h" #include "ArmarXCore/core/services/tasks/RunningTask.h" #include "ArmarXCore/core/time/Metronome.h" #include "ArmarXCore/core/time/forward_declarations.h" -#include <ArmarXCore/core/system/cmake/CMakePackageFinder.h> +#include <ArmarXCore/core/ArmarXManager.h> +#include <ArmarXCore/core/ArmarXObjectScheduler.h> #include <ArmarXCore/core/application/Application.h> #include <ArmarXCore/core/system/ArmarXDataPath.h> -#include <ArmarXCore/core/ArmarXObjectScheduler.h> -#include <ArmarXCore/core/ArmarXManager.h> - -#include <ArmarXCore/util/json/JSONObject.h> +#include <ArmarXCore/core/system/cmake/CMakePackageFinder.h> #include <ArmarXCore/core/util/algorithm.h> +#include <ArmarXCore/util/json/JSONObject.h> -#include <VirtualRobot/XML/RobotIO.h> -#include <SimoxUtility/json.h> -#include <SimoxUtility/algorithm/string.h> +#include <RobotAPI/gui-plugins/KinematicUnitPlugin/ui_KinematicUnitConfigDialog.h> +#include <RobotAPI/interface/core/NameValueMap.h> +#include <RobotAPI/interface/units/KinematicUnitInterface.h> + +#include "KinematicUnitConfigDialog.h" // Qt headers -#include <Qt> -#include <QtGlobal> -#include <QSpinBox> -#include <QSlider> +#include <QCheckBox> +#include <QClipboard> +#include <QInputDialog> #include <QPushButton> +#include <QSlider> +#include <QSpinBox> #include <QStringList> #include <QTableView> -#include <QCheckBox> #include <QTableWidget> -#include <QClipboard> -#include <QInputDialog> +#include <Qt> +#include <QtGlobal> #include <qtimer.h> -#include <Inventor/SoDB.h> -#include <Inventor/Qt/SoQt.h> #include <ArmarXCore/observers/filters/MedianFilter.h> +#include <Inventor/Qt/SoQt.h> +#include <Inventor/SoDB.h> + // System +#include <cmath> #include <cstddef> #include <cstdio> -#include <memory> -#include <string> -#include <optional> #include <cstdlib> -#include <iostream> -#include <cmath> - #include <filesystem> +#include <iostream> +#include <memory> +#include <optional> +#include <string> //#define KINEMATIC_UNIT_FILE_DEFAULT std::string("RobotAPI/robots/Armar3/ArmarIII.xml") @@ -84,268 +84,277 @@ #define SLIDER_POS_DEG_MULTIPLIER 5 #define SLIDER_POS_RAD_MULTIPLIER 100 - namespace armarx { -KinematicUnitGuiPlugin::KinematicUnitGuiPlugin() -{ - - qRegisterMetaType<DebugInfo>("DebugInfo"); + KinematicUnitGuiPlugin::KinematicUnitGuiPlugin() + { - addWidget<KinematicUnitWidgetController>(); -} + qRegisterMetaType<DebugInfo>("DebugInfo"); -KinematicUnitWidgetController::KinematicUnitWidgetController() : - kinematicUnitNode(nullptr), - enableValueValidator(true), - historyTime(100000), // 1/10 s - currentValueMax(5.0f) -{ - rootVisu = NULL; - debugLayerVisu = NULL; + addWidget<KinematicUnitWidgetController>(); + } - // init gui - ui.setupUi(getWidget()); - getWidget()->setEnabled(false); + KinematicUnitWidgetController::KinematicUnitWidgetController() : + kinematicUnitNode(nullptr), + enableValueValidator(true), + historyTime(100000), // 1/10 s + currentValueMax(5.0f) + { + rootVisu = NULL; + debugLayerVisu = NULL; - ui.tableJointList->setItemDelegateForColumn(eTabelColumnAngleProgressbar, &delegate); + // init gui + ui.setupUi(getWidget()); + getWidget()->setEnabled(false); - ui.radioButtonUnknown->setHidden(true); -} + ui.tableJointList->setItemDelegateForColumn(eTabelColumnAngleProgressbar, &delegate); -void KinematicUnitWidgetController::onInitComponent() -{ - ARMARX_INFO << flush; - verbose = true; + ui.radioButtonUnknown->setHidden(true); + } + void + KinematicUnitWidgetController::onInitComponent() + { + ARMARX_INFO << flush; + verbose = true; - rootVisu = new SoSeparator; - rootVisu->ref(); - robotVisu = new SoSeparator; - robotVisu->ref(); - rootVisu->addChild(robotVisu); - // create the debugdrawer component - std::string debugDrawerComponentName = "KinemticUnitGUIDebugDrawer_" + getName(); - ARMARX_INFO << "Creating component " << debugDrawerComponentName; - debugDrawer = Component::create<DebugDrawerComponent>(getIceProperties(), debugDrawerComponentName); - showVisuLayers(false); + rootVisu = new SoSeparator; + rootVisu->ref(); + robotVisu = new SoSeparator; + robotVisu->ref(); + rootVisu->addChild(robotVisu); - if (mutex3D) - { - //ARMARX_IMPORTANT << "mutex3d:" << mutex3D.get(); - debugDrawer->setMutex(mutex3D); - } - else - { - ARMARX_ERROR << " No 3d mutex available..."; - } + // create the debugdrawer component + std::string debugDrawerComponentName = "KinemticUnitGUIDebugDrawer_" + getName(); + ARMARX_INFO << "Creating component " << debugDrawerComponentName; + debugDrawer = + Component::create<DebugDrawerComponent>(getIceProperties(), debugDrawerComponentName); + showVisuLayers(false); - ArmarXManagerPtr m = getArmarXManager(); - m->addObject(debugDrawer, false); + if (mutex3D) + { + //ARMARX_IMPORTANT << "mutex3d:" << mutex3D.get(); + debugDrawer->setMutex(mutex3D); + } + else + { + ARMARX_ERROR << " No 3d mutex available..."; + } + ArmarXManagerPtr m = getArmarXManager(); + m->addObject(debugDrawer, false); - { - std::unique_lock lock(*mutex3D); - debugLayerVisu = new SoSeparator(); - debugLayerVisu->ref(); - debugLayerVisu->addChild(debugDrawer->getVisualization()); - rootVisu->addChild(debugLayerVisu); - } - connectSlots(); + { + std::unique_lock lock(*mutex3D); + debugLayerVisu = new SoSeparator(); + debugLayerVisu->ref(); + debugLayerVisu->addChild(debugDrawer->getVisualization()); + rootVisu->addChild(debugLayerVisu); + } - usingProxy(kinematicUnitName); -} + connectSlots(); -void KinematicUnitWidgetController::onConnectComponent() -{ - // ARMARX_INFO << "Kinematic Unit Gui :: onConnectComponent()"; - jointCurrentHistory.clear(); - jointCurrentHistory.set_capacity(5); + usingProxy(kinematicUnitName); + } - // jointAnglesUpdateFrequency = new filters::MedianFilter(100); - kinematicUnitInterfacePrx = getProxy<KinematicUnitInterfacePrx>(kinematicUnitName); + void + KinematicUnitWidgetController::onConnectComponent() + { + // ARMARX_INFO << "Kinematic Unit Gui :: onConnectComponent()"; + jointCurrentHistory.clear(); + jointCurrentHistory.set_capacity(5); - lastJointAngleUpdateTimestamp = Clock::Now(); - robotVisu->removeAllChildren(); + // jointAnglesUpdateFrequency = new filters::MedianFilter(100); + kinematicUnitInterfacePrx = getProxy<KinematicUnitInterfacePrx>(kinematicUnitName); - robot.reset(); + lastJointAngleUpdateTimestamp = Clock::Now(); + robotVisu->removeAllChildren(); - std::string rfile; - Ice::StringSeq includePaths; + robot.reset(); - // Get robot filename - try - { - Ice::StringSeq packages = kinematicUnitInterfacePrx->getArmarXPackages(); - packages.push_back(Application::GetProjectName()); - ARMARX_VERBOSE << "ArmarX packages " << packages; + std::string rfile; + Ice::StringSeq includePaths; - for (const std::string& projectName : packages) + // Get robot filename + try { - if (projectName.empty()) + Ice::StringSeq packages = kinematicUnitInterfacePrx->getArmarXPackages(); + packages.push_back(Application::GetProjectName()); + ARMARX_VERBOSE << "ArmarX packages " << packages; + + for (const std::string& projectName : packages) { - continue; + if (projectName.empty()) + { + continue; + } + + CMakePackageFinder project(projectName); + auto pathsString = project.getDataDir(); + ARMARX_VERBOSE << "Data paths of ArmarX package " << projectName << ": " + << pathsString; + Ice::StringSeq projectIncludePaths = Split(pathsString, ";,", true, true); + ARMARX_VERBOSE << "Result: Data paths of ArmarX package " << projectName << ": " + << projectIncludePaths; + includePaths.insert( + includePaths.end(), projectIncludePaths.begin(), projectIncludePaths.end()); } - CMakePackageFinder project(projectName); - auto pathsString = project.getDataDir(); - ARMARX_VERBOSE << "Data paths of ArmarX package " << projectName << ": " << pathsString; - Ice::StringSeq projectIncludePaths = Split(pathsString, ";,", true, true); - ARMARX_VERBOSE << "Result: Data paths of ArmarX package " << projectName << ": " << projectIncludePaths; - includePaths.insert(includePaths.end(), projectIncludePaths.begin(), projectIncludePaths.end()); - } - - rfile = kinematicUnitInterfacePrx->getRobotFilename(); - ARMARX_VERBOSE << "Relative robot file " << rfile; - ArmarXDataPath::getAbsolutePath(rfile, rfile, includePaths); - ARMARX_VERBOSE << "Absolute robot file " << rfile; - - robotNodeSetName = kinematicUnitInterfacePrx->getRobotNodeSetName(); - } - catch (...) - { - ARMARX_ERROR << "Unable to retrieve robot filename."; - } + rfile = kinematicUnitInterfacePrx->getRobotFilename(); + ARMARX_VERBOSE << "Relative robot file " << rfile; + ArmarXDataPath::getAbsolutePath(rfile, rfile, includePaths); + ARMARX_VERBOSE << "Absolute robot file " << rfile; - try - { - ARMARX_INFO << "Loading robot from file " << rfile; - robot = loadRobotFile(rfile); - } - catch (const std::exception& e) - { - ARMARX_ERROR << "Failed to init robot: " << e.what(); - } - catch (...) - { - ARMARX_ERROR << "Failed to init robot"; - } - - if (!robot || !robot->hasRobotNodeSet(robotNodeSetName)) - { - getObjectScheduler()->terminate(); - if (getWidget()->parentWidget()) + robotNodeSetName = kinematicUnitInterfacePrx->getRobotNodeSetName(); + } + catch (...) { - getWidget()->parentWidget()->close(); + ARMARX_ERROR << "Unable to retrieve robot filename."; } - return; - } - // Check robot name and disable setZero Button if necessary - if (not simox::alg::starts_with(robot->getName(), "Armar3")) - { - ARMARX_VERBOSE << "Disable the SetZero button because the robot name is '" << robot->getName() << "'."; - ui.pushButtonKinematicUnitPos1->setDisabled(true); - } + try + { + ARMARX_INFO << "Loading robot from file " << rfile; + robot = loadRobotFile(rfile); + } + catch (const std::exception& e) + { + ARMARX_ERROR << "Failed to init robot: " << e.what(); + } + catch (...) + { + ARMARX_ERROR << "Failed to init robot"; + } - kinematicUnitFile = rfile; - robotNodeSet = robot->getRobotNodeSet(robotNodeSetName); + if (!robot || !robot->hasRobotNodeSet(robotNodeSetName)) + { + getObjectScheduler()->terminate(); + if (getWidget()->parentWidget()) + { + getWidget()->parentWidget()->close(); + } + return; + } - kinematicUnitVisualization = getCoinVisualization(robot); - kinematicUnitNode = kinematicUnitVisualization->getCoinVisualization(); - robotVisu->addChild(kinematicUnitNode); + // Check robot name and disable setZero Button if necessary + if (not simox::alg::starts_with(robot->getName(), "Armar3")) + { + ARMARX_VERBOSE << "Disable the SetZero button because the robot name is '" + << robot->getName() << "'."; + ui.pushButtonKinematicUnitPos1->setDisabled(true); + } - // Fetch the current joint angles. - synchronizeRobotJointAngles(); + kinematicUnitFile = rfile; + robotNodeSet = robot->getRobotNodeSet(robotNodeSetName); - initGUIComboBox(robotNodeSet); // init the pull down menu (QT: ComboBox) - initGUIJointListTable(robotNodeSet); + kinematicUnitVisualization = getCoinVisualization(robot); + kinematicUnitNode = kinematicUnitVisualization->getCoinVisualization(); + robotVisu->addChild(kinematicUnitNode); - const auto initialDebugInfo = kinematicUnitInterfacePrx->getDebugInfo(); + // Fetch the current joint angles. + synchronizeRobotJointAngles(); - initializeUi(initialDebugInfo); + initGUIComboBox(robotNodeSet); // init the pull down menu (QT: ComboBox) + initGUIJointListTable(robotNodeSet); - QMetaObject::invokeMethod(this, "resetSlider"); - enableMainWidgetAsync(true); + const auto initialDebugInfo = kinematicUnitInterfacePrx->getDebugInfo(); - updateTask = new RunningTask<KinematicUnitWidgetController>(this, &KinematicUnitWidgetController::runUpdate); - updateTask->start(); -} + initializeUi(initialDebugInfo); -void KinematicUnitWidgetController::runUpdate() -{ - Metronome metronome(Frequency::Hertz(10)); + QMetaObject::invokeMethod(this, "resetSlider"); + enableMainWidgetAsync(true); - while(kinematicUnitInterfacePrx) - { - fetchData(); - metronome.waitForNextTick(); + updateTask = new RunningTask<KinematicUnitWidgetController>( + this, &KinematicUnitWidgetController::runUpdate); + updateTask->start(); } - ARMARX_INFO << "Connection to kinemetic unit lost. Update task terminates."; -} - -void KinematicUnitWidgetController::onDisconnectComponent() -{ - kinematicUnitInterfacePrx = nullptr; - - if(updateTask) + void + KinematicUnitWidgetController::runUpdate() { - updateTask->stop(); - updateTask->join(); - updateTask = nullptr; - } + Metronome metronome(Frequency::Hertz(10)); - // killTimer(updateTimerId); - enableMainWidgetAsync(false); + while (kinematicUnitInterfacePrx) + { + fetchData(); + metronome.waitForNextTick(); + } - { - std::unique_lock lock(mutexNodeSet); - robot.reset(); - robotNodeSet.reset(); - currentNode.reset(); + ARMARX_INFO << "Connection to kinemetic unit lost. Update task terminates."; } + void + KinematicUnitWidgetController::onDisconnectComponent() { - std::unique_lock lock(*mutex3D); - robotVisu->removeAllChildren(); - debugLayerVisu->removeAllChildren(); - } - -} + kinematicUnitInterfacePrx = nullptr; -void KinematicUnitWidgetController::onExitComponent() -{ - kinematicUnitInterfacePrx = nullptr; - - if(updateTask) - { - updateTask->stop(); - updateTask->join(); - updateTask = nullptr; - } + if (updateTask) + { + updateTask->stop(); + updateTask->join(); + updateTask = nullptr; + } - enableMainWidgetAsync(false); + // killTimer(updateTimerId); + enableMainWidgetAsync(false); - { - std::unique_lock lock(*mutex3D); + { + std::unique_lock lock(mutexNodeSet); + robot.reset(); + robotNodeSet.reset(); + currentNode.reset(); + } - if (robotVisu) { + std::unique_lock lock(*mutex3D); robotVisu->removeAllChildren(); - robotVisu->unref(); - robotVisu = NULL; + debugLayerVisu->removeAllChildren(); } + } + + void + KinematicUnitWidgetController::onExitComponent() + { + kinematicUnitInterfacePrx = nullptr; - if (debugLayerVisu) + if (updateTask) { - debugLayerVisu->removeAllChildren(); - debugLayerVisu->unref(); - debugLayerVisu = NULL; + updateTask->stop(); + updateTask->join(); + updateTask = nullptr; } - if (rootVisu) + enableMainWidgetAsync(false); + { - rootVisu->removeAllChildren(); - rootVisu->unref(); - rootVisu = NULL; + std::unique_lock lock(*mutex3D); + + if (robotVisu) + { + robotVisu->removeAllChildren(); + robotVisu->unref(); + robotVisu = NULL; + } + + if (debugLayerVisu) + { + debugLayerVisu->removeAllChildren(); + debugLayerVisu->unref(); + debugLayerVisu = NULL; + } + + if (rootVisu) + { + rootVisu->removeAllChildren(); + rootVisu->unref(); + rootVisu = NULL; + } } - } - /* + /* if (debugDrawer && debugDrawer->getObjectScheduler()) { ARMARX_INFO << "Removing DebugDrawer component..."; @@ -353,757 +362,848 @@ void KinematicUnitWidgetController::onExitComponent() ARMARX_INFO << "Removing DebugDrawer component...done"; } */ -} - -QPointer<QDialog> KinematicUnitWidgetController::getConfigDialog(QWidget* parent) -{ - if (!dialog) - { - dialog = new KinematicUnitConfigDialog(parent); - dialog->setName(dialog->getDefaultName()); } - return qobject_cast<KinematicUnitConfigDialog*>(dialog); -} - -void KinematicUnitWidgetController::configured() -{ - ARMARX_VERBOSE << "KinematicUnitWidget::configured()"; - kinematicUnitName = dialog->proxyFinder->getSelectedProxyName().toStdString(); - enableValueValidator = dialog->ui->checkBox->isChecked(); - viewerEnabled = dialog->ui->checkBox3DViewerEnabled->isChecked(); - historyTime = dialog->ui->spinBoxHistory->value() * 1000; - currentValueMax = dialog->ui->doubleSpinBoxMaxMinCurrent->value(); -} - -void KinematicUnitWidgetController::loadSettings(QSettings* settings) -{ - kinematicUnitName = settings->value("kinematicUnitName", KINEMATIC_UNIT_NAME_DEFAULT).toString().toStdString(); - enableValueValidator = settings->value("enableValueValidator", true).toBool(); - viewerEnabled = settings->value("viewerEnabled", true).toBool(); - historyTime = settings->value("historyTime", 100).toInt() * 1000; - currentValueMax = settings->value("currentValueMax", 5.0).toFloat(); -} - -void KinematicUnitWidgetController::saveSettings(QSettings* settings) -{ - settings->setValue("kinematicUnitName", QString::fromStdString(kinematicUnitName)); - settings->setValue("enableValueValidator", enableValueValidator); - settings->setValue("viewerEnabled", viewerEnabled); - assert(historyTime % 1000 == 0); - settings->setValue("historyTime", static_cast<int>(historyTime / 1000)); - settings->setValue("currentValueMax", currentValueMax); -} - - -void KinematicUnitWidgetController::showVisuLayers(bool show) -{ - if (debugDrawer) + QPointer<QDialog> + KinematicUnitWidgetController::getConfigDialog(QWidget* parent) { - if (show) + if (!dialog) { - debugDrawer->enableAllLayers(); - } - else - { - debugDrawer->disableAllLayers(); + dialog = new KinematicUnitConfigDialog(parent); + dialog->setName(dialog->getDefaultName()); } + + return qobject_cast<KinematicUnitConfigDialog*>(dialog); } -} -void KinematicUnitWidgetController::copyToClipboard() -{ - NameValueMap values; + void + KinematicUnitWidgetController::configured() { - std::unique_lock lock(mutexNodeSet); - - ARMARX_CHECK_NOT_NULL(kinematicUnitInterfacePrx); - const auto debugInfo = kinematicUnitInterfacePrx->getDebugInfo(); - - const auto selectedControlMode = getSelectedControlMode(); - - if (selectedControlMode == ePositionControl) - { - values = debugInfo.jointAngles; - } - else if (selectedControlMode == eVelocityControl) - { - values = debugInfo.jointVelocities; - } + ARMARX_VERBOSE << "KinematicUnitWidget::configured()"; + kinematicUnitName = dialog->proxyFinder->getSelectedProxyName().toStdString(); + enableValueValidator = dialog->ui->checkBox->isChecked(); + viewerEnabled = dialog->ui->checkBox3DViewerEnabled->isChecked(); + historyTime = dialog->ui->spinBoxHistory->value() * 1000; + currentValueMax = dialog->ui->doubleSpinBoxMaxMinCurrent->value(); } - JSONObjectPtr serializer = new JSONObject(); - for (auto& kv : values) + void + KinematicUnitWidgetController::loadSettings(QSettings* settings) { - serializer->setFloat(kv.first, kv.second); + kinematicUnitName = settings->value("kinematicUnitName", KINEMATIC_UNIT_NAME_DEFAULT) + .toString() + .toStdString(); + enableValueValidator = settings->value("enableValueValidator", true).toBool(); + viewerEnabled = settings->value("viewerEnabled", true).toBool(); + historyTime = settings->value("historyTime", 100).toInt() * 1000; + currentValueMax = settings->value("currentValueMax", 5.0).toFloat(); } - const QString json = QString::fromStdString(serializer->asString(true)); - QClipboard* clipboard = QApplication::clipboard(); - clipboard->setText(json); - QApplication::processEvents(); -} - -void KinematicUnitWidgetController::updateGuiElements() -{ - // modelUpdateCB(); -} - -void KinematicUnitWidgetController::updateKinematicUnitListInDialog() -{ -} - -void KinematicUnitWidgetController::modelUpdateCB() -{ -} - -SoNode* KinematicUnitWidgetController::getScene() -{ - if (viewerEnabled) + void + KinematicUnitWidgetController::saveSettings(QSettings* settings) { - ARMARX_INFO << "Returning scene "; - return rootVisu; + settings->setValue("kinematicUnitName", QString::fromStdString(kinematicUnitName)); + settings->setValue("enableValueValidator", enableValueValidator); + settings->setValue("viewerEnabled", viewerEnabled); + assert(historyTime % 1000 == 0); + settings->setValue("historyTime", static_cast<int>(historyTime / 1000)); + settings->setValue("currentValueMax", currentValueMax); } - else + + void + KinematicUnitWidgetController::showVisuLayers(bool show) { - ARMARX_INFO << "viewer disabled - returning null scene"; - return NULL; + if (debugDrawer) + { + if (show) + { + debugDrawer->enableAllLayers(); + } + else + { + debugDrawer->disableAllLayers(); + } + } } -} - -void KinematicUnitWidgetController::connectSlots() -{ - connect(ui.pushButtonKinematicUnitPos1, SIGNAL(clicked()), this, SLOT(kinematicUnitZeroPosition())); - - connect(ui.nodeListComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectJoint(int))); - connect(ui.horizontalSliderKinematicUnitPos, SIGNAL(valueChanged(int)), this, SLOT(sliderValueChanged(int))); - connect(ui.horizontalSliderKinematicUnitPos, SIGNAL(sliderReleased()), this, SLOT(resetSliderToZeroPosition())); - - connect(ui.radioButtonPositionControl, SIGNAL(clicked(bool)), this, SLOT(setControlModePosition())); - connect(ui.radioButtonVelocityControl, SIGNAL(clicked(bool)), this, SLOT(setControlModeVelocity())); - connect(ui.radioButtonTorqueControl, SIGNAL(clicked(bool)), this, SLOT(setControlModeTorque())); - connect(ui.pushButtonFromJson, SIGNAL(clicked()), this, SLOT(on_pushButtonFromJson_clicked())); - - connect(ui.copyToClipboard, SIGNAL(clicked()), this, SLOT(copyToClipboard())); - connect(ui.showDebugLayer, SIGNAL(toggled(bool)), this, SLOT(showVisuLayers(bool)), Qt::QueuedConnection); - - connect(this, SIGNAL(jointAnglesReported()), this, SLOT(updateJointAnglesTable()), Qt::QueuedConnection); - connect(this, SIGNAL(jointVelocitiesReported()), this, SLOT(updateJointVelocitiesTable()), Qt::QueuedConnection); - connect(this, SIGNAL(jointTorquesReported()), this, SLOT(updateJointTorquesTable()), Qt::QueuedConnection); - connect(this, SIGNAL(jointCurrentsReported()), this, SLOT(updateJointCurrentsTable()), Qt::QueuedConnection); - connect(this, SIGNAL(jointMotorTemperaturesReported()), this, SLOT(updateMotorTemperaturesTable()), Qt::QueuedConnection); - connect(this, SIGNAL(jointControlModesReported()), this, SLOT(updateControlModesTable()), Qt::QueuedConnection); - connect(this, SIGNAL(jointStatusesReported()), this, SLOT(updateJointStatusesTable()), Qt::QueuedConnection); - - connect(ui.tableJointList, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(selectJointFromTableWidget(int, int)), Qt::QueuedConnection); - - connect(ui.checkBoxUseDegree, SIGNAL(clicked()), this, SLOT(resetSlider()), Qt::QueuedConnection); - connect(ui.checkBoxUseDegree, SIGNAL(clicked()), this, SLOT(setControlModePosition())); - connect(ui.checkBoxUseDegree, SIGNAL(clicked()), this, SLOT(setControlModeVelocity())); - connect(ui.checkBoxUseDegree, SIGNAL(clicked()), this, SLOT(setControlModeTorque())); - - connect(this, SIGNAL(onDebugInfoReceived(const DebugInfo&)), this, SLOT(debugInfoReceived(const DebugInfo&))); -} - -void KinematicUnitWidgetController::initializeUi(const DebugInfo& debugInfo) -{ - //signal clicked is not emitted if you call setDown(), setChecked() or toggle(). - - // there is no default control mode - setControlModeRadioButtonGroup(ControlMode::eUnknown); + void + KinematicUnitWidgetController::copyToClipboard() + { + NameValueMap values; + { + std::unique_lock lock(mutexNodeSet); - ui.widgetSliderFactor->setVisible(false); + ARMARX_CHECK_NOT_NULL(kinematicUnitInterfacePrx); + const auto debugInfo = kinematicUnitInterfacePrx->getDebugInfo(); - fetchData(); -} + const auto selectedControlMode = getSelectedControlMode(); + if (selectedControlMode == ePositionControl) + { + values = debugInfo.jointAngles; + } + else if (selectedControlMode == eVelocityControl) + { + values = debugInfo.jointVelocities; + } + } -void KinematicUnitWidgetController::kinematicUnitZeroVelocity() -{ - if (!robotNodeSet) - { - return; + JSONObjectPtr serializer = new JSONObject(); + for (auto& kv : values) + { + serializer->setFloat(kv.first, kv.second); + } + const QString json = QString::fromStdString(serializer->asString(true)); + QClipboard* clipboard = QApplication::clipboard(); + clipboard->setText(json); + QApplication::processEvents(); } - std::unique_lock lock(mutexNodeSet); - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - NameValueMap vels; - NameControlModeMap jointModes; - - for (unsigned int i = 0; i < rn.size(); i++) + void + KinematicUnitWidgetController::updateGuiElements() { - jointModes[rn[i]->getName()] = eVelocityControl; - vels[rn[i]->getName()] = 0.0f; + // modelUpdateCB(); } - try - { - kinematicUnitInterfacePrx->switchControlMode(jointModes); - kinematicUnitInterfacePrx->setJointVelocities(vels); - } - catch (...) + void + KinematicUnitWidgetController::updateKinematicUnitListInDialog() { } - const auto selectedControlMode = getSelectedControlMode(); - if (selectedControlMode == eVelocityControl) + void + KinematicUnitWidgetController::modelUpdateCB() { - ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); } -} - -void KinematicUnitWidgetController::resetSlider() -{ - const auto selectedControlMode = getSelectedControlMode(); - - if (selectedControlMode == eVelocityControl || selectedControlMode == eTorqueControl) - { - resetSliderToZeroPosition(); - } - else if (selectedControlMode == ePositionControl) + SoNode* + KinematicUnitWidgetController::getScene() { - if (currentNode) + if (viewerEnabled) { - const bool isDeg = ui.checkBoxUseDegree->isChecked(); - const bool isRot = currentNode->isRotationalJoint(); - const auto factor = isRot && ! isDeg ? SLIDER_POS_RAD_MULTIPLIER : SLIDER_POS_DEG_MULTIPLIER; - float conversionFactor = isRot && isDeg ? 180.0 / M_PI : 1.0f; - float pos = currentNode->getJointValue() * conversionFactor; - - ui.lcdNumberKinematicUnitJointValue->display((int)pos); - ui.horizontalSliderKinematicUnitPos->setSliderPosition((int)(pos * factor)); + ARMARX_INFO << "Returning scene "; + return rootVisu; + } + else + { + ARMARX_INFO << "viewer disabled - returning null scene"; + return NULL; } } -} - -void KinematicUnitWidgetController::resetSliderToZeroPosition() -{ - const auto selectedControlMode = getSelectedControlMode(); + void + KinematicUnitWidgetController::connectSlots() + { + connect(ui.pushButtonKinematicUnitPos1, + SIGNAL(clicked()), + this, + SLOT(kinematicUnitZeroPosition())); + + connect( + ui.nodeListComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(selectJoint(int))); + connect(ui.horizontalSliderKinematicUnitPos, + SIGNAL(valueChanged(int)), + this, + SLOT(sliderValueChanged(int))); + + connect(ui.horizontalSliderKinematicUnitPos, + SIGNAL(sliderReleased()), + this, + SLOT(resetSliderToZeroPosition())); + + connect(ui.radioButtonPositionControl, + SIGNAL(clicked(bool)), + this, + SLOT(setControlModePosition())); + connect(ui.radioButtonVelocityControl, + SIGNAL(clicked(bool)), + this, + SLOT(setControlModeVelocity())); + connect( + ui.radioButtonTorqueControl, SIGNAL(clicked(bool)), this, SLOT(setControlModeTorque())); + connect( + ui.pushButtonFromJson, SIGNAL(clicked()), this, SLOT(on_pushButtonFromJson_clicked())); + + connect(ui.copyToClipboard, SIGNAL(clicked()), this, SLOT(copyToClipboard())); + connect(ui.showDebugLayer, + SIGNAL(toggled(bool)), + this, + SLOT(showVisuLayers(bool)), + Qt::QueuedConnection); + + connect(this, + SIGNAL(jointAnglesReported()), + this, + SLOT(updateJointAnglesTable()), + Qt::QueuedConnection); + connect(this, + SIGNAL(jointVelocitiesReported()), + this, + SLOT(updateJointVelocitiesTable()), + Qt::QueuedConnection); + connect(this, + SIGNAL(jointTorquesReported()), + this, + SLOT(updateJointTorquesTable()), + Qt::QueuedConnection); + connect(this, + SIGNAL(jointCurrentsReported()), + this, + SLOT(updateJointCurrentsTable()), + Qt::QueuedConnection); + connect(this, + SIGNAL(jointMotorTemperaturesReported()), + this, + SLOT(updateMotorTemperaturesTable()), + Qt::QueuedConnection); + connect(this, + SIGNAL(jointControlModesReported()), + this, + SLOT(updateControlModesTable()), + Qt::QueuedConnection); + connect(this, + SIGNAL(jointStatusesReported()), + this, + SLOT(updateJointStatusesTable()), + Qt::QueuedConnection); + + connect(ui.tableJointList, + SIGNAL(cellDoubleClicked(int, int)), + this, + SLOT(selectJointFromTableWidget(int, int)), + Qt::QueuedConnection); + + connect(ui.checkBoxUseDegree, + SIGNAL(clicked()), + this, + SLOT(resetSlider()), + Qt::QueuedConnection); + connect(ui.checkBoxUseDegree, SIGNAL(clicked()), this, SLOT(setControlModePosition())); + connect(ui.checkBoxUseDegree, SIGNAL(clicked()), this, SLOT(setControlModeVelocity())); + connect(ui.checkBoxUseDegree, SIGNAL(clicked()), this, SLOT(setControlModeTorque())); + + connect(this, + SIGNAL(onDebugInfoReceived(const DebugInfo&)), + this, + SLOT(debugInfoReceived(const DebugInfo&))); + } + + void + KinematicUnitWidgetController::initializeUi(const DebugInfo& debugInfo) + { + //signal clicked is not emitted if you call setDown(), setChecked() or toggle(). + + // there is no default control mode + setControlModeRadioButtonGroup(ControlMode::eUnknown); + + ui.widgetSliderFactor->setVisible(false); - if (selectedControlMode == eVelocityControl || selectedControlMode == eTorqueControl) - { - ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); - ui.lcdNumberKinematicUnitJointValue->display(SLIDER_ZERO_POSITION); - } -} - -void KinematicUnitWidgetController::setControlModeRadioButtonGroup(const ControlMode& controlMode) -{ - ARMARX_VERBOSE << "Setting control mode of radio button group to " << controlMode; - - switch(controlMode) - { - case eDisabled: - case eUnknown: - case ePositionVelocityControl: - ui.radioButtonUnknown->setChecked(true); - break; - case ePositionControl: - ui.radioButtonPositionControl->setChecked(true); - break; - case eVelocityControl: - ui.radioButtonVelocityControl->setChecked(true); - break; - case eTorqueControl: - ui.radioButtonTorqueControl->setChecked(true); - break; + fetchData(); } -} - -void KinematicUnitWidgetController::setControlModePosition() -{ - if (!ui.radioButtonPositionControl->isChecked()) + void + KinematicUnitWidgetController::kinematicUnitZeroVelocity() { - return; - } - NameControlModeMap jointModes; - // selectedControlMode = ePositionControl; - ui.widgetSliderFactor->setVisible(false); + if (!robotNodeSet) + { + return; + } - // FIXME currentNode should be passed to this function! + std::unique_lock lock(mutexNodeSet); + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); + NameValueMap vels; + NameControlModeMap jointModes; - if (currentNode) - { - QString unit = currentNode->isRotationalJoint() - ? (ui.checkBoxUseDegree->isChecked() ? "deg" : "rad") - : "mm"; - ui.labelUnit->setText(unit); - const bool isDeg = ui.checkBoxUseDegree->isChecked(); - const bool isRot = currentNode->isRotationalJoint(); - const auto factor = isRot && ! isDeg ? SLIDER_POS_RAD_MULTIPLIER : SLIDER_POS_DEG_MULTIPLIER; - float conversionFactor = isRot && isDeg ? 180.0 / M_PI : 1.0f; - jointModes[currentNode->getName()] = ePositionControl; + for (unsigned int i = 0; i < rn.size(); i++) + { + jointModes[rn[i]->getName()] = eVelocityControl; + vels[rn[i]->getName()] = 0.0f; + } - if (kinematicUnitInterfacePrx) + try { kinematicUnitInterfacePrx->switchControlMode(jointModes); + kinematicUnitInterfacePrx->setJointVelocities(vels); } - - float lo = currentNode->getJointLimitLo() * conversionFactor; - float hi = currentNode->getJointLimitHi() * conversionFactor; - - if (hi - lo <= 0.0f) + catch (...) { - return; } + const auto selectedControlMode = getSelectedControlMode(); + if (selectedControlMode == eVelocityControl) { - // currentNode->getJointValue() can we wrong after we re-connected to the robot unit. - // E.g., it can be 0 although the torso joint was at -365 before the unit disconnected. - // Therefore, we first have to fetch the actual joint values and use that one. - // However, this should actually not be necessary, as the robot model should be updated - // via the topics. - synchronizeRobotJointAngles(); + ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); } + } - float pos = currentNode->getJointValue() * conversionFactor; - ARMARX_INFO << "Setting position control for current node " - << "(name '" << currentNode->getName() << "' with current value " << pos << ")"; + void + KinematicUnitWidgetController::resetSlider() + { + const auto selectedControlMode = getSelectedControlMode(); - // Setting the slider position to pos will set the position to the slider tick closest to pos - // This will initially send a position target with a small delta to the joint. - ui.horizontalSliderKinematicUnitPos->blockSignals(true); + if (selectedControlMode == eVelocityControl || selectedControlMode == eTorqueControl) + { + resetSliderToZeroPosition(); + } + else if (selectedControlMode == ePositionControl) + { + if (currentNode) + { + const bool isDeg = ui.checkBoxUseDegree->isChecked(); + const bool isRot = currentNode->isRotationalJoint(); + const auto factor = + isRot && !isDeg ? SLIDER_POS_RAD_MULTIPLIER : SLIDER_POS_DEG_MULTIPLIER; + float conversionFactor = isRot && isDeg ? 180.0 / M_PI : 1.0f; + float pos = currentNode->getJointValue() * conversionFactor; + + ui.lcdNumberKinematicUnitJointValue->display((int)pos); + ui.horizontalSliderKinematicUnitPos->setSliderPosition((int)(pos * factor)); + } + } + } - ui.horizontalSliderKinematicUnitPos->setMaximum(hi * factor); - ui.horizontalSliderKinematicUnitPos->setMinimum(lo * factor); - ui.lcdNumberKinematicUnitJointValue->display(pos); + void + KinematicUnitWidgetController::resetSliderToZeroPosition() + { + const auto selectedControlMode = getSelectedControlMode(); - ui.horizontalSliderKinematicUnitPos->blockSignals(false); - resetSlider(); + if (selectedControlMode == eVelocityControl || selectedControlMode == eTorqueControl) + { + ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); + ui.lcdNumberKinematicUnitJointValue->display(SLIDER_ZERO_POSITION); + } } -} -void KinematicUnitWidgetController::setControlModeVelocity() -{ - if (!ui.radioButtonVelocityControl->isChecked()) + void + KinematicUnitWidgetController::setControlModeRadioButtonGroup(const ControlMode& controlMode) { - return; + ARMARX_VERBOSE << "Setting control mode of radio button group to " << controlMode; + + switch (controlMode) + { + case eDisabled: + case eUnknown: + case ePositionVelocityControl: + ui.radioButtonUnknown->setChecked(true); + break; + case ePositionControl: + ui.radioButtonPositionControl->setChecked(true); + break; + case eVelocityControl: + ui.radioButtonVelocityControl->setChecked(true); + break; + case eTorqueControl: + ui.radioButtonTorqueControl->setChecked(true); + break; + } } - NameControlModeMap jointModes; - NameValueMap jointVelocities; - if (currentNode) + void + KinematicUnitWidgetController::setControlModePosition() { - jointModes[currentNode->getName()] = eVelocityControl; - - // set the velocity to zero to stop any previous controller (e.g. torque controller) - jointVelocities[currentNode->getName()] = 0; + if (!ui.radioButtonPositionControl->isChecked()) + { + return; + } + NameControlModeMap jointModes; + // selectedControlMode = ePositionControl; + ui.widgetSliderFactor->setVisible(false); - const bool isDeg = ui.checkBoxUseDegree->isChecked(); - const bool isRot = currentNode->isRotationalJoint(); - QString unit = isRot ? - (isDeg ? "deg/s" : "rad/(100*s)") : - "mm/s"; - ui.labelUnit->setText(unit); - ARMARX_INFO << "setting velocity control for current Node Name: " << currentNode->getName() << flush; - float lo = isRot ? (isDeg ? -90 : -M_PI * 100) : -1000; - float hi = isRot ? (isDeg ? +90 : +M_PI * 100) : 1000; + // FIXME currentNode should be passed to this function! - try + if (currentNode) { + QString unit = currentNode->isRotationalJoint() + ? (ui.checkBoxUseDegree->isChecked() ? "deg" : "rad") + : "mm"; + ui.labelUnit->setText(unit); + const bool isDeg = ui.checkBoxUseDegree->isChecked(); + const bool isRot = currentNode->isRotationalJoint(); + const auto factor = + isRot && !isDeg ? SLIDER_POS_RAD_MULTIPLIER : SLIDER_POS_DEG_MULTIPLIER; + float conversionFactor = isRot && isDeg ? 180.0 / M_PI : 1.0f; + jointModes[currentNode->getName()] = ePositionControl; + if (kinematicUnitInterfacePrx) { kinematicUnitInterfacePrx->switchControlMode(jointModes); - kinematicUnitInterfacePrx->setJointVelocities(jointVelocities); } - } - catch (...) - { - } - - ui.widgetSliderFactor->setVisible(true); + float lo = currentNode->getJointLimitLo() * conversionFactor; + float hi = currentNode->getJointLimitHi() * conversionFactor; - ui.horizontalSliderKinematicUnitPos->blockSignals(true); - ui.horizontalSliderKinematicUnitPos->setMaximum(hi); - ui.horizontalSliderKinematicUnitPos->setMinimum(lo); - ui.horizontalSliderKinematicUnitPos->blockSignals(false); - resetSlider(); - } -} - -ControlMode KinematicUnitWidgetController::getSelectedControlMode() const -{ - if(ui.radioButtonPositionControl->isChecked()) - { - return ControlMode::ePositionControl; - } - - if (ui.radioButtonVelocityControl->isChecked()) - { - return ControlMode::eVelocityControl; - } + if (hi - lo <= 0.0f) + { + return; + } - if (ui.radioButtonTorqueControl->isChecked()) - { - return ControlMode::eTorqueControl; - } + { + // currentNode->getJointValue() can we wrong after we re-connected to the robot unit. + // E.g., it can be 0 although the torso joint was at -365 before the unit disconnected. + // Therefore, we first have to fetch the actual joint values and use that one. + // However, this should actually not be necessary, as the robot model should be updated + // via the topics. + synchronizeRobotJointAngles(); + } - // if no button is checked, then the joint is likely initialized but no controller has been loaded yet - // (well, the no movement controller should be active) - return ControlMode::eUnknown; + float pos = currentNode->getJointValue() * conversionFactor; + ARMARX_INFO << "Setting position control for current node " + << "(name '" << currentNode->getName() << "' with current value " << pos + << ")"; + // Setting the slider position to pos will set the position to the slider tick closest to pos + // This will initially send a position target with a small delta to the joint. + ui.horizontalSliderKinematicUnitPos->blockSignals(true); -} + ui.horizontalSliderKinematicUnitPos->setMaximum(hi * factor); + ui.horizontalSliderKinematicUnitPos->setMinimum(lo * factor); + ui.lcdNumberKinematicUnitJointValue->display(pos); -void KinematicUnitWidgetController::setControlModeTorque() -{ - if (!ui.radioButtonTorqueControl->isChecked()) - { - return; + ui.horizontalSliderKinematicUnitPos->blockSignals(false); + resetSlider(); + } } - NameControlModeMap jointModes; - if (currentNode) + void + KinematicUnitWidgetController::setControlModeVelocity() { - jointModes[currentNode->getName()] = eTorqueControl; - ui.labelUnit->setText("Ncm"); - ARMARX_INFO << "setting torque control for current Node Name: " << currentNode->getName() << flush; + if (!ui.radioButtonVelocityControl->isChecked()) + { + return; + } + NameControlModeMap jointModes; + NameValueMap jointVelocities; - if (kinematicUnitInterfacePrx) + if (currentNode) { + jointModes[currentNode->getName()] = eVelocityControl; + + // set the velocity to zero to stop any previous controller (e.g. torque controller) + jointVelocities[currentNode->getName()] = 0; + + const bool isDeg = ui.checkBoxUseDegree->isChecked(); + const bool isRot = currentNode->isRotationalJoint(); + QString unit = isRot ? (isDeg ? "deg/s" : "rad/(100*s)") : "mm/s"; + ui.labelUnit->setText(unit); + ARMARX_INFO << "setting velocity control for current Node Name: " + << currentNode->getName() << flush; + float lo = isRot ? (isDeg ? -90 : -M_PI * 100) : -1000; + float hi = isRot ? (isDeg ? +90 : +M_PI * 100) : 1000; + try { - kinematicUnitInterfacePrx->switchControlMode(jointModes); + if (kinematicUnitInterfacePrx) + { + kinematicUnitInterfacePrx->switchControlMode(jointModes); + kinematicUnitInterfacePrx->setJointVelocities(jointVelocities); + } } catch (...) { - } - } - - ui.horizontalSliderKinematicUnitPos->blockSignals(true); - ui.horizontalSliderKinematicUnitPos->setMaximum(20000.0); - ui.horizontalSliderKinematicUnitPos->setMinimum(-20000.0); - ui.widgetSliderFactor->setVisible(true); + ui.widgetSliderFactor->setVisible(true); - ui.horizontalSliderKinematicUnitPos->blockSignals(false); - resetSlider(); + ui.horizontalSliderKinematicUnitPos->blockSignals(true); + ui.horizontalSliderKinematicUnitPos->setMaximum(hi); + ui.horizontalSliderKinematicUnitPos->setMinimum(lo); + ui.horizontalSliderKinematicUnitPos->blockSignals(false); + resetSlider(); + } } -} -VirtualRobot::RobotPtr KinematicUnitWidgetController::loadRobotFile(std::string fileName) -{ - VirtualRobot::RobotPtr robot; - - if (verbose) + ControlMode + KinematicUnitWidgetController::getSelectedControlMode() const { - ARMARX_INFO << "Loading KinematicUnit " << kinematicUnitName << " from " << kinematicUnitFile << " ..." << flush; + if (ui.radioButtonPositionControl->isChecked()) + { + return ControlMode::ePositionControl; + } + + if (ui.radioButtonVelocityControl->isChecked()) + { + return ControlMode::eVelocityControl; + } + + if (ui.radioButtonTorqueControl->isChecked()) + { + return ControlMode::eTorqueControl; + } + + // if no button is checked, then the joint is likely initialized but no controller has been loaded yet + // (well, the no movement controller should be active) + return ControlMode::eUnknown; } - if (!ArmarXDataPath::getAbsolutePath(fileName, fileName)) + void + KinematicUnitWidgetController::setControlModeTorque() { - ARMARX_INFO << "Could not find Robot XML file with name " << fileName << flush; - } + if (!ui.radioButtonTorqueControl->isChecked()) + { + return; + } + NameControlModeMap jointModes; - robot = VirtualRobot::RobotIO::loadRobot(fileName); + if (currentNode) + { + jointModes[currentNode->getName()] = eTorqueControl; + ui.labelUnit->setText("Ncm"); + ARMARX_INFO << "setting torque control for current Node Name: " + << currentNode->getName() << flush; - if (!robot) - { - ARMARX_INFO << "Could not find Robot XML file with name " << fileName << "(" << kinematicUnitName << ")" << flush; - } + if (kinematicUnitInterfacePrx) + { + try + { + kinematicUnitInterfacePrx->switchControlMode(jointModes); + } + catch (...) + { + } + } - return robot; -} + ui.horizontalSliderKinematicUnitPos->blockSignals(true); + ui.horizontalSliderKinematicUnitPos->setMaximum(20000.0); + ui.horizontalSliderKinematicUnitPos->setMinimum(-20000.0); -VirtualRobot::CoinVisualizationPtr KinematicUnitWidgetController::getCoinVisualization(VirtualRobot::RobotPtr robot) -{ - VirtualRobot::CoinVisualizationPtr coinVisualization; + ui.widgetSliderFactor->setVisible(true); + + ui.horizontalSliderKinematicUnitPos->blockSignals(false); + resetSlider(); + } + } - if (robot != NULL) + VirtualRobot::RobotPtr + KinematicUnitWidgetController::loadRobotFile(std::string fileName) { - ARMARX_VERBOSE << "getting coin visualization" << flush; - coinVisualization = robot->getVisualization<VirtualRobot::CoinVisualization>(); + VirtualRobot::RobotPtr robot; - if (!coinVisualization || !coinVisualization->getCoinVisualization()) + if (verbose) { - ARMARX_INFO << "could not get coin visualization" << flush; + ARMARX_INFO << "Loading KinematicUnit " << kinematicUnitName << " from " + << kinematicUnitFile << " ..." << flush; } - } - return coinVisualization; -} + if (!ArmarXDataPath::getAbsolutePath(fileName, fileName)) + { + ARMARX_INFO << "Could not find Robot XML file with name " << fileName << flush; + } -VirtualRobot::RobotNodeSetPtr KinematicUnitWidgetController::getRobotNodeSet(VirtualRobot::RobotPtr robot, std::string nodeSetName) -{ - VirtualRobot::RobotNodeSetPtr nodeSetPtr; + robot = VirtualRobot::RobotIO::loadRobot(fileName); + + if (!robot) + { + ARMARX_INFO << "Could not find Robot XML file with name " << fileName << "(" + << kinematicUnitName << ")" << flush; + } - if (robot) + return robot; + } + + VirtualRobot::CoinVisualizationPtr + KinematicUnitWidgetController::getCoinVisualization(VirtualRobot::RobotPtr robot) { - nodeSetPtr = robot->getRobotNodeSet(nodeSetName); + VirtualRobot::CoinVisualizationPtr coinVisualization; - if (!nodeSetPtr) + if (robot != NULL) { - ARMARX_INFO << "RobotNodeSet with name " << nodeSetName << " is not defined" << flush; + ARMARX_VERBOSE << "getting coin visualization" << flush; + coinVisualization = robot->getVisualization<VirtualRobot::CoinVisualization>(); + if (!coinVisualization || !coinVisualization->getCoinVisualization()) + { + ARMARX_INFO << "could not get coin visualization" << flush; + } } + + return coinVisualization; } - return nodeSetPtr; -} + VirtualRobot::RobotNodeSetPtr + KinematicUnitWidgetController::getRobotNodeSet(VirtualRobot::RobotPtr robot, + std::string nodeSetName) + { + VirtualRobot::RobotNodeSetPtr nodeSetPtr; + + if (robot) + { + nodeSetPtr = robot->getRobotNodeSet(nodeSetName); + if (!nodeSetPtr) + { + ARMARX_INFO << "RobotNodeSet with name " << nodeSetName << " is not defined" + << flush; + } + } -bool KinematicUnitWidgetController::initGUIComboBox(VirtualRobot::RobotNodeSetPtr robotNodeSet) -{ - ui.nodeListComboBox->clear(); + return nodeSetPtr; + } - if (robotNodeSet) + bool + KinematicUnitWidgetController::initGUIComboBox(VirtualRobot::RobotNodeSetPtr robotNodeSet) { - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); + ui.nodeListComboBox->clear(); - for (unsigned int i = 0; i < rn.size(); i++) + if (robotNodeSet) { - // ARMARX_INFO << "adding item to joint combo box" << rn[i]->getName() << flush; - QString name(rn[i]->getName().c_str()); - ui.nodeListComboBox->addItem(name); + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); + + for (unsigned int i = 0; i < rn.size(); i++) + { + // ARMARX_INFO << "adding item to joint combo box" << rn[i]->getName() << flush; + QString name(rn[i]->getName().c_str()); + ui.nodeListComboBox->addItem(name); + } + ui.nodeListComboBox->setCurrentIndex(-1); + return true; } - ui.nodeListComboBox->setCurrentIndex(-1); - return true; + return false; } - return false; -} + bool + KinematicUnitWidgetController::initGUIJointListTable(VirtualRobot::RobotNodeSetPtr robotNodeSet) + { + uint numberOfColumns = 10; -bool KinematicUnitWidgetController::initGUIJointListTable(VirtualRobot::RobotNodeSetPtr robotNodeSet) -{ - uint numberOfColumns = 10; - - //dont use clear! It is not required here and somehow causes the tabel to have - //numberOfColumns additional empty columns and rn.size() additional empty rows. - //Somehow columncount (rowcount) stay at numberOfColumns (rn.size()) - //ui.tableJointList->clear(); + //dont use clear! It is not required here and somehow causes the tabel to have + //numberOfColumns additional empty columns and rn.size() additional empty rows. + //Somehow columncount (rowcount) stay at numberOfColumns (rn.size()) + //ui.tableJointList->clear(); - if (robotNodeSet) - { - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - - //set dimension of table - //ui.tableJointList->setColumnWidth(0,110); - - //ui.tableJointList->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); - ui.tableJointList->setRowCount(rn.size()); - ui.tableJointList->setColumnCount(eTabelColumnCount); - - - //ui.tableJointList->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); - - // set table header - // if the order is changed dont forget to update the order in the enum JointTabelColumnIndex - // in theheader file - QStringList s; - s << "Joint Name" - << "Control Mode" - << "Angle [deg]/Position [mm]" - << "Velocity [deg/s]/[mm/s]" - << "Torque [Nm] / PWM" - << "Current [A]" - << "Temperature [C]" - << "Operation" - << "Error" - << "Enabled" - << "Emergency Stop"; - ui.tableJointList->setHorizontalHeaderLabels(s); - ARMARX_CHECK_EXPRESSION(ui.tableJointList->columnCount() == eTabelColumnCount) << "Current table size: " << ui.tableJointList->columnCount(); - - - // fill in joint names - for (unsigned int i = 0; i < rn.size(); i++) + if (robotNodeSet) { - // ARMARX_INFO << "adding item to joint table" << rn[i]->getName() << flush; - QString name(rn[i]->getName().c_str()); + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); + + //set dimension of table + //ui.tableJointList->setColumnWidth(0,110); + + //ui.tableJointList->horizontalHeader()->setResizeMode(QHeaderView::ResizeToContents); + ui.tableJointList->setRowCount(rn.size()); + ui.tableJointList->setColumnCount(eTabelColumnCount); + + + //ui.tableJointList->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding); + + // set table header + // if the order is changed dont forget to update the order in the enum JointTabelColumnIndex + // in theheader file + QStringList s; + s << "Joint Name" + << "Control Mode" + << "Angle [deg]/Position [mm]" + << "Velocity [deg/s]/[mm/s]" + << "Torque [Nm] / PWM" + << "Current [A]" + << "Temperature [C]" + << "Operation" + << "Error" + << "Enabled" + << "Emergency Stop"; + ui.tableJointList->setHorizontalHeaderLabels(s); + ARMARX_CHECK_EXPRESSION(ui.tableJointList->columnCount() == eTabelColumnCount) + << "Current table size: " << ui.tableJointList->columnCount(); + + + // fill in joint names + for (unsigned int i = 0; i < rn.size(); i++) + { + // ARMARX_INFO << "adding item to joint table" << rn[i]->getName() << flush; + QString name(rn[i]->getName().c_str()); - QTableWidgetItem* newItem = new QTableWidgetItem(name); - ui.tableJointList->setItem(i, eTabelColumnName, newItem); - } + QTableWidgetItem* newItem = new QTableWidgetItem(name); + ui.tableJointList->setItem(i, eTabelColumnName, newItem); + } - // init missing table fields with default values - for (unsigned int i = 0; i < rn.size(); i++) - { - for (unsigned int j = 1; j < numberOfColumns; j++) + // init missing table fields with default values + for (unsigned int i = 0; i < rn.size(); i++) { - QString state = "--"; - QTableWidgetItem* newItem = new QTableWidgetItem(state); - ui.tableJointList->setItem(i, j, newItem); + for (unsigned int j = 1; j < numberOfColumns; j++) + { + QString state = "--"; + QTableWidgetItem* newItem = new QTableWidgetItem(state); + ui.tableJointList->setItem(i, j, newItem); + } } - } - //hide columns Operation, Error, Enabled and Emergency Stop - //they will be shown when changes occur - ui.tableJointList->setColumnHidden(eTabelColumnTemperature, true); - ui.tableJointList->setColumnHidden(eTabelColumnOperation, true); - ui.tableJointList->setColumnHidden(eTabelColumnError, true); - ui.tableJointList->setColumnHidden(eTabelColumnEnabled, true); - ui.tableJointList->setColumnHidden(eTabelColumnEmergencyStop, true); + //hide columns Operation, Error, Enabled and Emergency Stop + //they will be shown when changes occur + ui.tableJointList->setColumnHidden(eTabelColumnTemperature, true); + ui.tableJointList->setColumnHidden(eTabelColumnOperation, true); + ui.tableJointList->setColumnHidden(eTabelColumnError, true); + ui.tableJointList->setColumnHidden(eTabelColumnEnabled, true); + ui.tableJointList->setColumnHidden(eTabelColumnEmergencyStop, true); + + return true; + } - return true; + return false; } - return false; -} + void + KinematicUnitWidgetController::selectJoint(int i) + { + std::unique_lock lock(mutexNodeSet); + ARMARX_INFO << "Selected index: " << ui.nodeListComboBox->currentIndex(); -void KinematicUnitWidgetController::selectJoint(int i) -{ - std::unique_lock lock(mutexNodeSet); + if (!robotNodeSet || i < 0 || i >= static_cast<int>(robotNodeSet->getSize())) + { + return; + } - ARMARX_INFO << "Selected index: " << ui.nodeListComboBox->currentIndex(); + currentNode = robotNodeSet->getAllRobotNodes()[i]; + ARMARX_IMPORTANT << "Selected joint is `" << currentNode->getName() << "`."; - if (!robotNodeSet || i < 0 || i >= static_cast<int>(robotNodeSet->getSize())) - { - return; - } + const auto controlModes = kinematicUnitInterfacePrx->getControlModes(); + if (controlModes.count(currentNode->getName()) == 0) + { + ARMARX_ERROR << "Could not retrieve control mode for joint `" << currentNode->getName() + << "` from kinematic unit!"; + return; + } - currentNode = robotNodeSet->getAllRobotNodes()[i]; - ARMARX_IMPORTANT << "Selected joint is `" << currentNode->getName() << "`."; + const auto controlMode = controlModes.at(currentNode->getName()); + setControlModeRadioButtonGroup(controlMode); - const auto controlModes = kinematicUnitInterfacePrx->getControlModes(); - if(controlModes.count(currentNode->getName()) == 0) - { - ARMARX_ERROR << "Could not retrieve control mode for joint `" << currentNode->getName() << "` from kinematic unit!"; - return; + if (controlMode == ePositionControl) + { + setControlModePosition(); + } + else if (controlMode == eVelocityControl) + { + setControlModeVelocity(); + ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); + } + else if (controlMode == eTorqueControl) + { + setControlModeTorque(); + ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); + } } - const auto controlMode = controlModes.at(currentNode->getName()); - setControlModeRadioButtonGroup(controlMode); - - if (controlMode == ePositionControl) - { - setControlModePosition(); - } - else if (controlMode == eVelocityControl) + void + KinematicUnitWidgetController::selectJointFromTableWidget(int row, int column) { - setControlModeVelocity(); - ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); - } - else if (controlMode == eTorqueControl) - { - setControlModeTorque(); - ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); + if (column == eTabelColumnName) + { + ui.nodeListComboBox->setCurrentIndex(row); + // selectJoint(row); + } } -} -void KinematicUnitWidgetController::selectJointFromTableWidget(int row, int column) -{ - if (column == eTabelColumnName) + void + KinematicUnitWidgetController::sliderValueChanged(int pos) { - ui.nodeListComboBox->setCurrentIndex(row); - // selectJoint(row); - } -} - -void KinematicUnitWidgetController::sliderValueChanged(int pos) -{ - std::unique_lock lock(mutexNodeSet); + std::unique_lock lock(mutexNodeSet); - if (!currentNode) - { - return; - } + if (!currentNode) + { + return; + } - const float value = static_cast<float>(ui.horizontalSliderKinematicUnitPos->value()); + const float value = static_cast<float>(ui.horizontalSliderKinematicUnitPos->value()); - const ControlMode currentControlMode = getSelectedControlMode(); + const ControlMode currentControlMode = getSelectedControlMode(); - const bool isDeg = ui.checkBoxUseDegree->isChecked(); - const bool isRot = currentNode->isRotationalJoint(); + const bool isDeg = ui.checkBoxUseDegree->isChecked(); + const bool isRot = currentNode->isRotationalJoint(); - if (currentControlMode == ePositionControl) - { - const auto factor = isRot && ! isDeg ? SLIDER_POS_RAD_MULTIPLIER : SLIDER_POS_DEG_MULTIPLIER; - float conversionFactor = isRot && isDeg ? 180.0 / M_PI : 1.0f; + if (currentControlMode == ePositionControl) + { + const auto factor = + isRot && !isDeg ? SLIDER_POS_RAD_MULTIPLIER : SLIDER_POS_DEG_MULTIPLIER; + float conversionFactor = isRot && isDeg ? 180.0 / M_PI : 1.0f; - NameValueMap jointAngles; + NameValueMap jointAngles; - jointAngles[currentNode->getName()] = value / conversionFactor / factor; - ui.lcdNumberKinematicUnitJointValue->display(value / factor); - if (kinematicUnitInterfacePrx) - { - try - { - kinematicUnitInterfacePrx->setJointAngles(jointAngles); - } - catch (...) + jointAngles[currentNode->getName()] = value / conversionFactor / factor; + ui.lcdNumberKinematicUnitJointValue->display(value / factor); + if (kinematicUnitInterfacePrx) { + try + { + kinematicUnitInterfacePrx->setJointAngles(jointAngles); + } + catch (...) + { + } } } - } - else if (currentControlMode == eVelocityControl) - { - float conversionFactor = isRot ? (isDeg ? 180.0 / M_PI : 100.f) : 1.0f; - NameValueMap jointVelocities; - jointVelocities[currentNode->getName()] = value / conversionFactor * static_cast<float>(ui.doubleSpinBoxKinematicUnitPosFactor->value()); - ui.lcdNumberKinematicUnitJointValue->display(value); - - if (kinematicUnitInterfacePrx) + else if (currentControlMode == eVelocityControl) { - try - { - kinematicUnitInterfacePrx->setJointVelocities(jointVelocities); - } - catch (...) - { - } - } - } - else if (currentControlMode == eTorqueControl) - { - NameValueMap jointTorques; - float torqueTargetValue = value / 100.0f * static_cast<float>(ui.doubleSpinBoxKinematicUnitPosFactor->value()); - jointTorques[currentNode->getName()] = torqueTargetValue; - ui.lcdNumberKinematicUnitJointValue->display(torqueTargetValue); + float conversionFactor = isRot ? (isDeg ? 180.0 / M_PI : 100.f) : 1.0f; + NameValueMap jointVelocities; + jointVelocities[currentNode->getName()] = + value / conversionFactor * + static_cast<float>(ui.doubleSpinBoxKinematicUnitPosFactor->value()); + ui.lcdNumberKinematicUnitJointValue->display(value); - if (kinematicUnitInterfacePrx) - { - try + if (kinematicUnitInterfacePrx) { - kinematicUnitInterfacePrx->setJointTorques(jointTorques); + try + { + kinematicUnitInterfacePrx->setJointVelocities(jointVelocities); + } + catch (...) + { + } } - catch (...) + } + else if (currentControlMode == eTorqueControl) + { + NameValueMap jointTorques; + float torqueTargetValue = + value / 100.0f * + static_cast<float>(ui.doubleSpinBoxKinematicUnitPosFactor->value()); + jointTorques[currentNode->getName()] = torqueTargetValue; + ui.lcdNumberKinematicUnitJointValue->display(torqueTargetValue); + + if (kinematicUnitInterfacePrx) { + try + { + kinematicUnitInterfacePrx->setJointTorques(jointTorques); + } + catch (...) + { + } } } - } - else - { - ARMARX_INFO << "current ControlModes unknown" << flush; - } -} - - - -void KinematicUnitWidgetController::updateControlModesTable(const NameControlModeMap& reportedJointControlModes) -{ - if (!getWidget() || !robotNodeSet) - { - return; + else + { + ARMARX_INFO << "current ControlModes unknown" << flush; + } } - std::unique_lock lock(mutexNodeSet); - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - - for (unsigned int i = 0; i < rn.size(); i++) + void + KinematicUnitWidgetController::updateControlModesTable( + const NameControlModeMap& reportedJointControlModes) { - NameControlModeMap::const_iterator it; - it = reportedJointControlModes.find(rn[i]->getName()); - QString state; - - if (it == reportedJointControlModes.end()) + if (!getWidget() || !robotNodeSet) { - state = "unknown"; + return; } - else - { - ControlMode currentMode = it->second; + std::unique_lock lock(mutexNodeSet); + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); + + for (unsigned int i = 0; i < rn.size(); i++) + { + NameControlModeMap::const_iterator it; + it = reportedJointControlModes.find(rn[i]->getName()); + QString state; - switch (currentMode) + if (it == reportedJointControlModes.end()) + { + state = "unknown"; + } + else { - /*case eNoMode: + ControlMode currentMode = it->second; + + + switch (currentMode) + { + /*case eNoMode: state = "None"; break; @@ -1111,537 +1211,563 @@ void KinematicUnitWidgetController::updateControlModesTable(const NameControlMod state = "Unknown"; break; */ - case eDisabled: - state = "Disabled"; - break; + case eDisabled: + state = "Disabled"; + break; - case eUnknown: - state = "Unknown"; - break; + case eUnknown: + state = "Unknown"; + break; - case ePositionControl: - state = "Position"; - break; + case ePositionControl: + state = "Position"; + break; - case eVelocityControl: - state = "Velocity"; - break; + case eVelocityControl: + state = "Velocity"; + break; - case eTorqueControl: - state = "Torque"; - break; + case eTorqueControl: + state = "Torque"; + break; - case ePositionVelocityControl: - state = "Position + Velocity"; - break; + case ePositionVelocityControl: + state = "Position + Velocity"; + break; - default: - //show the value of the mode so it can be implemented - state = QString("<nyi Mode: %1>").arg(static_cast<int>(currentMode)); - break; + default: + //show the value of the mode so it can be implemented + state = QString("<nyi Mode: %1>").arg(static_cast<int>(currentMode)); + break; + } } - } - - QTableWidgetItem* newItem = new QTableWidgetItem(state); - ui.tableJointList->setItem(i, eTabelColumnControlMode, newItem); - } -} -void KinematicUnitWidgetController::updateJointStatusesTable(const NameStatusMap& reportedJointStatuses) -{ - if (!getWidget() || !robotNodeSet || reportedJointStatuses.empty()) - { - return; + QTableWidgetItem* newItem = new QTableWidgetItem(state); + ui.tableJointList->setItem(i, eTabelColumnControlMode, newItem); + } } - std::unique_lock lock(mutexNodeSet); - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - - for (unsigned int i = 0; i < rn.size(); i++) + void + KinematicUnitWidgetController::updateJointStatusesTable( + const NameStatusMap& reportedJointStatuses) { - - auto it = reportedJointStatuses.find(rn[i]->getName()); - if (it == reportedJointStatuses.end()) + if (!getWidget() || !robotNodeSet || reportedJointStatuses.empty()) { - ARMARX_WARNING << deactivateSpam(5) << "Joint Status for " << - rn[i]->getName() << " was not reported!"; - continue; + return; } - JointStatus currentStatus = it->second; - QString state = translateStatus(currentStatus.operation); - QTableWidgetItem* newItem = new QTableWidgetItem(state); - ui.tableJointList->setItem(i, eTabelColumnOperation, newItem); - - state = translateStatus(currentStatus.error); - newItem = new QTableWidgetItem(state); - ui.tableJointList->setItem(i, eTabelColumnError, newItem); + std::unique_lock lock(mutexNodeSet); + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); - state = currentStatus.enabled ? "X" : "-"; - newItem = new QTableWidgetItem(state); - ui.tableJointList->setItem(i, eTabelColumnEnabled, newItem); + for (unsigned int i = 0; i < rn.size(); i++) + { - state = currentStatus.emergencyStop ? "X" : "-"; - newItem = new QTableWidgetItem(state); - ui.tableJointList->setItem(i, eTabelColumnEmergencyStop, newItem); - } + auto it = reportedJointStatuses.find(rn[i]->getName()); + if (it == reportedJointStatuses.end()) + { + ARMARX_WARNING << deactivateSpam(5) << "Joint Status for " << rn[i]->getName() + << " was not reported!"; + continue; + } + JointStatus currentStatus = it->second; - //show columns - ui.tableJointList->setColumnHidden(eTabelColumnOperation, false); - ui.tableJointList->setColumnHidden(eTabelColumnError, false); - ui.tableJointList->setColumnHidden(eTabelColumnEnabled, false); - ui.tableJointList->setColumnHidden(eTabelColumnEmergencyStop, false); -} + QString state = translateStatus(currentStatus.operation); + QTableWidgetItem* newItem = new QTableWidgetItem(state); + ui.tableJointList->setItem(i, eTabelColumnOperation, newItem); -QString KinematicUnitWidgetController::translateStatus(OperationStatus status) -{ - switch (status) - { - case eOffline: - return "Offline"; + state = translateStatus(currentStatus.error); + newItem = new QTableWidgetItem(state); + ui.tableJointList->setItem(i, eTabelColumnError, newItem); - case eOnline: - return "Online"; + state = currentStatus.enabled ? "X" : "-"; + newItem = new QTableWidgetItem(state); + ui.tableJointList->setItem(i, eTabelColumnEnabled, newItem); - case eInitialized: - return "Initialized"; + state = currentStatus.emergencyStop ? "X" : "-"; + newItem = new QTableWidgetItem(state); + ui.tableJointList->setItem(i, eTabelColumnEmergencyStop, newItem); + } - default: - return "?"; + //show columns + ui.tableJointList->setColumnHidden(eTabelColumnOperation, false); + ui.tableJointList->setColumnHidden(eTabelColumnError, false); + ui.tableJointList->setColumnHidden(eTabelColumnEnabled, false); + ui.tableJointList->setColumnHidden(eTabelColumnEmergencyStop, false); } -} -QString KinematicUnitWidgetController::translateStatus(ErrorStatus status) -{ - switch (status) + QString + KinematicUnitWidgetController::translateStatus(OperationStatus status) { - case eOk: - return "Ok"; + switch (status) + { + case eOffline: + return "Offline"; - case eWarning: - return "Wr"; + case eOnline: + return "Online"; - case eError: - return "Er"; + case eInitialized: + return "Initialized"; - default: - return "?"; + default: + return "?"; + } } -} -void KinematicUnitWidgetController::updateJointAnglesTable(const NameValueMap& reportedJointAngles) -{ - std::unique_lock lock(mutexNodeSet); - - if (!robotNodeSet) + QString + KinematicUnitWidgetController::translateStatus(ErrorStatus status) { - return; - } - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); + switch (status) + { + case eOk: + return "Ok"; + case eWarning: + return "Wr"; - for (unsigned int i = 0; i < rn.size(); i++) + case eError: + return "Er"; + + default: + return "?"; + } + } + + void + KinematicUnitWidgetController::updateJointAnglesTable(const NameValueMap& reportedJointAngles) { - NameValueMap::const_iterator it; - VirtualRobot::RobotNodePtr node = rn[i]; - it = reportedJointAngles.find(node->getName()); + std::unique_lock lock(mutexNodeSet); - if (it == reportedJointAngles.end()) + if (!robotNodeSet) { - continue; + return; } + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); - const float currentValue = it->second; - QModelIndex index = ui.tableJointList->model()->index(i, eTabelColumnAngleProgressbar); - float conversionFactor = ui.checkBoxUseDegree->isChecked() && - node->isRotationalJoint() ? 180.0 / M_PI : 1; - ui.tableJointList->model()->setData(index, (int)(cutJitter(currentValue * conversionFactor) * 100) / 100.0f, eJointAngleRole); - ui.tableJointList->model()->setData(index, node->getJointLimitHigh() * conversionFactor, eJointHiRole); - ui.tableJointList->model()->setData(index, node->getJointLimitLow() * conversionFactor, eJointLoRole); - } -} + for (unsigned int i = 0; i < rn.size(); i++) + { + NameValueMap::const_iterator it; + VirtualRobot::RobotNodePtr node = rn[i]; + it = reportedJointAngles.find(node->getName()); -void KinematicUnitWidgetController::updateJointVelocitiesTable(const NameValueMap& reportedJointVelocities) -{ - if (!getWidget()) - { - return; - } + if (it == reportedJointAngles.end()) + { + continue; + } - std::unique_lock lock(mutexNodeSet); - if (!robotNodeSet) - { - return; + const float currentValue = it->second; + + QModelIndex index = ui.tableJointList->model()->index(i, eTabelColumnAngleProgressbar); + float conversionFactor = + ui.checkBoxUseDegree->isChecked() && node->isRotationalJoint() ? 180.0 / M_PI : 1; + ui.tableJointList->model()->setData( + index, + (int)(cutJitter(currentValue * conversionFactor) * 100) / 100.0f, + eJointAngleRole); + ui.tableJointList->model()->setData( + index, node->getJointLimitHigh() * conversionFactor, eJointHiRole); + ui.tableJointList->model()->setData( + index, node->getJointLimitLow() * conversionFactor, eJointLoRole); + } } - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - QTableWidgetItem* newItem; - for (unsigned int i = 0; i < rn.size(); i++) + void + KinematicUnitWidgetController::updateJointVelocitiesTable( + const NameValueMap& reportedJointVelocities) { - NameValueMap::const_iterator it; - it = reportedJointVelocities.find(rn[i]->getName()); - - if (it == reportedJointVelocities.end()) + if (!getWidget()) { - continue; + return; } - float currentValue = it->second; - if (ui.checkBoxUseDegree->isChecked() && rn[i]->isRotationalJoint()) + std::unique_lock lock(mutexNodeSet); + if (!robotNodeSet) { - currentValue *= 180.0 / M_PI; + return; } - const QString Text = QString::number(cutJitter(currentValue), 'g', 2); - newItem = new QTableWidgetItem(Text); - ui.tableJointList->setItem(i, eTabelColumnVelocity, newItem); - } -} + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); + QTableWidgetItem* newItem; -void KinematicUnitWidgetController::updateJointTorquesTable(const NameValueMap& reportedJointTorques) -{ + for (unsigned int i = 0; i < rn.size(); i++) + { + NameValueMap::const_iterator it; + it = reportedJointVelocities.find(rn[i]->getName()); + if (it == reportedJointVelocities.end()) + { + continue; + } - std::unique_lock lock(mutexNodeSet); - if (!getWidget() || !robotNodeSet) - { - return; + float currentValue = it->second; + if (ui.checkBoxUseDegree->isChecked() && rn[i]->isRotationalJoint()) + { + currentValue *= 180.0 / M_PI; + } + const QString Text = QString::number(cutJitter(currentValue), 'g', 2); + newItem = new QTableWidgetItem(Text); + ui.tableJointList->setItem(i, eTabelColumnVelocity, newItem); + } } - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - QTableWidgetItem* newItem; - NameValueMap::const_iterator it; - for (unsigned int i = 0; i < rn.size(); i++) + void + KinematicUnitWidgetController::updateJointTorquesTable(const NameValueMap& reportedJointTorques) { - it = reportedJointTorques.find(rn[i]->getName()); - if (it == reportedJointTorques.end()) + + std::unique_lock lock(mutexNodeSet); + if (!getWidget() || !robotNodeSet) { - continue; + return; } + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); + QTableWidgetItem* newItem; + NameValueMap::const_iterator it; - const float currentValue = it->second; - newItem = new QTableWidgetItem(QString::number(cutJitter(currentValue))); - ui.tableJointList->setItem(i, eTabelColumnTorque, newItem); - } -} - -void KinematicUnitWidgetController::updateJointCurrentsTable(const NameValueMap& reportedJointCurrents, const NameStatusMap& reportedJointStatuses) -{ + for (unsigned int i = 0; i < rn.size(); i++) + { + it = reportedJointTorques.find(rn[i]->getName()); + if (it == reportedJointTorques.end()) + { + continue; + } - std::unique_lock lock(mutexNodeSet); - if (!getWidget() || !robotNodeSet || jointCurrentHistory.size() == 0) - { - return; + const float currentValue = it->second; + newItem = new QTableWidgetItem(QString::number(cutJitter(currentValue))); + ui.tableJointList->setItem(i, eTabelColumnTorque, newItem); + } } - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - QTableWidgetItem* newItem; - // FIXME history! - // NameValueMap reportedJointCurrents = jointCurrentHistory.back().second; - NameValueMap::const_iterator it; - - for (unsigned int i = 0; i < rn.size(); i++) + void + KinematicUnitWidgetController::updateJointCurrentsTable( + const NameValueMap& reportedJointCurrents, + const NameStatusMap& reportedJointStatuses) { - it = reportedJointCurrents.find(rn[i]->getName()); - if (it == reportedJointCurrents.end()) + + std::unique_lock lock(mutexNodeSet); + if (!getWidget() || !robotNodeSet || jointCurrentHistory.size() == 0) { - continue; + return; } + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); + QTableWidgetItem* newItem; - const float currentValue = it->second; - newItem = new QTableWidgetItem(QString::number(cutJitter(currentValue))); - ui.tableJointList->setItem(i, eTabelColumnCurrent, newItem); - } + // FIXME history! + // NameValueMap reportedJointCurrents = jointCurrentHistory.back().second; + NameValueMap::const_iterator it; - highlightCriticalValues(reportedJointStatuses); -} + for (unsigned int i = 0; i < rn.size(); i++) + { + it = reportedJointCurrents.find(rn[i]->getName()); -void KinematicUnitWidgetController::updateMotorTemperaturesTable(const NameValueMap& reportedJointTemperatures) -{ + if (it == reportedJointCurrents.end()) + { + continue; + } + const float currentValue = it->second; + newItem = new QTableWidgetItem(QString::number(cutJitter(currentValue))); + ui.tableJointList->setItem(i, eTabelColumnCurrent, newItem); + } - std::unique_lock lock(mutexNodeSet); - if (!getWidget() || !robotNodeSet || reportedJointTemperatures.empty()) - { - return; + highlightCriticalValues(reportedJointStatuses); } - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - QTableWidgetItem* newItem; - NameValueMap::const_iterator it; - for (unsigned int i = 0; i < rn.size(); i++) + void + KinematicUnitWidgetController::updateMotorTemperaturesTable( + const NameValueMap& reportedJointTemperatures) { - it = reportedJointTemperatures.find(rn[i]->getName()); - if (it == reportedJointTemperatures.end()) + + std::unique_lock lock(mutexNodeSet); + if (!getWidget() || !robotNodeSet || reportedJointTemperatures.empty()) { - continue; + return; } + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); + QTableWidgetItem* newItem; + NameValueMap::const_iterator it; - const float currentValue = it->second; - newItem = new QTableWidgetItem(QString::number(cutJitter(currentValue))); - ui.tableJointList->setItem(i, eTabelColumnTemperature, newItem); - } - ui.tableJointList->setColumnHidden(eTabelColumnTemperature, false); - -} + for (unsigned int i = 0; i < rn.size(); i++) + { + it = reportedJointTemperatures.find(rn[i]->getName()); + if (it == reportedJointTemperatures.end()) + { + continue; + } -void KinematicUnitWidgetController::updateModel(const NameValueMap& reportedJointAngles) -{ - // ARMARX_INFO << "updateModel()" << flush; - std::unique_lock lock(mutexNodeSet); - if (!robotNodeSet) - { - return; + const float currentValue = it->second; + newItem = new QTableWidgetItem(QString::number(cutJitter(currentValue))); + ui.tableJointList->setItem(i, eTabelColumnTemperature, newItem); + } + ui.tableJointList->setColumnHidden(eTabelColumnTemperature, false); } - robot->setJointValues(reportedJointAngles); -} -std::optional<float> mean(const boost::circular_buffer<NameValueMap>& buffer, const std::string& key) -{ - float sum = 0; - std::size_t count = 0; - - for(const auto& element: buffer) + void + KinematicUnitWidgetController::updateModel(const NameValueMap& reportedJointAngles) { - if(element.count(key) > 0) + // ARMARX_INFO << "updateModel()" << flush; + std::unique_lock lock(mutexNodeSet); + if (!robotNodeSet) { - sum += element.at(key); + return; } + robot->setJointValues(reportedJointAngles); } - if(count == 0) + std::optional<float> + mean(const boost::circular_buffer<NameValueMap>& buffer, const std::string& key) { - return std::nullopt; - } - - return sum / static_cast<float>(count); -} - -void KinematicUnitWidgetController::highlightCriticalValues(const NameStatusMap& reportedJointStatuses) -{ - if (!enableValueValidator) - { - return; - } + float sum = 0; + std::size_t count = 0; - std::unique_lock lock(mutexNodeSet); - - std::vector< VirtualRobot::RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); + for (const auto& element : buffer) + { + if (element.count(key) > 0) + { + sum += element.at(key); + } + } - // get standard line colors - static std::vector<QBrush> standardColors; - if (standardColors.size() == 0) - { - for (unsigned int i = 0; i < rn.size(); i++) + if (count == 0) { - // all cells of a row have the same color - standardColors.push_back(ui.tableJointList->item(i, eTabelColumnCurrent)->background()); + return std::nullopt; } + + return sum / static_cast<float>(count); } - // check robot current value of nodes - for (unsigned int i = 0; i < rn.size(); i++) + void + KinematicUnitWidgetController::highlightCriticalValues( + const NameStatusMap& reportedJointStatuses) { - const auto& jointName = rn[i]->getName(); - - const auto currentSmoothValOpt = mean(jointCurrentHistory, jointName); - if(not currentSmoothValOpt.has_value()) + if (!enableValueValidator) { - continue; + return; } - const float smoothValue = std::fabs(currentSmoothValOpt.value()); + std::unique_lock lock(mutexNodeSet); + + std::vector<VirtualRobot::RobotNodePtr> rn = robotNodeSet->getAllRobotNodes(); - if(jointCurrentHistory.front().count(jointName) == 0) + // get standard line colors + static std::vector<QBrush> standardColors; + if (standardColors.size() == 0) { - continue; + for (unsigned int i = 0; i < rn.size(); i++) + { + // all cells of a row have the same color + standardColors.push_back( + ui.tableJointList->item(i, eTabelColumnCurrent)->background()); + } } - const float startValue = jointCurrentHistory.front().at(jointName); - const bool isStatic = (smoothValue == startValue); + // check robot current value of nodes + for (unsigned int i = 0; i < rn.size(); i++) + { + const auto& jointName = rn[i]->getName(); + + const auto currentSmoothValOpt = mean(jointCurrentHistory, jointName); + if (not currentSmoothValOpt.has_value()) + { + continue; + } + + const float smoothValue = std::fabs(currentSmoothValOpt.value()); + + if (jointCurrentHistory.front().count(jointName) == 0) + { + continue; + } - NameStatusMap::const_iterator it; - it = reportedJointStatuses.find(rn[i]->getName()); - JointStatus currentStatus = it->second; + const float startValue = jointCurrentHistory.front().at(jointName); + const bool isStatic = (smoothValue == startValue); - if (isStatic) - { - if (currentStatus.operation != eOffline) + NameStatusMap::const_iterator it; + it = reportedJointStatuses.find(rn[i]->getName()); + JointStatus currentStatus = it->second; + + if (isStatic) + { + if (currentStatus.operation != eOffline) + { + // current value is zero, but joint is not offline + ui.tableJointList->item(i, eTabelColumnCurrent)->setBackground(Qt::yellow); + } + } + else if (std::abs(smoothValue) > currentValueMax) + { + // current value is too high + ui.tableJointList->item(i, eTabelColumnCurrent)->setBackground(Qt::red); + } + else { - // current value is zero, but joint is not offline - ui.tableJointList->item(i, eTabelColumnCurrent)->setBackground(Qt::yellow); + // everything seems to work as expected + ui.tableJointList->item(i, eTabelColumnCurrent)->setBackground(standardColors[i]); } + } + } + + void + KinematicUnitWidgetController::setMutex3D(RecursiveMutexPtr const& mutex3D) + { + this->mutex3D = mutex3D; + if (debugDrawer) + { + debugDrawer->setMutex(mutex3D); } - else if (std::abs(smoothValue) > currentValueMax) + } + + QPointer<QWidget> + KinematicUnitWidgetController::getCustomTitlebarWidget(QWidget* parent) + { + if (customToolbar) { - // current value is too high - ui.tableJointList->item(i, eTabelColumnCurrent)->setBackground(Qt::red); + customToolbar->setParent(parent); } else { - // everything seems to work as expected - ui.tableJointList->item(i, eTabelColumnCurrent)->setBackground(standardColors[i]); + customToolbar = new QToolBar(parent); + customToolbar->addAction("ZeroVelocity", this, SLOT(kinematicUnitZeroVelocity())); } + return customToolbar.data(); } -} - -void KinematicUnitWidgetController::setMutex3D(RecursiveMutexPtr const& mutex3D) -{ - this->mutex3D = mutex3D; - if (debugDrawer) + float + KinematicUnitWidgetController::cutJitter(float value) { - debugDrawer->setMutex(mutex3D); + return (abs(value) < static_cast<float>(ui.jitterThresholdSpinBox->value())) ? 0 : value; } -} -QPointer<QWidget> KinematicUnitWidgetController::getCustomTitlebarWidget(QWidget* parent) -{ - if (customToolbar) + void + KinematicUnitWidgetController::fetchData() { - customToolbar->setParent(parent); - } - else - { - customToolbar = new QToolBar(parent); - customToolbar->addAction("ZeroVelocity", this, SLOT(kinematicUnitZeroVelocity())); - } - return customToolbar.data(); -} + ARMARX_DEBUG << "updateGui"; -float KinematicUnitWidgetController::cutJitter(float value) -{ - return (abs(value) < static_cast<float>(ui.jitterThresholdSpinBox->value())) ? 0 : value; -} + if (not kinematicUnitInterfacePrx) + { + ARMARX_WARNING << "KinematicUnit is not available!"; + return; + } -void KinematicUnitWidgetController::fetchData() -{ - ARMARX_DEBUG << "updateGui"; + const auto debugInfo = kinematicUnitInterfacePrx->getDebugInfo(); - if(not kinematicUnitInterfacePrx) - { - ARMARX_WARNING << "KinematicUnit is not available!"; - return; + emit onDebugInfoReceived(debugInfo); } - const auto debugInfo = kinematicUnitInterfacePrx->getDebugInfo(); - - emit onDebugInfoReceived(debugInfo); -} - -void KinematicUnitWidgetController::debugInfoReceived(const DebugInfo& debugInfo) -{ - ARMARX_DEBUG << "debug info received"; - - updateModel(debugInfo.jointAngles); + void + KinematicUnitWidgetController::debugInfoReceived(const DebugInfo& debugInfo) + { + ARMARX_DEBUG << "debug info received"; - updateJointAnglesTable(debugInfo.jointAngles); - updateJointVelocitiesTable(debugInfo.jointVelocities); - updateJointTorquesTable(debugInfo.jointTorques); - updateJointCurrentsTable(debugInfo.jointCurrents, debugInfo.jointStatus); - updateControlModesTable(debugInfo.jointModes); - updateJointStatusesTable(debugInfo.jointStatus); - updateMotorTemperaturesTable(debugInfo.jointMotorTemperatures); + updateModel(debugInfo.jointAngles); -} + updateJointAnglesTable(debugInfo.jointAngles); + updateJointVelocitiesTable(debugInfo.jointVelocities); + updateJointTorquesTable(debugInfo.jointTorques); + updateJointCurrentsTable(debugInfo.jointCurrents, debugInfo.jointStatus); + updateControlModesTable(debugInfo.jointModes); + updateJointStatusesTable(debugInfo.jointStatus); + updateMotorTemperaturesTable(debugInfo.jointMotorTemperatures); + } -void RangeValueDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const -{ - if (index.column() == KinematicUnitWidgetController::eTabelColumnAngleProgressbar) + void + RangeValueDelegate::paint(QPainter* painter, + const QStyleOptionViewItem& option, + const QModelIndex& index) const { - float jointValue = index.data(KinematicUnitWidgetController:: eJointAngleRole).toFloat(); - float loDeg = index.data(KinematicUnitWidgetController::eJointLoRole).toFloat(); - float hiDeg = index.data(KinematicUnitWidgetController::eJointHiRole).toFloat(); + if (index.column() == KinematicUnitWidgetController::eTabelColumnAngleProgressbar) + { + float jointValue = index.data(KinematicUnitWidgetController::eJointAngleRole).toFloat(); + float loDeg = index.data(KinematicUnitWidgetController::eJointLoRole).toFloat(); + float hiDeg = index.data(KinematicUnitWidgetController::eJointHiRole).toFloat(); + + if (hiDeg - loDeg <= 0) + { + QStyledItemDelegate::paint(painter, option, index); + return; + } - if (hiDeg - loDeg <= 0) + QStyleOptionProgressBar progressBarOption; + progressBarOption.rect = option.rect; + progressBarOption.minimum = loDeg; + progressBarOption.maximum = hiDeg; + progressBarOption.progress = jointValue; + progressBarOption.text = QString::number(jointValue); + progressBarOption.textVisible = true; + QPalette pal; + pal.setColor(QPalette::Background, Qt::red); + progressBarOption.palette = pal; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter); + } + else { QStyledItemDelegate::paint(painter, option, index); - return; } - - QStyleOptionProgressBar progressBarOption; - progressBarOption.rect = option.rect; - progressBarOption.minimum = loDeg; - progressBarOption.maximum = hiDeg; - progressBarOption.progress = jointValue; - progressBarOption.text = QString::number(jointValue); - progressBarOption.textVisible = true; - QPalette pal; - pal.setColor(QPalette::Background, Qt::red); - progressBarOption.palette = pal; - QApplication::style()->drawControl(QStyle::CE_ProgressBar, - &progressBarOption, painter); - } - else + + KinematicUnitWidgetController::~KinematicUnitWidgetController() { - QStyledItemDelegate::paint(painter, option, index); - } -} + kinematicUnitInterfacePrx = nullptr; -KinematicUnitWidgetController::~KinematicUnitWidgetController() -{ - kinematicUnitInterfacePrx = nullptr; + if (updateTask) + { + updateTask->stop(); + updateTask->join(); + updateTask = nullptr; + } + } - if(updateTask) + void + KinematicUnitWidgetController::on_pushButtonFromJson_clicked() { - updateTask->stop(); - updateTask->join(); - updateTask = nullptr; - } -} + bool ok; + const auto text = QInputDialog::getMultiLineText( + __widget, tr("JSON Joint values"), tr("Json:"), "{\n}", &ok) + .toStdString(); -void KinematicUnitWidgetController::on_pushButtonFromJson_clicked() -{ - bool ok; - const auto text = QInputDialog::getMultiLineText( - __widget, - tr("JSON Joint values"), - tr("Json:"), "{\n}", &ok).toStdString(); + if (!ok || text.empty()) + { + return; + } - if (!ok || text.empty()) - { - return; - } + NameValueMap jointAngles; + try + { + jointAngles = simox::json::json2NameValueMap(text); + } + catch (...) + { + ARMARX_ERROR << "invalid json"; + } - NameValueMap jointAngles; - try - { - jointAngles = simox::json::json2NameValueMap(text); - } - catch (...) - { - ARMARX_ERROR << "invalid json"; - } + NameControlModeMap jointModes; + for (const auto& [key, _] : jointAngles) + { + jointModes[key] = ePositionControl; + } - NameControlModeMap jointModes; - for (const auto& [key, _] : jointAngles) - { - jointModes[key] = ePositionControl; + try + { + kinematicUnitInterfacePrx->switchControlMode(jointModes); + kinematicUnitInterfacePrx->setJointAngles(jointAngles); + } + catch (...) + { + ARMARX_ERROR << "failed to switch mode or set angles"; + } } - try + void + KinematicUnitWidgetController::synchronizeRobotJointAngles() { - kinematicUnitInterfacePrx->switchControlMode(jointModes); - kinematicUnitInterfacePrx->setJointAngles(jointAngles); + const NameValueMap currentJointAngles = kinematicUnitInterfacePrx->getJointAngles(); + robot->setJointValues(currentJointAngles); } - catch (...) - { - ARMARX_ERROR << "failed to switch mode or set angles"; - } -} - -void KinematicUnitWidgetController::synchronizeRobotJointAngles() -{ - const NameValueMap currentJointAngles = kinematicUnitInterfacePrx->getJointAngles(); - robot->setJointValues(currentJointAngles); -} -} +} // namespace armarx -- GitLab