From 1939751c5f1018a1d53281276df651a610a042b7 Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Wed, 31 Oct 2018 10:13:18 +0100 Subject: [PATCH 1/4] assign correct MaterialPtr to all visuals So far, only the first visual in visual_array got the correct MaterialPtr assigned. --- urdf_parser/src/link.cpp | 4 +-- urdf_parser/src/model.cpp | 59 ++++++++++++++++++++++----------------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/urdf_parser/src/link.cpp b/urdf_parser/src/link.cpp index 993f6aa5..533e0b6b 100644 --- a/urdf_parser/src/link.cpp +++ b/urdf_parser/src/link.cpp @@ -380,9 +380,7 @@ bool parseVisual(Visual &vis, TiXmlElement *config) // try to parse material element in place vis.material.reset(new Material()); if (!parseMaterial(*vis.material, mat, true)) - { - CONSOLE_BRIDGE_logDebug("urdfdom: material has only name, actual material definition may be in the model"); - } + vis.material.reset(); } return true; diff --git a/urdf_parser/src/model.cpp b/urdf_parser/src/model.cpp index a905f89e..515f46fc 100644 --- a/urdf_parser/src/model.cpp +++ b/urdf_parser/src/model.cpp @@ -59,6 +59,33 @@ ModelInterfaceSharedPtr parseURDFFile(const std::string &path) return urdf::parseURDF( xml_str ); } +bool assignMaterial(const VisualSharedPtr& visual, const ModelInterfaceSharedPtr& model, const char* link_name) +{ + if (visual->material_name.empty()) + return true; + + const MaterialSharedPtr& material = model->getMaterial(visual->material_name); + if (material) + { + CONSOLE_BRIDGE_logDebug("urdfdom: setting link '%s' material to '%s'", link_name, visual->material_name.c_str()); + visual->material = material; + } + else + { + if (visual->material) + { + CONSOLE_BRIDGE_logDebug("urdfdom: link '%s' material '%s' defined in Visual.", link_name,visual->material_name.c_str()); + model->materials_.insert(make_pair(visual->material->name,visual->material)); + } + else + { + CONSOLE_BRIDGE_logError("link '%s' material '%s' undefined.", link_name,visual->material_name.c_str()); + model.reset(); + return false; + } + } +} + ModelInterfaceSharedPtr parseURDF(const std::string &xml_string) { ModelInterfaceSharedPtr model(new ModelInterface); @@ -137,33 +164,13 @@ ModelInterfaceSharedPtr parseURDF(const std::string &xml_string) } else { - // set link visual material + // set link visual(s) material CONSOLE_BRIDGE_logDebug("urdfdom: setting link '%s' material", link->name.c_str()); - if (link->visual) - { - if (!link->visual->material_name.empty()) - { - if (model->getMaterial(link->visual->material_name)) - { - CONSOLE_BRIDGE_logDebug("urdfdom: setting link '%s' material to '%s'", link->name.c_str(),link->visual->material_name.c_str()); - link->visual->material = model->getMaterial( link->visual->material_name.c_str() ); - } - else - { - if (link->visual->material) - { - CONSOLE_BRIDGE_logDebug("urdfdom: link '%s' material '%s' defined in Visual.", link->name.c_str(),link->visual->material_name.c_str()); - model->materials_.insert(make_pair(link->visual->material->name,link->visual->material)); - } - else - { - CONSOLE_BRIDGE_logError("link '%s' material '%s' undefined.", link->name.c_str(),link->visual->material_name.c_str()); - model.reset(); - return model; - } - } - } - } + if (link->visual && !assignMaterial(link->visual, model, link->name.c_str())) + return model; + for (const auto& visual : link->visual_array) + if (!assignMaterial(visual, model, link->name.c_str())) + return model; model->links_.insert(make_pair(link->name,link)); CONSOLE_BRIDGE_logDebug("urdfdom: successfully added a new link '%s'", link->name.c_str()); From b53fef5a95dc8720cc7262cddb1c95d454ee8dd1 Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Tue, 6 Nov 2018 20:27:37 +0100 Subject: [PATCH 2/4] fix errors --- urdf_parser/src/model.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/urdf_parser/src/model.cpp b/urdf_parser/src/model.cpp index 515f46fc..bb77b726 100644 --- a/urdf_parser/src/model.cpp +++ b/urdf_parser/src/model.cpp @@ -59,7 +59,7 @@ ModelInterfaceSharedPtr parseURDFFile(const std::string &path) return urdf::parseURDF( xml_str ); } -bool assignMaterial(const VisualSharedPtr& visual, const ModelInterfaceSharedPtr& model, const char* link_name) +bool assignMaterial(const VisualSharedPtr& visual, ModelInterfaceSharedPtr& model, const char* link_name) { if (visual->material_name.empty()) return true; @@ -84,6 +84,7 @@ bool assignMaterial(const VisualSharedPtr& visual, const ModelInterfaceSharedPtr return false; } } + return true; } ModelInterfaceSharedPtr parseURDF(const std::string &xml_string) From 93a2bf4f3970d264126a156be71e83223945017d Mon Sep 17 00:00:00 2001 From: Robert Haschke Date: Wed, 14 Nov 2018 01:10:24 +0100 Subject: [PATCH 3/4] tolerate undefined materials with a warning --- urdf_parser/src/model.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/urdf_parser/src/model.cpp b/urdf_parser/src/model.cpp index bb77b726..60fdf2da 100644 --- a/urdf_parser/src/model.cpp +++ b/urdf_parser/src/model.cpp @@ -79,8 +79,7 @@ bool assignMaterial(const VisualSharedPtr& visual, ModelInterfaceSharedPtr& mode } else { - CONSOLE_BRIDGE_logError("link '%s' material '%s' undefined.", link_name,visual->material_name.c_str()); - model.reset(); + CONSOLE_BRIDGE_logWarn("link '%s' material '%s' undefined.", link_name,visual->material_name.c_str()); return false; } } @@ -167,11 +166,10 @@ ModelInterfaceSharedPtr parseURDF(const std::string &xml_string) { // set link visual(s) material CONSOLE_BRIDGE_logDebug("urdfdom: setting link '%s' material", link->name.c_str()); - if (link->visual && !assignMaterial(link->visual, model, link->name.c_str())) - return model; + if (link->visual) + assignMaterial(link->visual, model, link->name.c_str()); for (const auto& visual : link->visual_array) - if (!assignMaterial(visual, model, link->name.c_str())) - return model; + assignMaterial(visual, model, link->name.c_str()); model->links_.insert(make_pair(link->name,link)); CONSOLE_BRIDGE_logDebug("urdfdom: successfully added a new link '%s'", link->name.c_str()); From 8175b1629c3d4d610944d9180de387f0e51604ae Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Fri, 18 Jan 2019 01:29:09 +0000 Subject: [PATCH 4/4] Minor style fixups. Signed-off-by: Chris Lalancette --- urdf_parser/src/link.cpp | 2 ++ urdf_parser/src/model.cpp | 8 ++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/urdf_parser/src/link.cpp b/urdf_parser/src/link.cpp index 533e0b6b..d3a7b2f2 100644 --- a/urdf_parser/src/link.cpp +++ b/urdf_parser/src/link.cpp @@ -380,7 +380,9 @@ bool parseVisual(Visual &vis, TiXmlElement *config) // try to parse material element in place vis.material.reset(new Material()); if (!parseMaterial(*vis.material, mat, true)) + { vis.material.reset(); + } } return true; diff --git a/urdf_parser/src/model.cpp b/urdf_parser/src/model.cpp index 60fdf2da..7e9bc309 100644 --- a/urdf_parser/src/model.cpp +++ b/urdf_parser/src/model.cpp @@ -74,8 +74,8 @@ bool assignMaterial(const VisualSharedPtr& visual, ModelInterfaceSharedPtr& mode { if (visual->material) { - CONSOLE_BRIDGE_logDebug("urdfdom: link '%s' material '%s' defined in Visual.", link_name,visual->material_name.c_str()); - model->materials_.insert(make_pair(visual->material->name,visual->material)); + CONSOLE_BRIDGE_logDebug("urdfdom: link '%s' material '%s' defined in Visual.", link_name, visual->material_name.c_str()); + model->materials_.insert(make_pair(visual->material->name, visual->material)); } else { @@ -167,9 +167,13 @@ ModelInterfaceSharedPtr parseURDF(const std::string &xml_string) // set link visual(s) material CONSOLE_BRIDGE_logDebug("urdfdom: setting link '%s' material", link->name.c_str()); if (link->visual) + { assignMaterial(link->visual, model, link->name.c_str()); + } for (const auto& visual : link->visual_array) + { assignMaterial(visual, model, link->name.c_str()); + } model->links_.insert(make_pair(link->name,link)); CONSOLE_BRIDGE_logDebug("urdfdom: successfully added a new link '%s'", link->name.c_str());