27#include <VirtualRobot/ManipulationObject.h>
28#include <VirtualRobot/MathTools.h>
29#include <VirtualRobot/Nodes/RobotNodeActuator.h>
30#include <VirtualRobot/Obstacle.h>
31#include <VirtualRobot/VirtualRobotException.h>
32#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h>
33#include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationNode.h>
34#include <VirtualRobot/XML/ObjectIO.h>
40#include <Inventor/nodes/SoUnits.h>
73 modelType = VirtualRobot::SceneObject::Full;
76 mutex.reset(
new std::recursive_mutex());
77 mutexData.reset(
new std::recursive_mutex());
88 return "ArmarXPhysicsWorldVisualization";
164 VirtualRobot::SceneObject::VisualizationType visuType)
168 SoNode* n = CoinVisualizationFactory::getCoinVisualization(o, visuType);
176 VirtualRobot::SceneObject::VisualizationType visuType)
181 std::vector<RobotNodePtr> collectedRobotNodes = ro->getRobotNodes();
182 ARMARX_DEBUG <<
"Robot visu with " << collectedRobotNodes.size() <<
" nodes";
183 SoSeparator* n =
new SoSeparator();
185 for (
const RobotNodePtr& node : collectedRobotNodes)
188 VisualizationNodePtr visu = node->getVisualization(visuType);
189 auto coinVisualizationNode = std::dynamic_pointer_cast<CoinVisualizationNode>(visu);
190 if (coinVisualizationNode)
193 if (coinVisualizationNode->getCoinVisualization())
197 SoNode* no = coinVisualizationNode->getCoinVisualization();
198 SoSeparator* sep =
dynamic_cast<SoSeparator*
>(no);
201 ARMARX_DEBUG <<
"ADDING SEP count " << sep->getNumChildren();
208 ARMARX_DEBUG <<
"Node " << node->getName() <<
" doesn't have a coin visu model";
213 ARMARX_DEBUG <<
"Node " << node->getName() <<
" doesn't have a visu model";
224 VirtualRobot::SceneObject::VisualizationType visuType)
241 ro->setThreadsafe(
false);
246 Eigen::Vector3f floorUp,
248 std::string floorTexture)
251 ARMARX_INFO <<
"Adding floor visu, texture file:" << floorTexture;
254 SoNode* n = (SoNode*)CoinVisualizationFactory::CreatePlaneVisualization(
259 CoinVisualizationFactory::Color::Gray(),
286 std::string
str(
"Root");
288 VirtualRobot::CoinVisualizationFactory::CreateCoordSystemVisualization(scale,
303 VirtualRobot::SceneObject::VisualizationType visuType)
311 ARMARX_DEBUG <<
"addVisualization " << so->getName() <<
" Ref: " << n->getRefCount();
318 ARMARX_DEBUG <<
"addVisualization " << so->getName() <<
" Ref: " << n->getRefCount();
334 ARMARX_DEBUG <<
"RemoveVisualization: " << so->getName()
335 <<
", Ref: " << node->getRefCount();
350 for (
auto& o : copiedVisus)
353 VirtualRobot::SceneObjectPtr
const& so = o.first;
354 if (so->getName() == name)
362 ARMARX_ERROR <<
"No object with name " << name <<
" found";
376 if (r.first->getName() == name)
384 ARMARX_ERROR <<
"No robot with name " << name <<
" found";
398 ARMARX_DEBUG <<
"found added robot, removing " << r->getName();
413 if (fullModel &&
modelType == VirtualRobot::SceneObject::Full)
418 if (!fullModel &&
modelType == VirtualRobot::SceneObject::Collision)
426 modelType = VirtualRobot::SceneObject::Full;
430 modelType = VirtualRobot::SceneObject::Collision;
459 ARMARX_DEBUG <<
"Robot " << ro->getName() <<
" has no visualization for model type "
466 std::map<VirtualRobot::SceneObjectPtr, SoNode*>::iterator it2 =
addedVisualizations.begin();
471 SceneObjectPtr so = it2->first;
513 SceneObjectPtr currentObjVisu)
524 if (objMap.find(currentObjVisu->getName()) == objMap.end())
526 ARMARX_ERROR <<
"No object with name " << currentObjVisu->getName() <<
"in objMap";
530 ARMARX_IMPORTANT <<
"object " << currentObjVisu->getName() <<
":\n" << objMap[currentObjVisu->getName()] ;
535 if (objMap.find(currentObjVisu->getName()) != objMap.end())
538 VirtualRobot::RobotNodePtr rnv =
539 std::dynamic_pointer_cast<VirtualRobot::RobotNode>(currentObjVisu);
540 PosePtr p = PosePtr::dynamicCast(objMap[currentObjVisu->getName()]);
541 Eigen::Matrix4f gp = p->toEigen();
547 RobotNodeActuatorPtr rna(
new RobotNodeActuator(rnv));
548 rna->updateVisualizationPose(gp, jvMap[currentObjVisu->getName()],
false);
553 currentObjVisu->setGlobalPoseNoChecks(gp);
557 std::vector<SceneObjectPtr> childrenV = currentObjVisu->getChildren();
559 for (
const auto& i : childrenV)
584 VirtualRobot::MathTools::Plane p = VirtualRobot::MathTools::getFloorPlane();
602 if (!robotDef.updated)
608 bool robotLoaded =
false;
613 if (robotDef.name == currentRob.name)
641 ARMARX_ERROR <<
"internal error, no robot with name " << robotDef.name;
645 ARMARX_ERROR <<
"Available Robot:" << r.first->getName();
652 VirtualRobot::SceneObjectPtr currentObjVisu = rob->getRootNode();
655 robotDef.robotNodePoses, robotDef.jointValues, currentObjVisu))
663 const bool updateChildren =
true;
664 currentObjVisu->updatePose(updateChildren);
667 robotDef.updated =
false;
675 bool robFound =
false;
679 if (robotDef.name == currentRob.name)
689 ARMARX_INFO <<
"Removing robot:" << currentRob.name;
704 if (!objectDef.updated)
710 bool objectLoaded =
false;
714 if (objectDef.name == currentObj.name &&
getObject(objectDef.name))
729 << objectDef.name <<
" failed"
730 <<
"\n " <<
VAROUT(objectDef.name) <<
"\n "
731 <<
VAROUT(objectDef.objectClassName) <<
"\n "
732 <<
VAROUT(objectDef.filename) <<
"\n "
733 <<
VAROUT(objectDef.project);
739 VirtualRobot::SceneObjectPtr ob =
getObject(objectDef.name);
742 ARMARX_ERROR <<
"internal error, no object for " << objectDef.name;
756 objectDef.updated =
false;
764 bool objFound =
false;
768 if (objectDef.name == currentObj.name)
778 ARMARX_INFO <<
"Removing object:" << currentObj.name;
790 IceUtil::Time startTime = IceUtil::Time::now();
795 IceUtil::Time durationlock = IceUtil::Time::now() - startTime;
797 if (durationlock.toMilliSecondsDouble() > 10)
800 <<
"Copy and Lock took long: " << durationlock.toMilliSecondsDouble()
807 auto startTime1 = IceUtil::Time::now();
811 IceUtil::Time duration1 = IceUtil::Time::now() - startTime1;
812 if (duration1.toMilliSecondsDouble() > 10)
815 <<
" floorSync took long: " << duration1.toMilliSecondsDouble() <<
" ms";
819 auto startTime2 = IceUtil::Time::now();
823 IceUtil::Time duration2 = IceUtil::Time::now() - startTime2;
824 if (duration2.toMilliSecondsDouble() > 10)
827 <<
" RobotSync took long: " << duration2.toMilliSecondsDouble() <<
" ms";
831 auto startTime3 = IceUtil::Time::now();
835 IceUtil::Time duration3 = IceUtil::Time::now() - startTime3;
836 if (duration3.toMilliSecondsDouble() > 10)
839 <<
" ObjectSync took long: " << duration3.toMilliSecondsDouble() <<
" ms";
845 IceUtil::Time duration = IceUtil::Time::now() - startTime;
863 if (not(obj.filename.empty() or obj.project.empty()))
866 return loadObject(obj.filename, obj.project, obj.name);
880 const std::string& robotFile,
881 const std::string& project,
886 if (robotFile.empty())
892 if (!project.empty())
895 ARMARX_INFO <<
"Adding to datapaths of " << project;
900 ARMARX_ERROR <<
"ArmarX Package " << project <<
" has not been found!";
911 std::string fn = robotFile;
919 VirtualRobot::RobotIO::RobotDescription loadMode = VirtualRobot::RobotIO::eFull;
923 loadMode = VirtualRobot::RobotIO::eCollisionModel;
925 result = RobotIO::loadRobot(fn, loadMode);
937 ARMARX_INFO <<
"Scaling robot, factor: " << scaling;
938 result = result->clone(result->getName(), result->getCollisionChecker(), scaling);
944 result->setName(robotName);
945 result->setPropagatingJointValuesEnabled(
true);
946 ARMARX_DEBUG <<
"adding newly loaded robot to visualization";
947 VirtualRobot::SceneObject::VisualizationType visuMode =
modelType;
951 visuMode = VirtualRobot::SceneObject::Collision;
959 const std::string& project,
960 const std::string& instanceName)
963 if (objectFile.empty())
969 if (!project.empty())
972 ARMARX_INFO <<
"Adding to datapaths of " << project;
977 ARMARX_ERROR <<
"ArmarX Package " << project <<
" has not been found!";
988 std::string fn = objectFile;
998 o = ObjectIO::loadManipulationObject(fn);
1000 catch (VirtualRobotException& e)
1002 ARMARX_ERROR <<
" ERROR while creating manip (file:" << fn <<
")\n" << e.what();
1011 o = ObjectIO::loadObstacle(fn);
1013 catch (VirtualRobotException& e)
1021 ARMARX_ERROR <<
" ERROR while creating (file:" << fn <<
")";
1025 o->setName(instanceName);
1036 if (object->getName() == name)
1044 std::vector<RobotPtr>
1048 std::vector<RobotPtr> result;
1052 result.push_back(r.first);
1057 std::vector<SceneObjectPtr>
1061 std::vector<SceneObjectPtr> result;
1065 result.push_back(r.first);
1079 ObjectVisuPrimitivePtr objectPrimitiveData,
1080 const std::string& name)
1083 if (!objectPrimitiveData)
1089 VirtualRobot::ObstaclePtr o;
1092 switch (objectPrimitiveData->type)
1097 BoxVisuPrimitivePtr box = BoxVisuPrimitivePtr::dynamicCast(objectPrimitiveData);
1105 VirtualRobot::VisualizationFactory::Color
c;
1109 c.transparency = box->color.a;
1110 o = VirtualRobot::Obstacle::createBox(box->width, box->height, box->depth,
c);
1111 o->setMass(box->massKG);
1118 SphereVisuPrimitivePtr s = SphereVisuPrimitivePtr::dynamicCast(objectPrimitiveData);
1126 VirtualRobot::VisualizationFactory::Color
c;
1130 c.transparency = s->color.a;
1131 o = VirtualRobot::Obstacle::createSphere(s->radius,
c);
1132 o->setMass(s->massKG);
1139 CylinderVisuPrimitivePtr s =
1140 CylinderVisuPrimitivePtr::dynamicCast(objectPrimitiveData);
1148 VirtualRobot::VisualizationFactory::Color
c;
1152 c.transparency = s->color.a;
1153 o = VirtualRobot::Obstacle::createCylinder(s->radius, s->length,
c);
1154 o->setMass(s->massKG);
1181 if (r.first->getName() == name)
#define ARMARX_REGISTER_COMPONENT_EXECUTABLE(ComponentT, applicationName)
static bool getAbsolutePath(const std::string &relativeFilename, std::string &storeAbsoluteFilename, const std::vector< std::string > &additionalSearchPaths={}, bool verbose=true)
static void addDataPaths(const std::string &dataPathList)
The ArmarXPhysicsWorldVisualization class organizes the Coin3D visualization of the physics scene....
void showBaseCoord(bool enable, float scale=5.0f)
void onInitComponent() override
Pure virtual hook for the subclass.
SoSeparator * baseCoordVisu
ArmarXPhysicsWorldVisualization()
bool synchronizeSceneObjectPoses(NamePoseMap &objMap, NameValueMap &jvMap, VirtualRobot::SceneObjectPtr currentObjVisu)
void enableVisuType(bool fullModel)
bool synchronizeObjects()
void removeRobotVisualization(const std::string &name)
std::map< VirtualRobot::SceneObjectPtr, SoNode * > addedVisualizations
RecursiveLockPtr getScopedLock()
void onDisconnectComponent() override
Hook for subclass.
VirtualRobot::RobotPtr getRobot(const std::string &name)
void removeVisualization(VirtualRobot::RobotPtr r)
SoSeparator * getVisualization()
getVisu returns the visualization that is synchronized with ArmarXPhysicsWorld
VirtualRobot::SceneObjectPtr getObject(const std::string &name)
bool synchronizeVisualizationData()
Show/hide contacts.
void removeFloorVisualization()
std::vector< VirtualRobot::RobotPtr > getRobots() const
~ArmarXPhysicsWorldVisualization() override
SceneVisuData lastSceneData
RecursiveLockPtr getScopedDataLock()
std::vector< VirtualRobot::SceneObjectPtr > getObjects() const
Ice::Long getSyncTimestamp() const
getSyncTimestamp
void addFloorVisualization(Eigen::Vector3f floorPos, Eigen::Vector3f floorUp, float floorExtendMM, std::string floorTexture)
void onConnectComponent() override
Pure virtual hook for the subclass.
void removeObjectVisualization(const std::string &name)
std::shared_ptr< std::recursive_mutex > mutex
mutex to protect access to visualization models
void addVisualization(VirtualRobot::SceneObjectPtr so, VirtualRobot::SceneObject::VisualizationType visuType=VirtualRobot::SceneObject::Full)
bool loadObject(const ObjectVisuData &obj)
std::shared_ptr< std::unique_lock< std::recursive_mutex > > RecursiveLockPtr
std::shared_ptr< std::recursive_mutex > mutexData
mutex to process SceneData
SoSeparator * getViewableScene()
Returns the scene without floor (allows for better viewAll handling)
static std::string GetDefaultName()
void setMutex(std::shared_ptr< std::recursive_mutex > const &m)
void reportSceneUpdated(const ::armarx::SceneVisuData &actualData, const ::Ice::Current &=Ice::emptyCurrent) override
void onExitComponent() override
Hook for subclass.
SceneVisuData currentSceneData
bool loadRobot(const std::string &robotName, const std::string &robotFile, const std::string &project, float scaling, bool colModel)
SoSeparator * dynamicsVisu
bool createPrimitiveObject(ObjectVisuPrimitivePtr objectPrimitiveData, const std::string &name)
std::map< VirtualRobot::RobotPtr, SoNode * > addedRobotVisualizations
SoNode * buildVisu(VirtualRobot::SceneObjectPtr o, VirtualRobot::SceneObject::VisualizationType visuType=VirtualRobot::SceneObject::Full)
buildVisu Creates visualization with increased ref counter.
SoSeparator * sceneViewableSep
VirtualRobot::SceneObject::VisualizationType modelType
The CMakePackageFinder class provides an interface to the CMake Package finder capabilities.
std::string getDataDir() const
bool packageFound() const
Returns whether or not this package was found with cmake.
Property< PropertyType > getProperty(const std::string &name)
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
void usingTopic(const std::string &name, bool orderedPublishing=false)
Registers a proxy for subscription after initialization.
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
#define ARMARX_INFO
The normal logging level.
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
#define ARMARX_VERBOSE
The logging level for verbose information.
std::shared_ptr< class Robot > RobotPtr
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceInternal::Handle< Pose > PosePtr
const LogSender::manipulator flush