@@ -218,11 +218,14 @@ void Robot::clear()
218218
219219RobotLink* Robot::LinkFactory::createLink (Robot* robot,
220220 const urdf::LinkConstSharedPtr& link,
221+ Ogre::SceneNode* parent_visual_node,
222+ Ogre::SceneNode* parent_collision_node,
221223 const std::string& parent_joint_name,
222224 bool visual,
223225 bool collision)
224226{
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);
226229}
227230
228231RobotJoint* Robot::LinkFactory::createJoint (Robot* robot, const urdf::JointConstSharedPtr& joint)
@@ -244,20 +247,26 @@ void Robot::load(const urdf::ModelInterface& urdf, bool visual, bool collision)
244247 // Create properties for each link.
245248 // Properties are not added to display until changedLinkTreeStyle() is called (below).
246249 {
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 () )
251254 {
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+
253260 std::string parent_joint_name;
254261
255262 if (urdf_link != urdf.getRoot () && urdf_link->parent_joint )
256263 {
257264 parent_joint_name = urdf_link->parent_joint ->name ;
258265 }
259266
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);
261270
262271 if (urdf_link == urdf.getRoot ())
263272 {
@@ -267,6 +276,9 @@ void Robot::load(const urdf::ModelInterface& urdf, bool visual, bool collision)
267276 links_[urdf_link->name ] = link;
268277
269278 link->setRobotAlpha (alpha_);
279+
280+ for (const auto & c : urdf_link->child_links )
281+ link_stack_.emplace_back (c, link->getVisualTreeNode (), link->getCollisionTreeNode ());
270282 }
271283 }
272284
@@ -709,8 +721,8 @@ void Robot::update(const LinkUpdater& updater)
709721
710722 Ogre::Vector3 visual_position, collision_position;
711723 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))
714726 {
715727 // Check if visual_orientation, visual_position, collision_orientation, and collision_position are
716728 // NaN.
0 commit comments