27 #include <VirtualRobot/MathTools.h>
28 #include <VirtualRobot/Nodes/RobotNodeActuator.h>
29 #include <VirtualRobot/VirtualRobotException.h>
30 #include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h>
31 #include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h>
32 #include <VirtualRobot/XML/ObjectIO.h>
37 #include <Inventor/nodes/SoUnits.h>
48 ArmarXPhysicsWorldVisualization::ArmarXPhysicsWorldVisualization()
51 coinVisu =
new SoSeparator;
54 sceneViewableSep =
new SoSeparator;
55 coinVisu->addChild(sceneViewableSep);
57 dynamicsVisu =
new SoSeparator;
59 sceneViewableSep->addChild(dynamicsVisu);
60 baseCoordVisu =
new SoSeparator;
64 floorVisu =
new SoSeparator;
65 this->lastSceneData.floor =
false;
66 coinVisu->addChild(floorVisu);
68 modelType = VirtualRobot::SceneObject::Full;
71 mutex.reset(
new std::recursive_mutex());
72 mutexData.reset(
new std::recursive_mutex());
75 ArmarXPhysicsWorldVisualization::~ArmarXPhysicsWorldVisualization()
92 ArmarXPhysicsWorldVisualization::releaseResources()
95 auto l = getScopedLock();
97 addedVisualizations.clear();
98 addedRobotVisualizations.clear();
101 safeUnref(dynamicsVisu);
102 safeUnref(baseCoordVisu);
106 ArmarXPhysicsWorldVisualization::onInitComponent()
109 std::string top = getProperty<std::string>(
"ReportVisuTopicName").getValue();
115 ArmarXPhysicsWorldVisualization::onConnectComponent()
120 ArmarXPhysicsWorldVisualization::onDisconnectComponent()
125 ArmarXPhysicsWorldVisualization::onExitComponent()
130 ArmarXPhysicsWorldVisualization::reportSceneUpdated(
const SceneVisuData& actualData,
134 auto l = getScopedDataLock();
135 this->currentSceneData = actualData;
139 ArmarXPhysicsWorldVisualization::getVisualization()
145 ArmarXPhysicsWorldVisualization::getViewableScene()
147 return sceneViewableSep;
151 ArmarXPhysicsWorldVisualization::buildVisu(
153 VirtualRobot::SceneObject::VisualizationType visuType)
156 auto l = getScopedLock();
157 SoNode* n = CoinVisualizationFactory::getCoinVisualization(o, visuType);
163 ArmarXPhysicsWorldVisualization::buildVisu(
165 VirtualRobot::SceneObject::VisualizationType visuType)
168 auto l = getScopedLock();
170 std::vector<RobotNodePtr> collectedRobotNodes = ro->getRobotNodes();
171 ARMARX_DEBUG <<
"Robot visu with " << collectedRobotNodes.size() <<
" nodes";
172 SoSeparator* n =
new SoSeparator();
174 for (
const RobotNodePtr& node : collectedRobotNodes)
177 VisualizationNodePtr visu = node->getVisualization(visuType);
178 auto coinVisualizationNode = std::dynamic_pointer_cast<CoinVisualizationNode>(visu);
179 if (coinVisualizationNode)
182 if (coinVisualizationNode->getCoinVisualization())
186 SoNode* no = coinVisualizationNode->getCoinVisualization();
187 SoSeparator* sep =
dynamic_cast<SoSeparator*
>(no);
190 ARMARX_DEBUG <<
"ADDING SEP count " << sep->getNumChildren();
197 ARMARX_DEBUG <<
"Node " << node->getName() <<
" doesn't have a coin visu model";
202 ARMARX_DEBUG <<
"Node " << node->getName() <<
" doesn't have a visu model";
211 ArmarXPhysicsWorldVisualization::addVisualization(
213 VirtualRobot::SceneObject::VisualizationType visuType)
216 auto l = getScopedLock();
219 removeVisualization(ro);
221 if (SoNode* n = buildVisu(ro, visuType))
224 dynamicsVisu->addChild(n);
225 addedRobotVisualizations[ro] = n;
230 ro->setThreadsafe(
false);
234 ArmarXPhysicsWorldVisualization::addFloorVisualization(Eigen::Vector3f floorPos,
235 Eigen::Vector3f floorUp,
237 std::string floorTexture)
240 ARMARX_INFO <<
"Adding floor visu, texture file:" << floorTexture;
241 auto l = getScopedLock();
242 floorVisu->removeAllChildren();
243 SoNode* n = (SoNode*)CoinVisualizationFactory::CreatePlaneVisualization(
248 CoinVisualizationFactory::Color::Gray(),
253 floorVisu->addChild(n);
258 ArmarXPhysicsWorldVisualization::removeFloorVisualization()
261 auto l = getScopedLock();
262 floorVisu->removeAllChildren();
266 ArmarXPhysicsWorldVisualization::showBaseCoord(
bool enable,
float scale)
269 auto l = getScopedLock();
271 if (enable && sceneViewableSep->findChild(baseCoordVisu) < 0)
274 baseCoordVisu->removeAllChildren();
275 std::string
str(
"Root");
276 baseCoordVisu->addChild(
277 VirtualRobot::CoinVisualizationFactory::CreateCoordSystemVisualization(scale,
279 sceneViewableSep->addChild(baseCoordVisu);
282 if (!enable && sceneViewableSep->findChild(baseCoordVisu) >= 0)
285 sceneViewableSep->removeChild(baseCoordVisu);
290 ArmarXPhysicsWorldVisualization::addVisualization(
292 VirtualRobot::SceneObject::VisualizationType visuType)
297 auto l = getScopedLock();
298 removeVisualization(
so);
299 SoNode* n = buildVisu(
so, visuType);
300 ARMARX_DEBUG <<
"addVisualization " <<
so->getName() <<
" Ref: " << n->getRefCount();
304 dynamicsVisu->addChild(n);
305 addedVisualizations[
so] = n;
307 ARMARX_DEBUG <<
"addVisualization " <<
so->getName() <<
" Ref: " << n->getRefCount();
315 auto l = getScopedLock();
319 if (addedVisualizations.find(
so) != addedVisualizations.end())
322 SoNode* node = addedVisualizations[
so];
324 <<
", Ref: " << node->getRefCount();
325 addedVisualizations.erase(
so);
326 dynamicsVisu->removeChild(node);
331 ArmarXPhysicsWorldVisualization::removeObjectVisualization(
const std::string& name)
334 auto l = getScopedLock();
338 auto copiedVisus = addedVisualizations;
339 for (
auto& o : copiedVisus)
343 if (
so->getName() == name)
346 removeVisualization(
so);
351 ARMARX_ERROR <<
"No object with name " << name <<
" found";
355 ArmarXPhysicsWorldVisualization::removeRobotVisualization(
const std::string& name)
358 auto l = getScopedLock();
362 for (
auto& r : addedRobotVisualizations)
365 if (r.first->getName() == name)
368 removeVisualization(r.first);
373 ARMARX_ERROR <<
"No robot with name " << name <<
" found";
377 ArmarXPhysicsWorldVisualization::removeVisualization(
RobotPtr r)
380 auto l = getScopedLock();
384 if (addedRobotVisualizations.find(r) != addedRobotVisualizations.end())
387 ARMARX_DEBUG <<
"found added robot, removing " << r->getName();
388 SoNode* node = addedRobotVisualizations[r];
389 dynamicsVisu->removeChild(node);
390 addedRobotVisualizations.erase(r);
396 ArmarXPhysicsWorldVisualization::enableVisuType(
bool fullModel)
399 auto l = getScopedLock();
402 if (fullModel && modelType == VirtualRobot::SceneObject::Full)
407 if (!fullModel && modelType == VirtualRobot::SceneObject::Collision)
415 modelType = VirtualRobot::SceneObject::Full;
419 modelType = VirtualRobot::SceneObject::Collision;
431 dynamicsVisu->removeAllChildren();
434 for (
const auto& pair : addedRobotVisualizations)
438 SoNode* n = buildVisu(ro, modelType);
442 dynamicsVisu->addChild(n);
443 addedRobotVisualizations[ro] = n;
448 ARMARX_DEBUG <<
"Robot " << ro->getName() <<
" has no visualization for model type "
455 std::map<VirtualRobot::SceneObjectPtr, SoNode*>::iterator it2 = addedVisualizations.begin();
457 for (; it2 != addedVisualizations.end(); it2++)
461 SoNode* n = buildVisu(
so, modelType);
465 dynamicsVisu->addChild(n);
466 addedVisualizations[
so] = n;
473 ArmarXPhysicsWorldVisualization::setMutex(std::shared_ptr<std::recursive_mutex>
const& m)
500 ArmarXPhysicsWorldVisualization::synchronizeSceneObjectPoses(NamePoseMap& objMap,
513 if (objMap.find(currentObjVisu->getName()) == objMap.end())
515 ARMARX_ERROR <<
"No object with name " << currentObjVisu->getName() <<
"in objMap";
519 ARMARX_IMPORTANT <<
"object " << currentObjVisu->getName() <<
":\n" << objMap[currentObjVisu->getName()] ;
524 if (objMap.find(currentObjVisu->getName()) != objMap.end())
527 VirtualRobot::RobotNodePtr rnv =
528 std::dynamic_pointer_cast<VirtualRobot::RobotNode>(currentObjVisu);
529 PosePtr p = PosePtr::dynamicCast(objMap[currentObjVisu->getName()]);
536 RobotNodeActuatorPtr rna(
new RobotNodeActuator(rnv));
537 rna->updateVisualizationPose(gp, jvMap[currentObjVisu->getName()],
false);
542 currentObjVisu->setGlobalPoseNoChecks(gp);
546 std::vector<SceneObjectPtr> childrenV = currentObjVisu->getChildren();
548 for (
const auto& i : childrenV)
551 if (!synchronizeSceneObjectPoses(objMap, jvMap, i))
561 ArmarXPhysicsWorldVisualization::synchronizeFloor()
564 if (lastSceneData.floor == currentSceneData.floor &&
565 lastSceneData.floorTextureFile == currentSceneData.floorTextureFile)
570 if (currentSceneData.floor)
573 VirtualRobot::MathTools::Plane p = VirtualRobot::MathTools::getFloorPlane();
574 addFloorVisualization(p.p, p.n, 50000.0f, currentSceneData.floorTextureFile);
578 removeFloorVisualization();
585 ArmarXPhysicsWorldVisualization::synchronizeRobots()
588 for (
auto& robotDef : currentSceneData.robots)
591 if (!robotDef.updated)
597 bool robotLoaded =
false;
599 for (
auto& currentRob : lastSceneData.robots)
602 if (robotDef.name == currentRob.name)
614 if (!loadRobot(robotDef.name,
630 ARMARX_ERROR <<
"internal error, no robot with name " << robotDef.name;
632 for (
auto& r : addedRobotVisualizations)
634 ARMARX_ERROR <<
"Available Robot:" << r.first->getName();
643 if (!synchronizeSceneObjectPoses(
644 robotDef.robotNodePoses, robotDef.jointValues, currentObjVisu))
652 const bool updateChildren =
true;
653 currentObjVisu->updatePose(updateChildren);
656 robotDef.updated =
false;
661 for (
auto& currentRob : lastSceneData.robots)
664 bool robFound =
false;
666 for (
auto& robotDef : currentSceneData.robots)
668 if (robotDef.name == currentRob.name)
678 ARMARX_INFO <<
"Removing robot:" << currentRob.name;
679 removeRobotVisualization(currentRob.name);
687 ArmarXPhysicsWorldVisualization::synchronizeObjects()
690 for (
auto& objectDef : currentSceneData.objects)
693 if (!objectDef.updated)
699 bool objectLoaded =
false;
701 for (
auto& currentObj : lastSceneData.objects)
703 if (objectDef.name == currentObj.name && getObject(objectDef.name))
715 if (!loadObject(objectDef))
718 << objectDef.name <<
" failed"
719 <<
"\n " <<
VAROUT(objectDef.name) <<
"\n "
720 <<
VAROUT(objectDef.objectClassName) <<
"\n "
721 <<
VAROUT(objectDef.filename) <<
"\n "
722 <<
VAROUT(objectDef.project);
731 ARMARX_ERROR <<
"internal error, no object for " << objectDef.name;
737 if (!synchronizeSceneObjectPoses(objectDef.objectPoses, tmpMap, ob))
745 objectDef.updated =
false;
750 for (
auto& currentObj : lastSceneData.objects)
753 bool objFound =
false;
755 for (
auto& objectDef : currentSceneData.objects)
757 if (objectDef.name == currentObj.name)
767 ARMARX_INFO <<
"Removing object:" << currentObj.name;
768 removeObjectVisualization(currentObj.name);
776 ArmarXPhysicsWorldVisualization::synchronizeVisualizationData()
781 auto lockVisu = getScopedLock();
782 auto lockData = getScopedDataLock();
784 IceUtil::Time durationlock = IceUtil::Time::now() - startTime;
786 if (durationlock.toMilliSecondsDouble() > 10)
789 <<
"Copy and Lock took long: " << durationlock.toMilliSecondsDouble()
796 auto startTime1 = IceUtil::Time::now();
801 if (duration1.toMilliSecondsDouble() > 10)
804 <<
" floorSync took long: " << duration1.toMilliSecondsDouble() <<
" ms";
808 auto startTime2 = IceUtil::Time::now();
813 if (duration2.toMilliSecondsDouble() > 10)
816 <<
" RobotSync took long: " << duration2.toMilliSecondsDouble() <<
" ms";
820 auto startTime3 = IceUtil::Time::now();
822 synchronizeObjects();
825 if (duration3.toMilliSecondsDouble() > 10)
828 <<
" ObjectSync took long: " << duration3.toMilliSecondsDouble() <<
" ms";
832 this->lastSceneData = this->currentSceneData;
835 synchronize2TimeMS = (
float)duration.toMilliSecondsDouble();
841 ArmarXPhysicsWorldVisualization::getSyncVisuTime()
843 return synchronize2TimeMS;
847 ArmarXPhysicsWorldVisualization::loadObject(
const ObjectVisuData& obj)
852 if (not(obj.filename.empty() or obj.project.empty()))
855 return loadObject(obj.filename, obj.project, obj.name);
864 return createPrimitiveObject(obj.objectPrimitiveData, obj.name);
868 ArmarXPhysicsWorldVisualization::loadRobot(
const std::string& robotName,
869 const std::string& robotFile,
875 if (robotFile.empty())
900 std::string fn = robotFile;
901 ArmarXDataPath::getAbsolutePath(fn, fn);
912 loadMode = VirtualRobot::RobotIO::eCollisionModel;
914 result = RobotIO::loadRobot(fn, loadMode);
926 ARMARX_INFO <<
"Scaling robot, factor: " << scaling;
927 result = result->clone(result->getName(), result->getCollisionChecker(), scaling);
933 result->setName(robotName);
934 result->setPropagatingJointValuesEnabled(
true);
935 ARMARX_DEBUG <<
"adding newly loaded robot to visualization";
936 VirtualRobot::SceneObject::VisualizationType visuMode = modelType;
940 visuMode = VirtualRobot::SceneObject::Collision;
942 addVisualization(result, visuMode);
947 ArmarXPhysicsWorldVisualization::loadObject(
const std::string& objectFile,
949 const std::string& instanceName)
952 if (objectFile.empty())
977 std::string fn = objectFile;
978 ArmarXDataPath::getAbsolutePath(fn, fn);
987 o = ObjectIO::loadManipulationObject(fn);
989 catch (VirtualRobotException& e)
991 ARMARX_ERROR <<
" ERROR while creating manip (file:" << fn <<
")\n" << e.what();
1000 o = ObjectIO::loadObstacle(fn);
1002 catch (VirtualRobotException& e)
1010 ARMARX_ERROR <<
" ERROR while creating (file:" << fn <<
")";
1014 o->setName(instanceName);
1015 addVisualization(o, modelType);
1020 ArmarXPhysicsWorldVisualization::getObject(
const std::string& name)
1023 for (
auto& [
object, visu] : addedVisualizations)
1025 if (object->getName() == name)
1033 std::vector<RobotPtr>
1034 ArmarXPhysicsWorldVisualization::getRobots()
const
1037 std::vector<RobotPtr> result;
1038 result.reserve(addedRobotVisualizations.size());
1039 for (
auto& r : addedRobotVisualizations)
1041 result.push_back(r.first);
1046 std::vector<SceneObjectPtr>
1047 ArmarXPhysicsWorldVisualization::getObjects()
const
1050 std::vector<SceneObjectPtr> result;
1051 result.reserve(addedVisualizations.size());
1052 for (
auto& r : addedVisualizations)
1054 result.push_back(r.first);
1060 ArmarXPhysicsWorldVisualization::getSyncTimestamp()
const
1063 return currentSceneData.timestamp * 1000;
1067 ArmarXPhysicsWorldVisualization::createPrimitiveObject(
1068 ObjectVisuPrimitivePtr objectPrimitiveData,
1069 const std::string& name)
1072 if (!objectPrimitiveData)
1078 VirtualRobot::ObstaclePtr o;
1081 switch (objectPrimitiveData->type)
1086 BoxVisuPrimitivePtr box = BoxVisuPrimitivePtr::dynamicCast(objectPrimitiveData);
1098 c.transparency = box->color.a;
1099 o = VirtualRobot::Obstacle::createBox(box->width, box->height, box->depth,
c);
1100 o->setMass(box->massKG);
1107 SphereVisuPrimitivePtr
s = SphereVisuPrimitivePtr::dynamicCast(objectPrimitiveData);
1119 c.transparency =
s->color.a;
1120 o = VirtualRobot::Obstacle::createSphere(
s->radius,
c);
1121 o->setMass(
s->massKG);
1128 CylinderVisuPrimitivePtr
s =
1129 CylinderVisuPrimitivePtr::dynamicCast(objectPrimitiveData);
1141 c.transparency =
s->color.a;
1142 o = VirtualRobot::Obstacle::createCylinder(
s->radius,
s->length,
c);
1143 o->setMass(
s->massKG);
1160 addVisualization(o, modelType);
1165 ArmarXPhysicsWorldVisualization::getRobot(
const std::string& name)
1168 for (
auto& r : addedRobotVisualizations)
1170 if (r.first->getName() == name)