Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

assign correct MaterialPtr to all visuals #114

Merged
merged 4 commits into from
Jan 30, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions urdf_parser/src/link.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
rhaschke marked this conversation as resolved.
Show resolved Hide resolved
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before the visual's material pointer was always well defined.

}

return true;
Expand Down
59 changes: 33 additions & 26 deletions urdf_parser/src/model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CI is failing because you can't call reset on a const reference. This looks like it should probably be a non-const reference.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm sorry. Obviously I filed this PR in a rush. There was also a missing return value. Both issues should be fixed now.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There is one more open issue: The new parser is more picky about undefined materials than the old parser (which is good). However, I suggest to issue a warning only instead of an error.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, that sounds good to me.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I ended up pushing 8175b16, which does some simple style cleanups. However, what I want to talk about here is the fact that the new code actually seems less picky about undefined materials. That is, it used to be that if the material was undefined, then the parser would return a nullptr from parseURDF. The new code, while it downgrades the print from an error to a warning, lets the code go on. In other words, the boolean return value from assignMaterial seems to be ignored. @rhaschke is this the intended behavior, and if so, could you say a bit about why this is safe/better to do here? Thanks.

return false;
}
}
}

ModelInterfaceSharedPtr parseURDF(const std::string &xml_string)
{
ModelInterfaceSharedPtr model(new ModelInterface);
Expand Down Expand Up @@ -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());
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Because the visual's material was always well-defined, this error was never printed.

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());
Expand Down