217 connect(widget.pushButtonLoadTask, SIGNAL(clicked()),
this, SLOT(
loadTask()));
220 connect(widget.checkBoxDrawTrace, SIGNAL(clicked(
bool)),
this, SLOT(
drawEdges(
bool)));
222 connect(widget.doubleSpinBoxTraceStep,
223 SIGNAL(valueChanged(
double)),
226 connect(widget.pushButtonHideAllPaths, SIGNAL(clicked()),
this, SLOT(
hideAllPaths()));
228 connect(widget.pushButtonSetConfig, SIGNAL(clicked()),
this, SLOT(
setCurrentConfig()));
229 connect(widget.spinBoxPathNumber, SIGNAL(valueChanged(
int)),
this, SLOT(
setCurrentPath()));
230 connect(widget.sliderPathPosition,
231 SIGNAL(valueChanged(
double)),
234 connect(widget.sliderPathPosition,
235 SIGNAL(valueChanged(
double)),
238 connect(widget.checkBoxCollisionNodeHighlighting,
239 SIGNAL(toggled(
bool)),
242 startTimer(timerPeriod);
295 if (!widget.spinBoxPathNumber->value())
297 widget.labelCurrentPathCurrentLen->setText(QString::number(0));
302 const auto val = widget.sliderPathPosition->value();
303 widget.labelCurrentPathCurrentLen->setText(QString::number(val));
305 std::distance(pathAcc.begin(), std::upper_bound(pathAcc.begin(), pathAcc.end(), val));
306 widget.labelCurrentPathCurrentNode->setText(QString::number(indexTo));
308 assert(indexTo >= 0);
309 assert(
static_cast<std::size_t
>(indexTo) <= path.size());
317 if (
static_cast<std::size_t
>(indexTo) == path.size())
323 auto indexFrom = indexTo - 1;
324 auto cfgFrom = path.at(indexFrom);
325 auto cfgTo = path.at(indexTo);
327 auto t = (val - pathAcc.at(indexFrom)) / (pathAcc.at(indexTo) - pathAcc.at(indexFrom));
331 SimoxCSpacePtr simoxcspace = SimoxCSpacePtr::dynamicCast(cspaceUtil);
334 CSpaceAdaptorBasePtr simoxcspaceadapter = CSpaceAdaptorBasePtr::dynamicCast(cspaceUtil);
335 if (simoxcspaceadapter)
337 simoxcspace = SimoxCSpacePtr::dynamicCast(simoxcspaceadapter->getOriginalCSpace());
343 VirtualRobot::RobotNodeSetPtr rns = VirtualRobot::RobotNodeSet::createRobotNodeSet(
344 simoxcspace->getAgentSceneObj(),
"tmp", simoxcspace->getAgentJointNames());
345 Saba::CSpaceSampled tmpCSpace(
346 simoxcspace->getAgentSceneObj(),
347 VirtualRobot::CDManagerPtr(
new VirtualRobot::CDManager(simoxcspace->getCD())),
349 Eigen::VectorXf from = Eigen::Map<Eigen::VectorXf>(cfgFrom.data(), cfgFrom.size());
350 Eigen::VectorXf to = Eigen::Map<Eigen::VectorXf>(cfgTo.data(), cfgTo.size());
351 auto config = tmpCSpace.interpolate(from, to, t);
352 cfgToSet = (VectorXf{config.data(), config.data() + config.rows()});
356 std::transform(cfgFrom.begin(),
359 std::back_inserter(cfgToSet),
360 [t](
float from,
float to) { return t * to + (1 - t) * from; });
401 std::vector<std::string> nodeNames;
402 nodeNames.reserve(robotNodes.size());
403 for (
const auto& node : robotNodes)
407 nodeNames.emplace_back(node.first->getName());
411 for (std::size_t idxPath = 0; idxPath < paths.size(); ++idxPath)
413 const auto& pDat = paths.at(idxPath);
414 const auto& p = pDat.path;
424 const float traceStep = drawTrace
425 ?
static_cast<float>(widget.doubleSpinBoxTraceStep->value())
426 : std::numeric_limits<float>::infinity();
427 auto traces = cspaceUtil->getTraceVisu(p, nodeNames, traceStep);
430 for (std::size_t i = 0; i < traces.size(); ++i)
432 DebugDrawerLineSet& trace = traces.at(i);
433 trace.colorFullIntensity = EDGE_COLOR_PATH;
434 trace.colorNoIntensity = EDGE_COLOR_PATH;
435 trace.lineWidth = EDGE_WIDTH;
436 trace.intensities.assign(trace.points.size() / 2, 1);
437 debugDrawer->setLineSetVisu(layer,
"trace:" + nodeNames.at(i), trace);
464 if (!motionPlanningServerProxy)
468 const auto taskId = motionPlanningServerTaskList->getSelectedId();
475 auto taskCSpaceAndPaths = motionPlanningServerProxy->getTaskCSpaceAndPathsById(*taskId);
477 auto& taskCSpace = taskCSpaceAndPaths.cspace;
481 ARMARX_ERROR_S <<
"Task with id " << *taskId <<
" returned an empty cspace!";
486 while (taskCSpace->ice_isA(CSpaceAdaptor::ice_staticId()))
488 if (taskCSpace->ice_isA(ScaledCSpace::ice_staticId()))
490 auto scalingCSpace = ScaledCSpacePtr::dynamicCast(taskCSpace);
491 for (
auto& path : taskCSpaceAndPaths.paths)
493 scalingCSpace->unscalePath(path);
497 taskCSpace = CSpaceAdaptorPtr::dynamicCast(taskCSpace)->getOriginalCSpace();
500 if (taskCSpace->ice_isA(SimoxCSpace::ice_staticId()))
504 setPaths(std::move(taskCSpaceAndPaths.paths));
610 cspaceUtil = SimoxCSpacePtr::dynamicCast(newCSpace->clone());
611 cspaceVisu = SimoxCSpacePtr::dynamicCast(newCSpace->clone(
true));
612 cspaceUtil->initCollisionTest();
613 cspaceVisu->initCollisionTest();
616 const auto&& dimensions = cspaceUtil->getDimensionsBounds();
617 auto jointNames = cspaceUtil->getAgentJointNames();
618 assert(jointNames.size() == dimensions.size());
620 widget.tableWidgetDims->setRowCount(dimensions.size());
622 for (std::size_t i = 0; i < dimensions.size(); ++i)
624 const std::string& name = jointNames.at(i);
625 const FloatRange& bounds = dimensions.at(i);
627 widget.tableWidgetDims->setItem(i, 0,
new QTableWidgetItem{QString::fromStdString(name)});
629 widget.tableWidgetDims->setItem(i, 1,
new QTableWidgetItem{QString::number(bounds.min)});
630 auto spinbox =
new QDoubleSpinBox{};
631 spinbox->setRange(bounds.min, bounds.max);
632 widget.tableWidgetDims->setCellWidget(i, 2, spinbox);
633 widget.tableWidgetDims->setItem(i, 3,
new QTableWidgetItem{QString::number(bounds.max)});
634 spinbox->setSingleStep((bounds.max - bounds.min) / 10000.0);
636 spinbox, SIGNAL(valueChanged(
double)), widget.pushButtonSetConfig, SIGNAL(clicked()));
639 visuObjStat.resize(cspaceVisu->getStationaryObjectSet()->getSize());
642 std::unique_lock lock(*
mutex3D);
643 auto robot = cspaceVisu->getAgentSceneObj();
644 robot->setUpdateVisualization(
true);
645 robotVisu = robot->getVisualization();
647 auto robotCoinVisu = robotVisu->getCoinVisualization(
true);
650 visuAgent->removeAllChildren();
651 visuAgent->addChild(robotCoinVisu);
653 auto boxVis =
new QCheckBox{QString::fromStdString(robot->getName())};
654 boxVis->setChecked(
true);
657 widget.scrollAreaWidgetContentsObj->layout()->addWidget(boxVis);
662 for (
int i = 0; i < static_cast<int>(visuObjStat.size()); ++i)
664 auto sceneObj = cspaceVisu->getStationaryObjectSet()->getSceneObject(i);
666 auto& sep = visuObjStat.at(i);
668 sep =
new SoSeparator();
670 sceneObj->setUpdateVisualization(
true);
671 sceneObj->setUpdateCollisionModel(
true);
672 auto* visu =
dynamic_cast<VirtualRobot::CoinVisualizationNode*
>(
673 sceneObj->getVisualization(VirtualRobot::SceneObject::Collision).get());
674 auto coin = visu->getCoinVisualization();
675 ARMARX_INFO << sceneObj->getName() <<
" visu: " << visu <<
" coin: " << coin;
679 auto boxVis =
new IndexedQCheckBox{i, QString::fromStdString(sceneObj->getName())};
680 boxVis->setChecked(
true);
682 SIGNAL(stateChangedIndex(
int, Qt::CheckState)),
685 widget.scrollAreaWidgetContentsObj->layout()->addWidget(boxVis);
690 auto nodes = cspaceUtil->getAgentSceneObj()->getRobotNodes();
692 std::transform(nodes.begin(),
694 std::back_inserter(robotNodes),
695 [](VirtualRobot::RobotNodePtr& nptr) {
696 return std::pair<VirtualRobot::RobotNodePtr, bool>{std::move(nptr), false};
700 std::set<std::string> visTcps;
701 const auto& kinematicChainNames = cspaceUtil->getAgent().kinemaicChainNames;
703 kinematicChainNames.begin(),
704 kinematicChainNames.end(),
705 std::inserter(visTcps, visTcps.begin()),
706 [
this](
const std::string& name)
707 { return cspaceUtil->getAgentSceneObj()->getRobotNodeSet(name)->getTCP()->getName(); });
709 for (
int i = 0; i < static_cast<int>(robotNodes.size()); ++i)
711 const auto& node = robotNodes.at(i).first;
712 const auto& name = node->getName();
713 bool visible = visTcps.find(name) != visTcps.end();
714 robotNodes.at(i).second = visible;
716 auto boxVis =
new IndexedQCheckBox{i, QString::fromStdString(node->getName())};
717 boxVis->setChecked(visible);
719 SIGNAL(stateChangedIndex(
int, Qt::CheckState)),
721 SLOT(toggleRobotNodePath(
int, Qt::CheckState)));
722 widget.scrollAreaWidgetContentsJoints->layout()->addWidget(boxVis);
726 setEnabledSimoxCSpace();
741 assert(paths.empty());
743 std::transform(newPaths.begin(),
745 std::back_inserter(paths),
749 dat.path = std::move(p.nodes);
752 dat.accPathLength.emplace_back(0);
753 for (std::size_t i = 1; i < dat.path.size(); ++i)
755 const auto& cfg1 = dat.path.at(i - 1);
756 const auto& cfg2 = dat.path.at(i);
758 lengthAcc += euclideanDistance(cfg1.begin(), cfg1.end(), cfg2.begin());
759 dat.accPathLength.emplace_back(lengthAcc);
765 widget.spinBoxPathNumber->setMaximum(paths.size());
767 widget.tableWidgetPaths->setRowCount(paths.size());
768 for (std::size_t i = 0; i < paths.size(); ++i)
770 const auto& p = paths.at(i);
771 widget.tableWidgetPaths->setItem(
772 i, 1,
new QTableWidgetItem{QString::number(p.path.size())});
773 widget.tableWidgetPaths->setItem(
774 i, 2,
new QTableWidgetItem{QString::number(p.getLength())});
777 QString::fromStdString(newPaths.at(i).pathName)};
779 SIGNAL(stateChangedIndex(
int, Qt::CheckState)),
781 SLOT(setVisibilityPath(
int, Qt::CheckState)));
782 boxVis->setChecked(
true);
783 widget.tableWidgetPaths->setCellWidget(i, 0, boxVis);
786 setEnabledPaths(
true);
789 updateEdgeVisibility();