diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp index 1973976129415be09d640896b3bd2ec68736e60e..47c864d4d985762022e101d9187ec901db9f973b 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp @@ -25,7 +25,14 @@ #include "KinematicUnitConfigDialog.h" #include <RobotAPI/gui-plugins/KinematicUnitPlugin/ui_KinematicUnitConfigDialog.h> - +#include <RobotAPI/interface/core/NameValueMap.h> +#include <RobotAPI/interface/units/KinematicUnitInterface.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/application/Application.h> #include <ArmarXCore/core/system/ArmarXDataPath.h> @@ -51,6 +58,7 @@ #include <QTableWidget> #include <QClipboard> #include <QInputDialog> +#include <qtimer.h> #include <Inventor/SoDB.h> #include <Inventor/Qt/SoQt.h> @@ -58,6 +66,7 @@ // System #include <stdio.h> +#include <memory> #include <string> #include <string.h> #include <stdlib.h> @@ -79,6 +88,9 @@ using namespace VirtualRobot; KinematicUnitGuiPlugin::KinematicUnitGuiPlugin() { + + qRegisterMetaType<DebugInfo>("DebugInfo"); + addWidget<KinematicUnitWidgetController>(); } @@ -86,8 +98,7 @@ KinematicUnitWidgetController::KinematicUnitWidgetController() : kinematicUnitNode(nullptr), enableValueValidator(true), historyTime(100000), // 1/10 s - currentValueMax(5.0f), - selectedControlMode(ePositionControl) + currentValueMax(5.0f) { rootVisu = NULL; debugLayerVisu = NULL; @@ -97,6 +108,8 @@ KinematicUnitWidgetController::KinematicUnitWidgetController() : getWidget()->setEnabled(false); ui.tableJointList->setItemDelegateForColumn(eTabelColumnAngleProgressbar, &delegate); + + ui.radioButtonUnknown->setHidden(true); } void KinematicUnitWidgetController::onInitComponent() @@ -148,20 +161,12 @@ void KinematicUnitWidgetController::onInitComponent() void KinematicUnitWidgetController::onConnectComponent() { // ARMARX_INFO << "Kinematic Unit Gui :: onConnectComponent()"; - reportedJointAngles.clear(); - reportedJointVelocities.clear(); - reportedJointControlModes.clear(); - reportedJointTorques.clear(); jointCurrentHistory.clear(); - reportedJointStatuses.clear(); - reportedJointTemperatures.clear(); - jointAnglesUpdateFrequency = new filters::MedianFilter(100); + // jointAnglesUpdateFrequency = new filters::MedianFilter(100); kinematicUnitInterfacePrx = getProxy<KinematicUnitInterfacePrx>(kinematicUnitName); - topicName = kinematicUnitInterfacePrx->getReportTopicName(); - usingTopic(topicName); - lastJointAngleUpdateTimestamp = TimeUtil::GetTime().toSecondsDouble(); + lastJointAngleUpdateTimestamp = Clock::Now(); robotVisu->removeAllChildren(); robot.reset(); @@ -248,24 +253,48 @@ void KinematicUnitWidgetController::onConnectComponent() initGUIJointListTable(robotNodeSet); // Init control mode map - try - { - reportedJointControlModes = kinematicUnitInterfacePrx->getControlModes(); - } - catch (...) - { - } + // try + // { + // reportedJointControlModes = kinematicUnitInterfacePrx->getControlModes(); + // } + // catch (...) + // { + // } + + const auto initialDebugInfo = kinematicUnitInterfacePrx->getDebugInfo(); - initializeUi(); + initializeUi(initialDebugInfo); QMetaObject::invokeMethod(this, "resetSlider"); enableMainWidgetAsync(true); - updateTimerId = startTimer(1000); // slow timer that only ensures that skipped updates are shown at all + + updateTask = new RunningTask<KinematicUnitWidgetController>(this, &KinematicUnitWidgetController::runUpdate); + updateTask->start(); +} + +void KinematicUnitWidgetController::runUpdate() +{ + Metronome metronome(Frequency::Hertz(10)); + + while(kinematicUnitInterfacePrx) + { + fetchData(); + metronome.waitForNextTick(); + } + + ARMARX_INFO << "Connection to kinemetic unit lost. Update task terminates."; } void KinematicUnitWidgetController::onDisconnectComponent() { - killTimer(updateTimerId); + if(updateTask) + { + updateTask->stop(); + updateTask->join(); + updateTask = nullptr; + } + + // killTimer(updateTimerId); enableMainWidgetAsync(false); { @@ -284,6 +313,13 @@ void KinematicUnitWidgetController::onDisconnectComponent() void KinematicUnitWidgetController::onExitComponent() { + if(updateTask) + { + updateTask->stop(); + updateTask->join(); + updateTask = nullptr; + } + enableMainWidgetAsync(false); { @@ -383,13 +419,18 @@ void KinematicUnitWidgetController::copyToClipboard() { std::unique_lock lock(mutexNodeSet); + ARMARX_CHECK_NOT_NULL(kinematicUnitInterfacePrx); + const auto debugInfo = kinematicUnitInterfacePrx->getDebugInfo(); + + const auto selectedControlMode = getSelectedControlMode(); + if (selectedControlMode == ePositionControl) { - values = reportedJointAngles; + values = debugInfo.jointAngles; } else if (selectedControlMode == eVelocityControl) { - values = reportedJointVelocities; + values = debugInfo.jointVelocities; } } @@ -463,50 +504,61 @@ void KinematicUnitWidgetController::connectSlots() 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() +void KinematicUnitWidgetController::initializeUi(const DebugInfo& debugInfo) { //signal clicked is not emitted if you call setDown(), setChecked() or toggle(). - ui.radioButtonPositionControl->setChecked(true); - ui.widgetSliderFactor->setVisible(false); - setControlModePosition(); - updateControlModesTable(); -} -void KinematicUnitWidgetController::kinematicUnitZeroPosition() -{ - if (!robotNodeSet) - { - return; - } + // there is no default control mode + setControlModeRadioButtonGroup(ControlMode::eUnknown); - std::unique_lock lock(mutexNodeSet); - std::vector< RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - NameValueMap jointAngles; - NameControlModeMap jointModes; + ui.widgetSliderFactor->setVisible(false); - for (unsigned int i = 0; i < rn.size(); i++) - { - jointModes[rn[i]->getName()] = ePositionControl; - jointAngles[rn[i]->getName()] = 0.0f; - } + fetchData(); - try - { - kinematicUnitInterfacePrx->switchControlMode(jointModes); - kinematicUnitInterfacePrx->setJointAngles(jointAngles); - } - catch (...) - { - } + // setControlModePosition(); // FIXME purge this! + // updateControlModesTable(); - // Set slider to 0 if position control mode is used. - if (selectedControlMode == ePositionControl) - { - ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); - } } + +// void KinematicUnitWidgetController::kinematicUnitZeroPosition() +// { +// if (!robotNodeSet) +// { +// return; +// } + +// std::unique_lock lock(mutexNodeSet); +// std::vector< RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); +// NameValueMap jointAngles; +// NameControlModeMap jointModes; + +// for (unsigned int i = 0; i < rn.size(); i++) +// { +// jointModes[rn[i]->getName()] = ePositionControl; +// jointAngles[rn[i]->getName()] = 0.0f; +// } + +// try +// { +// kinematicUnitInterfacePrx->switchControlMode(jointModes); +// kinematicUnitInterfacePrx->setJointAngles(jointAngles); +// } +// catch (...) +// { +// } + +// // Set slider to 0 if position control mode is used. +// if (selectedControlMode == ePositionControl) +// { +// ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); +// } +// } + + void KinematicUnitWidgetController::kinematicUnitZeroVelocity() { if (!robotNodeSet) @@ -534,46 +586,49 @@ void KinematicUnitWidgetController::kinematicUnitZeroVelocity() { } + const auto selectedControlMode = getSelectedControlMode(); if (selectedControlMode == eVelocityControl) { ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); } } -void KinematicUnitWidgetController::kinematicUnitZeroTorque() -{ - if (!robotNodeSet) - { - return; - } - - std::unique_lock lock(mutexNodeSet); - std::vector< RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); - NameValueMap tor; - NameControlModeMap jointModes; - - for (unsigned int i = 0; i < rn.size(); i++) - { - jointModes[rn[i]->getName()] = eTorqueControl; - tor[rn[i]->getName()] = 0.0f; - } - - try - { - kinematicUnitInterfacePrx->switchControlMode(jointModes); - kinematicUnitInterfacePrx->setJointTorques(tor); - } - catch (...) - { - } - - if (selectedControlMode == eVelocityControl) - { - ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); - } -} +// void KinematicUnitWidgetController::kinematicUnitZeroTorque() +// { +// if (!robotNodeSet) +// { +// return; +// } + +// std::unique_lock lock(mutexNodeSet); +// std::vector< RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); +// NameValueMap tor; +// NameControlModeMap jointModes; + +// for (unsigned int i = 0; i < rn.size(); i++) +// { +// jointModes[rn[i]->getName()] = eTorqueControl; +// tor[rn[i]->getName()] = 0.0f; +// } + +// try +// { +// kinematicUnitInterfacePrx->switchControlMode(jointModes); +// kinematicUnitInterfacePrx->setJointTorques(tor); +// } +// catch (...) +// { +// } + +// if (selectedControlMode == eVelocityControl) +// { +// ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); +// } +// } void KinematicUnitWidgetController::resetSlider() { + const auto selectedControlMode = getSelectedControlMode(); + if (selectedControlMode == eVelocityControl || selectedControlMode == eTorqueControl) { resetSliderToZeroPosition(); @@ -597,6 +652,8 @@ void KinematicUnitWidgetController::resetSlider() void KinematicUnitWidgetController::resetSliderToZeroPosition() { + const auto selectedControlMode = getSelectedControlMode(); + if (selectedControlMode == eVelocityControl || selectedControlMode == eTorqueControl) { ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); @@ -604,6 +661,30 @@ void KinematicUnitWidgetController::resetSliderToZeroPosition() } } +void KinematicUnitWidgetController::setControlModeRadioButtonGroup(const ControlMode& controlMode) +{ + ARMARX_INFO << "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; + } + +} + void KinematicUnitWidgetController::setControlModePosition() { if (!ui.radioButtonPositionControl->isChecked()) @@ -611,9 +692,11 @@ void KinematicUnitWidgetController::setControlModePosition() return; } NameControlModeMap jointModes; - selectedControlMode = ePositionControl; + // selectedControlMode = ePositionControl; ui.widgetSliderFactor->setVisible(false); + // FIXME currentNode should be passed to this function! + if (currentNode) { QString unit = currentNode->isRotationalJoint() @@ -698,7 +781,6 @@ void KinematicUnitWidgetController::setControlModeVelocity() } - selectedControlMode = eVelocityControl; ui.widgetSliderFactor->setVisible(true); ui.horizontalSliderKinematicUnitPos->blockSignals(true); @@ -709,6 +791,30 @@ void KinematicUnitWidgetController::setControlModeVelocity() } } +ControlMode KinematicUnitWidgetController::getSelectedControlMode() const +{ + 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; + + +} + void KinematicUnitWidgetController::setControlModeTorque() { if (!ui.radioButtonTorqueControl->isChecked()) @@ -739,7 +845,6 @@ void KinematicUnitWidgetController::setControlModeTorque() ui.horizontalSliderKinematicUnitPos->setMaximum(20000.0); ui.horizontalSliderKinematicUnitPos->setMinimum(-20000.0); - selectedControlMode = eTorqueControl; ui.widgetSliderFactor->setVisible(true); ui.horizontalSliderKinematicUnitPos->blockSignals(false); @@ -911,27 +1016,43 @@ void KinematicUnitWidgetController::selectJoint(int i) { std::unique_lock lock(mutexNodeSet); - if (!robotNodeSet || i < 0 || i >= (int)robotNodeSet->getSize()) + ARMARX_INFO << "Selected index: " << ui.nodeListComboBox->currentIndex(); + + if (!robotNodeSet || i < 0 || i >= static_cast<int>(robotNodeSet->getSize())) { return; } currentNode = robotNodeSet->getAllRobotNodes()[i]; + ARMARX_IMPORTANT << "Selected joint is `" << currentNode->getName() << "`."; /* //ui.lcdNumberKinematicUnitJointValue->display(pos*180.0f/(float)M_PI); ui.lcdNumberKinematicUnitJointValue->display(posT); */ - if (selectedControlMode == ePositionControl) + + 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; + } + + // const auto selectedControlMode = getSelectedControlMode(); + const auto controlMode = controlModes.at(currentNode->getName()); + setControlModeRadioButtonGroup(controlMode); + + + if (controlMode == ePositionControl) { setControlModePosition(); } - else if (selectedControlMode == eVelocityControl) + else if (controlMode == eVelocityControl) { setControlModeVelocity(); ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); } - else if (selectedControlMode == eTorqueControl) + else if (controlMode == eTorqueControl) { setControlModeTorque(); ui.horizontalSliderKinematicUnitPos->setSliderPosition(SLIDER_ZERO_POSITION); @@ -963,7 +1084,8 @@ void KinematicUnitWidgetController::sliderValueChanged(int pos) // NameControlModeMap::const_iterator it; // it = reportedJointControlModes.find(currentNode->getName()); // const ControlMode currentControlMode = it->second; - const ControlMode currentControlMode = selectedControlMode; + const ControlMode currentControlMode = getSelectedControlMode(); + const bool isDeg = ui.checkBoxUseDegree->isChecked(); const bool isRot = currentNode->isRotationalJoint(); @@ -990,7 +1112,7 @@ void KinematicUnitWidgetController::sliderValueChanged(int pos) catch (...) { } - updateModel(); + // updateModel(); } } else if (currentControlMode == eVelocityControl) @@ -1009,7 +1131,7 @@ void KinematicUnitWidgetController::sliderValueChanged(int pos) catch (...) { } - updateModel(); + // updateModel(); } } else if (currentControlMode == eTorqueControl) @@ -1028,7 +1150,7 @@ void KinematicUnitWidgetController::sliderValueChanged(int pos) catch (...) { } - updateModel(); + // updateModel(); } } else @@ -1039,7 +1161,7 @@ void KinematicUnitWidgetController::sliderValueChanged(int pos) -void KinematicUnitWidgetController::updateControlModesTable() +void KinematicUnitWidgetController::updateControlModesTable(const NameControlModeMap& reportedJointControlModes) { if (!getWidget() || !robotNodeSet) { @@ -1111,7 +1233,7 @@ void KinematicUnitWidgetController::updateControlModesTable() } } -void KinematicUnitWidgetController::updateJointStatusesTable() +void KinematicUnitWidgetController::updateJointStatusesTable(const NameStatusMap& reportedJointStatuses) { if (!getWidget() || !robotNodeSet || reportedJointStatuses.empty()) { @@ -1187,25 +1309,9 @@ QString KinematicUnitWidgetController::translateStatus(ErrorStatus status) } } -void KinematicUnitWidgetController::updateJointAnglesTable() +void KinematicUnitWidgetController::updateJointAnglesTable(const NameValueMap& reportedJointAngles) { - - float dirty_squaresum = 0; - std::unique_lock lock(mutexNodeSet); - if (jointAnglesUpdateFrequency && jointAnglesUpdateFrequency->getValue()) - { - - double deltaT = jointAnglesUpdateFrequency->getValue()->getDouble(); - if (deltaT != 0) - { - ui.labelUpdateFreq->setText(QString::number(static_cast<int>(1.0 / deltaT)) + " Hz"); - } - else - { - ui.labelUpdateFreq->setText("- Hz"); - } - } if (!robotNodeSet) { @@ -1226,7 +1332,6 @@ void KinematicUnitWidgetController::updateJointAnglesTable() } const float currentValue = it->second; - dirty_squaresum += currentValue * currentValue; QModelIndex index = ui.tableJointList->model()->index(i, eTabelColumnAngleProgressbar); float conversionFactor = ui.checkBoxUseDegree->isChecked() && @@ -1237,22 +1342,21 @@ void KinematicUnitWidgetController::updateJointAnglesTable() } //update only if values changed - if ((fabs(dirty_squaresum_old[0] - dirty_squaresum)) > 0.0000005) - { - updateModel(); - dirty_squaresum_old[0] = dirty_squaresum; - // ARMARX_INFO << "update model" << flush; - } + // if ((fabs(dirty_squaresum_old[0] - dirty_squaresum)) > 0.0000005) + // { + // updateModel(); + // dirty_squaresum_old[0] = dirty_squaresum; + // // ARMARX_INFO << "update model" << flush; + // } } -void KinematicUnitWidgetController::updateJointVelocitiesTable() +void KinematicUnitWidgetController::updateJointVelocitiesTable(const NameValueMap& reportedJointVelocities) { if (!getWidget()) { return; } - float dirty_squaresum = 0; std::unique_lock lock(mutexNodeSet); if (!robotNodeSet) { @@ -1272,7 +1376,6 @@ void KinematicUnitWidgetController::updateJointVelocitiesTable() } float currentValue = it->second; - dirty_squaresum += currentValue * currentValue; if (ui.checkBoxUseDegree->isChecked() && rn[i]->isRotationalJoint()) { currentValue *= 180.0 / M_PI; @@ -1281,15 +1384,9 @@ void KinematicUnitWidgetController::updateJointVelocitiesTable() newItem = new QTableWidgetItem(Text); ui.tableJointList->setItem(i, eTabelColumnVelocity, newItem); } - - if ((fabs(dirty_squaresum_old[1] - dirty_squaresum)) > 0.0000005) - { - updateModel(); - dirty_squaresum_old[1] = dirty_squaresum; - } } -void KinematicUnitWidgetController::updateJointTorquesTable() +void KinematicUnitWidgetController::updateJointTorquesTable(const NameValueMap& reportedJointTorques) { @@ -1317,7 +1414,7 @@ void KinematicUnitWidgetController::updateJointTorquesTable() } } -void KinematicUnitWidgetController::updateJointCurrentsTable() +void KinematicUnitWidgetController::updateJointCurrentsTable(const NameValueMap& reportedJointCurrents, const NameStatusMap& reportedJointStatuses) { @@ -1328,7 +1425,9 @@ void KinematicUnitWidgetController::updateJointCurrentsTable() } std::vector< RobotNodePtr > rn = robotNodeSet->getAllRobotNodes(); QTableWidgetItem* newItem; - NameValueMap reportedJointCurrents = jointCurrentHistory.back().second; + + // FIXME history! + // NameValueMap reportedJointCurrents = jointCurrentHistory.back().second; NameValueMap::const_iterator it; for (unsigned int i = 0; i < rn.size(); i++) @@ -1345,10 +1444,10 @@ void KinematicUnitWidgetController::updateJointCurrentsTable() ui.tableJointList->setItem(i, eTabelColumnCurrent, newItem); } - highlightCriticalValues(); + highlightCriticalValues(reportedJointStatuses); } -void KinematicUnitWidgetController::updateMotorTemperaturesTable() +void KinematicUnitWidgetController::updateMotorTemperaturesTable(const NameValueMap& reportedJointTemperatures) { @@ -1378,132 +1477,95 @@ void KinematicUnitWidgetController::updateMotorTemperaturesTable() } -void KinematicUnitWidgetController::reportJointAngles(const NameValueMap& jointAngles, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) -{ - if (!aValueChanged && reportedJointAngles.size() > 0) - { - return; - } - - - std::unique_lock lock(mutexNodeSet); - jointAnglesUpdateFrequency->update(timestamp, new Variant((double)(timestamp - lastJointAngleUpdateTimestamp) * 1e-6)); - lastJointAngleUpdateTimestamp = timestamp; - mergeMaps(reportedJointAngles, jointAngles); - if (skipper.checkFrequency(c, 30)) - { - // ARMARX_INFO << deactivateSpam(1) << "updating angles"; - emit jointAnglesReported(); - } - // else - // { - // ARMARX_INFO << deactivateSpam(1) << "skipping angles"; - // } -} - -void KinematicUnitWidgetController::reportJointVelocities(const NameValueMap& jointVelocities, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) -{ - if (!aValueChanged && reportedJointVelocities.size() > 0) - { - return; - } - - std::unique_lock lock(mutexNodeSet); - mergeMaps(reportedJointVelocities, jointVelocities); - if (skipper.checkFrequency(c)) - { - emit jointVelocitiesReported(); - } -} - -void KinematicUnitWidgetController::reportJointTorques(const NameValueMap& jointTorques, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) -{ - if (!aValueChanged && reportedJointTorques.size() > 0) - { - return; - } - - std::unique_lock lock(mutexNodeSet); - reportedJointTorques = jointTorques; - if (skipper.checkFrequency(c)) - { - emit jointTorquesReported(); - } -} - -void KinematicUnitWidgetController::reportJointAccelerations(const NameValueMap& jointAccelerations, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) -{ - -} - -void KinematicUnitWidgetController::reportControlModeChanged(const NameControlModeMap& jointModes, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) -{ - // if(!aValueChanged && reportedJointControlModes.size() > 0) - // return; - std::unique_lock lock(mutexNodeSet); - mergeMaps(reportedJointControlModes, jointModes); - if (skipper.checkFrequency(c)) - { - emit jointControlModesReported(); - } -} - -void KinematicUnitWidgetController::reportJointCurrents(const NameValueMap& jointCurrents, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) -{ - std::unique_lock lock(mutexNodeSet); - - if (aValueChanged && jointCurrents.size() > 0) - { - jointCurrentHistory.push_back(std::pair<Ice::Long, NameValueMap>(timestamp, jointCurrents)); - } - - while (jointCurrentHistory.size() > 1 && jointCurrentHistory.back().first - jointCurrentHistory.front().first > historyTime) - { - jointCurrentHistory.pop_front(); - } - - - if (jointCurrentHistory.size() > 0) - { - if (skipper.checkFrequency(c)) - { - emit jointCurrentsReported(); - } - } -} - -void KinematicUnitWidgetController::reportJointMotorTemperatures(const NameValueMap& jointMotorTemperatures, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) -{ - if (!aValueChanged && reportedJointStatuses.size() > 0) - { - return; - } - - std::unique_lock lock(mutexNodeSet); - mergeMaps(this->reportedJointTemperatures, jointMotorTemperatures); - if (skipper.checkFrequency(c)) - { - emit jointMotorTemperaturesReported(); - } -} - -void KinematicUnitWidgetController::reportJointStatuses(const NameStatusMap& jointStatuses, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) -{ - if (!aValueChanged && reportedJointStatuses.size() > 0) - { - return; - } - - std::unique_lock lock(mutexNodeSet); - mergeMaps(reportedJointStatuses, jointStatuses); - if (skipper.checkFrequency(c)) - { - emit jointStatusesReported(); - } -} - - -void KinematicUnitWidgetController::updateModel() +// void KinematicUnitWidgetController::reportJointAngles(const NameValueMap& jointAngles, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) +// { +// reportedJointAngles = kinematicUnitInterfacePrx->getJointAngles(); +// emit jointAnglesReported(); + +// } + +// void KinematicUnitWidgetController::reportJointVelocities(const NameValueMap& jointVelocities, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) +// { +// reportedJointVelocities = kinematicUnitInterfacePrx->getJointVelocities(); +// emit jointVelocitiesReported(); + +// } + +// void KinematicUnitWidgetController::reportJointTorques(const NameValueMap& jointTorques, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) +// { +// reportedJointTorques = kinematicUnitInterfacePrx->getJointTorques(); +// emit jointTorquesReported(); +// } + +// void KinematicUnitWidgetController::reportJointAccelerations(const NameValueMap& jointAccelerations, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) +// { + +// } + +// void KinematicUnitWidgetController::reportControlModeChanged(const NameControlModeMap& jointModes, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) +// { +// reportedJointControlModes = kinematicUnitInterfacePrx->getControlModes(); +// emit jointControlModesReported(); +// } + +// void KinematicUnitWidgetController::reportJointCurrents(const NameValueMap& jointCurrents, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) +// { +// std::unique_lock lock(mutexNodeSet); + +// const auto jointCurrents = kinematicUnitInterfacePrx->getJointCurrent(); + +// if (aValueChanged && jointCurrents.size() > 0) +// { +// jointCurrentHistory.push_back(std::pair<Ice::Long, NameValueMap>(timestamp, jointCurrents)); +// } + +// while (jointCurrentHistory.size() > 1 && jointCurrentHistory.back().first - jointCurrentHistory.front().first > historyTime) +// { +// jointCurrentHistory.pop_front(); +// } + + +// if (jointCurrentHistory.size() > 0) +// { +// if (skipper.checkFrequency(c)) +// { +// emit jointCurrentsReported(); +// } +// } +// } + +// void KinematicUnitWidgetController::reportJointMotorTemperatures(const NameValueMap& jointMotorTemperatures, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) +// { +// if (!aValueChanged && reportedJointStatuses.size() > 0) +// { +// return; +// } + +// std::unique_lock lock(mutexNodeSet); +// mergeMaps(this->reportedJointTemperatures, jointMotorTemperatures); +// if (skipper.checkFrequency(c)) +// { +// emit jointMotorTemperaturesReported(); +// } +// } + +// void KinematicUnitWidgetController::reportJointStatuses(const NameStatusMap& jointStatuses, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) +// { +// if (!aValueChanged && reportedJointStatuses.size() > 0) +// { +// return; +// } + +// std::unique_lock lock(mutexNodeSet); +// mergeMaps(reportedJointStatuses, jointStatuses); +// if (skipper.checkFrequency(c)) +// { +// emit jointStatusesReported(); +// } +// } + + +void KinematicUnitWidgetController::updateModel(const NameValueMap& reportedJointAngles) { // ARMARX_INFO << "updateModel()" << flush; std::unique_lock lock(mutexNodeSet); @@ -1514,7 +1576,7 @@ void KinematicUnitWidgetController::updateModel() robot->setJointValues(reportedJointAngles); } -void KinematicUnitWidgetController::highlightCriticalValues() +void KinematicUnitWidgetController::highlightCriticalValues(const NameStatusMap& reportedJointStatuses) { if (!enableValueValidator) { @@ -1619,18 +1681,42 @@ float KinematicUnitWidgetController::cutJitter(float value) return (abs(value) < static_cast<float>(ui.jitterThresholdSpinBox->value())) ? 0 : value; } -void KinematicUnitWidgetController::timerEvent(QTimerEvent*) +// void KinematicUnitWidgetController::timerEvent(QTimerEvent*) +// { +// ARMARX_INFO << "timerEvent"; +// updateGui(); +// } + +void KinematicUnitWidgetController::fetchData() { - updateJointAnglesTable(); - updateJointVelocitiesTable(); - updateJointTorquesTable(); - updateJointCurrentsTable(); - updateControlModesTable(); - updateJointStatusesTable(); - updateMotorTemperaturesTable(); + ARMARX_INFO << "updateGui"; + + if(not kinematicUnitInterfacePrx) + { + ARMARX_WARNING << "KinematicUnit is not available!"; + return; + } + + const auto debugInfo = kinematicUnitInterfacePrx->getDebugInfo(); + + emit onDebugInfoReceived(debugInfo); } +void KinematicUnitWidgetController::debugInfoReceived(const DebugInfo& debugInfo) +{ + ARMARX_INFO << "debug info received"; + + 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 { @@ -1684,7 +1770,15 @@ void RangeValueDelegate::paint(QPainter* painter, const QStyleOptionViewItem& op } } -KinematicUnitWidgetController::~KinematicUnitWidgetController() {} +KinematicUnitWidgetController::~KinematicUnitWidgetController() +{ + if(updateTask) + { + updateTask->stop(); + updateTask->join(); + updateTask = nullptr; + } +} void KinematicUnitWidgetController::on_pushButtonFromJson_clicked() { diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h index d0a98a0a1a57efb6958b103b81732e022afbedf4..3da0e8b517a8e7f1afd80f8d31c7eea450c63629 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.h @@ -32,6 +32,7 @@ #include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXGuiPlugin.h> #include <ArmarXGui/libraries/ArmarXGuiBase/ArmarXComponentWidgetController.h> +#include "ArmarXCore/core/services/tasks/RunningTask.h" #include <ArmarXCore/core/Component.h> /* Qt headers */ @@ -58,6 +59,8 @@ #include <mutex> +#include <ArmarXCore/core/time.h> + namespace armarx { class KinematicUnitConfigDialog; @@ -110,8 +113,8 @@ namespace armarx a joint with the slider below. */ class KinematicUnitWidgetController : - public ArmarXComponentWidgetControllerTemplate<KinematicUnitWidgetController>, - public KinematicUnitListener + public ArmarXComponentWidgetControllerTemplate<KinematicUnitWidgetController> + // public KinematicUnitListener { Q_OBJECT public: @@ -189,16 +192,20 @@ namespace armarx void jointStatusesReported(); void jointMotorTemperaturesReported(); + void onDebugInfoReceived(const DebugInfo& debugInfo); + public slots: // KinematicUnit - void kinematicUnitZeroPosition(); + // void kinematicUnitZeroPosition(); void kinematicUnitZeroVelocity(); - void kinematicUnitZeroTorque(); + // void kinematicUnitZeroTorque(); + void setControlModePosition(); void setControlModeVelocity(); void setControlModeTorque(); + void selectJoint(int i); void selectJointFromTableWidget(int row, int column); void sliderValueChanged(int i); @@ -210,19 +217,22 @@ namespace armarx void resetSlider(); void resetSliderToZeroPosition(); - void updateJointAnglesTable(); - void updateJointVelocitiesTable(); - void updateJointTorquesTable(); - void updateJointCurrentsTable(); - void updateMotorTemperaturesTable(); - void updateJointStatusesTable(); - void updateControlModesTable(); + void updateJointAnglesTable(const NameValueMap& reportedJointAngles); + void updateJointVelocitiesTable(const NameValueMap& reportedJointVelocities); + void updateJointTorquesTable(const NameValueMap& reportedJointTorques); + void updateJointCurrentsTable(const NameValueMap& reportedJointCurrents, const NameStatusMap& reportedJointStatuses); + void updateMotorTemperaturesTable(const NameValueMap& reportedMotorTemperatures); + void updateJointStatusesTable(const NameStatusMap& reportedJointStatuses); + void updateControlModesTable(const NameControlModeMap& reportedJointControlModes); + void updateKinematicUnitListInDialog(); + void fetchData(); + protected: void connectSlots(); - void initializeUi(); + void initializeUi(const DebugInfo& debugInfo); QString translateStatus(OperationStatus status); QString translateStatus(ErrorStatus status); @@ -254,18 +264,18 @@ namespace armarx armarx::DebugDrawerComponentPtr debugDrawer; // interface implementation - void reportControlModeChanged(const NameControlModeMap& jointModes, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; - void reportJointAngles(const NameValueMap& jointAngles, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; - void reportJointVelocities(const NameValueMap& jointVelocities, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; - void reportJointTorques(const NameValueMap& jointTorques, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; - void reportJointAccelerations(const NameValueMap& jointAccelerations, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; - void reportJointCurrents(const NameValueMap& jointCurrents, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; - void reportJointMotorTemperatures(const NameValueMap& jointMotorTemperatures, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; - void reportJointStatuses(const NameStatusMap& jointStatuses, Ice::Long timestamp, bool aValueChanged, const Ice::Current&) override; + // void reportControlModeChanged(const NameControlModeMap& jointModes, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; + // void reportJointAngles(const NameValueMap& jointAngles, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; + // void reportJointVelocities(const NameValueMap& jointVelocities, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; + // void reportJointTorques(const NameValueMap& jointTorques, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; + // void reportJointAccelerations(const NameValueMap& jointAccelerations, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; + // void reportJointCurrents(const NameValueMap& jointCurrents, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; + // void reportJointMotorTemperatures(const NameValueMap& jointMotorTemperatures, Ice::Long timestamp, bool aValueChanged, const Ice::Current& c) override; + // void reportJointStatuses(const NameStatusMap& jointStatuses, Ice::Long timestamp, bool aValueChanged, const Ice::Current&) override; - void updateModel(); + void updateModel(const NameValueMap& jointAngles); - void highlightCriticalValues(); + void highlightCriticalValues(const NameStatusMap& reportedJointStatuses); protected slots: @@ -274,6 +284,8 @@ namespace armarx void on_pushButtonFromJson_clicked(); void synchronizeRobotJointAngles(); + void debugInfoReceived(const DebugInfo& debugInfo); + private: @@ -288,23 +300,23 @@ namespace armarx bool enableValueValidator; bool viewerEnabled = true; Ice::Long historyTime; - DatafieldFilterBasePtr jointAnglesUpdateFrequency; - long lastJointAngleUpdateTimestamp; + // DatafieldFilterBasePtr jointAnglesUpdateFrequency; + armarx::DateTime lastJointAngleUpdateTimestamp; float currentValueMax; - NameValueMap reportedJointAngles; - NameValueMap reportedJointVelocities; - NameControlModeMap reportedJointControlModes; - NameValueMap reportedJointTorques; - NameValueMap reportedJointTemperatures; + // NameValueMap reportedJointAngles; + // NameValueMap reportedJointVelocities; + // NameControlModeMap reportedJointControlModes; + // NameValueMap reportedJointTorques; + // NameValueMap reportedJointTemperatures; std::deque<std::pair<Ice::Long, NameValueMap>> jointCurrentHistory; - NameStatusMap reportedJointStatuses; + // NameStatusMap reportedJointStatuses; std::vector<float> dirty_squaresum_old; QPointer<QWidget> __widget; QPointer<KinematicUnitConfigDialog> dialog; - ControlMode selectedControlMode; + // ControlMode selectedControlMode; RangeValueDelegate delegate; /** @@ -325,13 +337,22 @@ namespace armarx // QObject interface protected: - void timerEvent(QTimerEvent*) override; - int updateTimerId = 0; - IceReportSkipper skipper = {20.0f}; + // void timerEvent(QTimerEvent*) override; + // int updateTimerId = 0; + // IceReportSkipper skipper = {20.0f}; + // std::unique_ptr<QTimer> timer; + + void runUpdate(); + + armarx::RunningTask<KinematicUnitWidgetController>::pointer_type updateTask; + + ControlMode getSelectedControlMode() const; + void setControlModeRadioButtonGroup(const ControlMode& controlMode); + + }; using FloatVector = ::std::vector< ::Ice::Float>; using KinematicUnitGuiPluginPtr = std::shared_ptr<KinematicUnitWidgetController>; } - diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui index a265252ea20b34ad1b381292a2748316e88460b3..9273d2f6328aafd8be7a40ba052b6f1c12364726 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/kinematicunitguiplugin.ui @@ -81,7 +81,7 @@ <string>Position Control</string> </property> <property name="checked"> - <bool>true</bool> + <bool>false</bool> </property> </widget> </item> @@ -108,6 +108,19 @@ </property> </widget> </item> + <item> + <widget class="QRadioButton" name="radioButtonUnknown"> + <property name="text"> + <string></string> + </property> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="visible"> + <bool>false</bool> + </property> + </widget> + </item> <item> <spacer name="horizontalSpacer"> <property name="orientation">