From bf82109d3e5573636ac05e29fcf338c8655e7e88 Mon Sep 17 00:00:00 2001 From: Rainer Kartmann <rainer.kartmann@kit.edu> Date: Tue, 3 May 2022 15:28:12 +0200 Subject: [PATCH] Add synchronization in onConnect (to be sure) --- .../KinematicUnitGuiPlugin.cpp | 64 ++++++++++--------- .../KinematicUnitGuiPlugin.h | 4 ++ 2 files changed, 37 insertions(+), 31 deletions(-) diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp index 51633af95..197397612 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp @@ -147,7 +147,7 @@ void KinematicUnitWidgetController::onInitComponent() void KinematicUnitWidgetController::onConnectComponent() { - ARMARX_INFO << "kinematic unit gui :: onConnectComponent()"; + // ARMARX_INFO << "Kinematic Unit Gui :: onConnectComponent()"; reportedJointAngles.clear(); reportedJointVelocities.clear(); reportedJointControlModes.clear(); @@ -156,10 +156,11 @@ void KinematicUnitWidgetController::onConnectComponent() reportedJointStatuses.clear(); reportedJointTemperatures.clear(); - jointAnglesUpdateFrequency = new filters::MedianFilter(100); kinematicUnitInterfacePrx = getProxy<KinematicUnitInterfacePrx>(kinematicUnitName); topicName = kinematicUnitInterfacePrx->getReportTopicName(); + usingTopic(topicName); + lastJointAngleUpdateTimestamp = TimeUtil::GetTime().toSecondsDouble(); robotVisu->removeAllChildren(); @@ -168,10 +169,9 @@ void KinematicUnitWidgetController::onConnectComponent() std::string rfile; Ice::StringSeq includePaths; - // get robot filename + // Get robot filename try { - Ice::StringSeq packages = kinematicUnitInterfacePrx->getArmarXPackages(); packages.push_back(Application::GetProjectName()); ARMARX_VERBOSE << "ArmarX packages " << packages; @@ -200,7 +200,7 @@ void KinematicUnitWidgetController::onConnectComponent() } catch (...) { - ARMARX_ERROR << "Unable to retrieve robot filename"; + ARMARX_ERROR << "Unable to retrieve robot filename."; } try @@ -208,6 +208,10 @@ void KinematicUnitWidgetController::onConnectComponent() 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"; @@ -216,35 +220,34 @@ void KinematicUnitWidgetController::onConnectComponent() if (!robot || !robot->hasRobotNodeSet(robotNodeSetName)) { getObjectScheduler()->terminate(); - if (getWidget()->parentWidget()) { getWidget()->parentWidget()->close(); } - - std::cout << "returning" << std::endl; return; } - // check robot name and disable setZero Button if necessary + // Check robot name and disable setZero Button if necessary if (not simox::alg::starts_with(robot->getName(), "Armar3")) { - ARMARX_IMPORTANT << "Disable the SetZero button because the robot name is " << robot->getName(); + ARMARX_IMPORTANT << "Disable the SetZero button because the robot name is '" << robot->getName() << "'."; ui.pushButtonKinematicUnitPos1->setDisabled(true); } 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); - // init control mode map + // Fetch the current joint angles. + synchronizeRobotJointAngles(); + + initGUIComboBox(robotNodeSet); // init the pull down menu (QT: ComboBox) + initGUIJointListTable(robotNodeSet); + + // Init control mode map try { reportedJointControlModes = kinematicUnitInterfacePrx->getControlModes(); @@ -255,7 +258,6 @@ void KinematicUnitWidgetController::onConnectComponent() initializeUi(); - usingTopic(topicName); QMetaObject::invokeMethod(this, "resetSlider"); enableMainWidgetAsync(true); updateTimerId = startTimer(1000); // slow timer that only ensures that skipped updates are shown at all @@ -355,13 +357,11 @@ void KinematicUnitWidgetController::saveSettings(QSettings* settings) settings->setValue("enableValueValidator", enableValueValidator); settings->setValue("viewerEnabled", viewerEnabled); assert(historyTime % 1000 == 0); - settings->setValue("historyTime", (int)(historyTime / 1000)); + settings->setValue("historyTime", static_cast<int>(historyTime / 1000)); settings->setValue("currentValueMax", currentValueMax); } - - void KinematicUnitWidgetController::showVisuLayers(bool show) { if (debugDrawer) @@ -410,7 +410,9 @@ void KinematicUnitWidgetController::updateGuiElements() // modelUpdateCB(); } -void KinematicUnitWidgetController::updateKinematicUnitListInDialog() {} +void KinematicUnitWidgetController::updateKinematicUnitListInDialog() +{ +} void KinematicUnitWidgetController::modelUpdateCB() { @@ -418,7 +420,6 @@ void KinematicUnitWidgetController::modelUpdateCB() SoNode* KinematicUnitWidgetController::getScene() { - if (viewerEnabled) { ARMARX_INFO << "Returning scene "; @@ -500,7 +501,7 @@ void KinematicUnitWidgetController::kinematicUnitZeroPosition() { } - //set slider to 0 if position control mode is used + // Set slider to 0 if position control mode is used. if (selectedControlMode == ePositionControl) { ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); @@ -615,9 +616,9 @@ void KinematicUnitWidgetController::setControlModePosition() if (currentNode) { - QString unit = currentNode->isRotationalJoint() ? - (ui.checkBoxUseDegree->isChecked() ? "deg" : "rad") : - "mm"; + 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(); @@ -644,9 +645,7 @@ void KinematicUnitWidgetController::setControlModePosition() // 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. - - const NameValueMap currentJointAngles = kinematicUnitInterfacePrx->getJointAngles(); - robot->setJointValues(currentJointAngles); + synchronizeRobotJointAngles(); } float pos = currentNode->getJointValue() * conversionFactor; @@ -745,10 +744,7 @@ void KinematicUnitWidgetController::setControlModeTorque() ui.horizontalSliderKinematicUnitPos->blockSignals(false); resetSlider(); - } - - } VirtualRobot::RobotPtr KinematicUnitWidgetController::loadRobotFile(std::string fileName) @@ -1729,3 +1725,9 @@ void KinematicUnitWidgetController::on_pushButtonFromJson_clicked() ARMARX_ERROR << "failed to switch mode or set angles"; } } + +void KinematicUnitWidgetController::synchronizeRobotJointAngles() +{ + const NameValueMap currentJointAngles = kinematicUnitInterfacePrx->getJointAngles(); + robot->setJointValues(currentJointAngles); +} diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h index b84b6ccc6..d0a98a0a1 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h @@ -268,9 +268,13 @@ namespace armarx void highlightCriticalValues(); protected slots: + void showVisuLayers(bool show); void copyToClipboard(); void on_pushButtonFromJson_clicked(); + + void synchronizeRobotJointAngles(); + private: std::recursive_mutex mutexNodeSet; -- GitLab