@@ -218,11 +218,14 @@ void Robot::clear()
218
218
219
219
RobotLink* Robot::LinkFactory::createLink (Robot* robot,
220
220
const urdf::LinkConstSharedPtr& link,
221
+ Ogre::SceneNode* parent_visual_node,
222
+ Ogre::SceneNode* parent_collision_node,
221
223
const std::string& parent_joint_name,
222
224
bool visual,
223
225
bool collision)
224
226
{
225
- return new RobotLink (robot, link, parent_joint_name, visual, collision);
227
+ return new RobotLink (robot, link, parent_visual_node, parent_collision_node, parent_joint_name, visual,
228
+ collision);
226
229
}
227
230
228
231
RobotJoint* Robot::LinkFactory::createJoint (Robot* robot, const urdf::JointConstSharedPtr& joint)
@@ -244,20 +247,26 @@ void Robot::load(const urdf::ModelInterface& urdf, bool visual, bool collision)
244
247
// Create properties for each link.
245
248
// Properties are not added to display until changedLinkTreeStyle() is called (below).
246
249
{
247
- typedef std::map<std::string, urdf::LinkSharedPtr> M_NameToUrdfLink;
248
- M_NameToUrdfLink::const_iterator link_it = urdf. links_ . begin () ;
249
- M_NameToUrdfLink::const_iterator link_end = urdf.links_ . end ( );
250
- for (; link_it != link_end; ++link_it )
250
+ // traverse URDF tree in depth first order and copy tree structure for links' scene nodes
251
+ std::vector<std::tuple<urdf::LinkConstSharedPtr, Ogre::SceneNode*, Ogre::SceneNode*>> link_stack_ ;
252
+ link_stack_. emplace_back ( urdf.getRoot (), root_visual_node_, root_collision_node_ );
253
+ while (!link_stack_. empty () )
251
254
{
252
- const urdf::LinkConstSharedPtr& urdf_link = link_it->second ;
255
+ urdf::LinkConstSharedPtr urdf_link = std::get<0 >(link_stack_.back ());
256
+ Ogre::SceneNode* parent_visual_node = std::get<1 >(link_stack_.back ());
257
+ Ogre::SceneNode* parent_collision_node = std::get<2 >(link_stack_.back ());
258
+ link_stack_.pop_back ();
259
+
253
260
std::string parent_joint_name;
254
261
255
262
if (urdf_link != urdf.getRoot () && urdf_link->parent_joint )
256
263
{
257
264
parent_joint_name = urdf_link->parent_joint ->name ;
258
265
}
259
266
260
- RobotLink* link = link_factory_->createLink (this , urdf_link, parent_joint_name, visual, collision);
267
+ RobotLink* link =
268
+ link_factory_->createLink (this , urdf_link, parent_visual_node, parent_collision_node,
269
+ parent_joint_name, visual, collision);
261
270
262
271
if (urdf_link == urdf.getRoot ())
263
272
{
@@ -267,6 +276,9 @@ void Robot::load(const urdf::ModelInterface& urdf, bool visual, bool collision)
267
276
links_[urdf_link->name ] = link;
268
277
269
278
link->setRobotAlpha (alpha_);
279
+
280
+ for (const auto & c : urdf_link->child_links )
281
+ link_stack_.emplace_back (c, link->getVisualTreeNode (), link->getCollisionTreeNode ());
270
282
}
271
283
}
272
284
@@ -709,8 +721,8 @@ void Robot::update(const LinkUpdater& updater)
709
721
710
722
Ogre::Vector3 visual_position, collision_position;
711
723
Ogre::Quaternion visual_orientation, collision_orientation;
712
- if (updater.getLinkTransforms (link->getName (), visual_position, visual_orientation ,
713
- collision_position, collision_orientation))
724
+ if (updater.getLinkTransforms (link->getParentLinkName (), link-> getName (), visual_position ,
725
+ visual_orientation, collision_position, collision_orientation))
714
726
{
715
727
// Check if visual_orientation, visual_position, collision_orientation, and collision_position are
716
728
// NaN.
0 commit comments