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>
68 modelType = VirtualRobot::SceneObject::Full;
71 mutex.reset(
new std::recursive_mutex());
72 mutexData.reset(
new std::recursive_mutex());
153 VirtualRobot::SceneObject::VisualizationType visuType)
157 SoNode* n = CoinVisualizationFactory::getCoinVisualization(o, visuType);
165 VirtualRobot::SceneObject::VisualizationType visuType)
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";
213 VirtualRobot::SceneObject::VisualizationType visuType)
230 ro->setThreadsafe(
false);
235 Eigen::Vector3f floorUp,
237 std::string floorTexture)
240 ARMARX_INFO <<
"Adding floor visu, texture file:" << floorTexture;
243 SoNode* n = (SoNode*)CoinVisualizationFactory::CreatePlaneVisualization(
248 CoinVisualizationFactory::Color::Gray(),
275 std::string
str(
"Root");
277 VirtualRobot::CoinVisualizationFactory::CreateCoordSystemVisualization(scale,
292 VirtualRobot::SceneObject::VisualizationType visuType)
300 ARMARX_DEBUG <<
"addVisualization " << so->getName() <<
" Ref: " << n->getRefCount();
307 ARMARX_DEBUG <<
"addVisualization " << so->getName() <<
" Ref: " << n->getRefCount();
323 ARMARX_DEBUG <<
"RemoveVisualization: " << so->getName()
324 <<
", Ref: " << node->getRefCount();
339 for (
auto& o : copiedVisus)
342 VirtualRobot::SceneObjectPtr
const& so = o.first;
343 if (so->getName() == name)
351 ARMARX_ERROR <<
"No object with name " << name <<
" found";
365 if (r.first->getName() == name)
373 ARMARX_ERROR <<
"No robot with name " << name <<
" found";
387 ARMARX_DEBUG <<
"found added robot, removing " << r->getName();
402 if (fullModel &&
modelType == VirtualRobot::SceneObject::Full)
407 if (!fullModel &&
modelType == VirtualRobot::SceneObject::Collision)
415 modelType = VirtualRobot::SceneObject::Full;
419 modelType = VirtualRobot::SceneObject::Collision;
448 ARMARX_DEBUG <<
"Robot " << ro->getName() <<
" has no visualization for model type "
455 std::map<VirtualRobot::SceneObjectPtr, SoNode*>::iterator it2 =
addedVisualizations.begin();
460 SceneObjectPtr so = it2->first;
502 SceneObjectPtr currentObjVisu)
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()]);
530 Eigen::Matrix4f gp = p->toEigen();
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)
573 VirtualRobot::MathTools::Plane p = VirtualRobot::MathTools::getFloorPlane();
591 if (!robotDef.updated)
597 bool robotLoaded =
false;
602 if (robotDef.name == currentRob.name)
630 ARMARX_ERROR <<
"internal error, no robot with name " << robotDef.name;
634 ARMARX_ERROR <<
"Available Robot:" << r.first->getName();
641 VirtualRobot::SceneObjectPtr currentObjVisu = rob->getRootNode();
644 robotDef.robotNodePoses, robotDef.jointValues, currentObjVisu))
652 const bool updateChildren =
true;
653 currentObjVisu->updatePose(updateChildren);
656 robotDef.updated =
false;
664 bool robFound =
false;
668 if (robotDef.name == currentRob.name)
678 ARMARX_INFO <<
"Removing robot:" << currentRob.name;
693 if (!objectDef.updated)
699 bool objectLoaded =
false;
703 if (objectDef.name == currentObj.name &&
getObject(objectDef.name))
718 << objectDef.name <<
" failed"
719 <<
"\n " <<
VAROUT(objectDef.name) <<
"\n "
720 <<
VAROUT(objectDef.objectClassName) <<
"\n "
721 <<
VAROUT(objectDef.filename) <<
"\n "
722 <<
VAROUT(objectDef.project);
728 VirtualRobot::SceneObjectPtr ob =
getObject(objectDef.name);
731 ARMARX_ERROR <<
"internal error, no object for " << objectDef.name;
745 objectDef.updated =
false;
753 bool objFound =
false;
757 if (objectDef.name == currentObj.name)
767 ARMARX_INFO <<
"Removing object:" << currentObj.name;
779 IceUtil::Time startTime = IceUtil::Time::now();
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();
800 IceUtil::Time duration1 = IceUtil::Time::now() - startTime1;
801 if (duration1.toMilliSecondsDouble() > 10)
804 <<
" floorSync took long: " << duration1.toMilliSecondsDouble() <<
" ms";
808 auto startTime2 = IceUtil::Time::now();
812 IceUtil::Time duration2 = IceUtil::Time::now() - startTime2;
813 if (duration2.toMilliSecondsDouble() > 10)
816 <<
" RobotSync took long: " << duration2.toMilliSecondsDouble() <<
" ms";
820 auto startTime3 = IceUtil::Time::now();
824 IceUtil::Time duration3 = IceUtil::Time::now() - startTime3;
825 if (duration3.toMilliSecondsDouble() > 10)
828 <<
" ObjectSync took long: " << duration3.toMilliSecondsDouble() <<
" ms";
834 IceUtil::Time duration = IceUtil::Time::now() - startTime;
852 if (not(obj.filename.empty() or obj.project.empty()))
855 return loadObject(obj.filename, obj.project, obj.name);
869 const std::string& robotFile,
870 const std::string& project,
875 if (robotFile.empty())
881 if (!project.empty())
884 ARMARX_INFO <<
"Adding to datapaths of " << project;
889 ARMARX_ERROR <<
"ArmarX Package " << project <<
" has not been found!";
900 std::string fn = robotFile;
908 VirtualRobot::RobotIO::RobotDescription loadMode = VirtualRobot::RobotIO::eFull;
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;
948 const std::string& project,
949 const std::string& instanceName)
952 if (objectFile.empty())
958 if (!project.empty())
961 ARMARX_INFO <<
"Adding to datapaths of " << project;
966 ARMARX_ERROR <<
"ArmarX Package " << project <<
" has not been found!";
977 std::string fn = objectFile;
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);
1025 if (object->getName() == name)
1033 std::vector<RobotPtr>
1037 std::vector<RobotPtr> result;
1041 result.push_back(r.first);
1046 std::vector<SceneObjectPtr>
1050 std::vector<SceneObjectPtr> result;
1054 result.push_back(r.first);
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);
1094 VirtualRobot::VisualizationFactory::Color
c;
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);
1115 VirtualRobot::VisualizationFactory::Color
c;
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);
1137 VirtualRobot::VisualizationFactory::Color
c;
1141 c.transparency = s->color.a;
1142 o = VirtualRobot::Obstacle::createCylinder(s->radius, s->length,
c);
1143 o->setMass(s->massKG);
1170 if (r.first->getName() == name)
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)
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)
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