5958d7a
diff -r d79259b26096 src/parser_urdf.cc
5958d7a
--- a/src/parser_urdf.cc	Mon Aug 04 13:07:16 2014 -0700
5958d7a
+++ b/src/parser_urdf.cc	Sat Aug 23 14:30:18 2014 -0400
5958d7a
@@ -297,85 +297,15 @@
5958d7a
 }
5958d7a
 
5958d7a
 ////////////////////////////////////////////////////////////////////////////////
5958d7a
-void ReduceCollisionToParent(UrdfLinkPtr _link,
5958d7a
-    const std::string &_groupName, UrdfCollisionPtr _collision)
5958d7a
+void ReduceCollisionToParent(UrdfLinkPtr _link, UrdfCollisionPtr _collision)
5958d7a
 {
5958d7a
-  boost::shared_ptr<std::vector<UrdfCollisionPtr> > cols;
5958d7a
-#if USE_EXTERNAL_URDF && defined(URDF_GE_0P3)
5958d7a
-  if (_link->collision)
5958d7a
-  {
5958d7a
-    cols.reset(new std::vector<UrdfCollisionPtr>);
5958d7a
-    cols->push_back(_link->collision);
5958d7a
-  }
5958d7a
-  else
5958d7a
-  {
5958d7a
-    cols = boost::shared_ptr<std::vector<UrdfCollisionPtr> >(
5958d7a
-            &_link->collision_array);
5958d7a
-  }
5958d7a
-#else
5958d7a
-  cols = _link->getCollisions(_groupName);
5958d7a
-#endif
5958d7a
-
5958d7a
-  if (!cols)
5958d7a
-  {
5958d7a
-    // group does not exist, create one and add to map
5958d7a
-    cols.reset(new std::vector<UrdfCollisionPtr>);
5958d7a
-    // new group name, create add vector to map and add Collision to the vector
5958d7a
-    _link->collision_groups.insert(make_pair(_groupName, cols));
5958d7a
-  }
5958d7a
-
5958d7a
-  // group exists, add Collision to the vector in the map
5958d7a
-  std::vector<UrdfCollisionPtr>::iterator colIt =
5958d7a
-    find(cols->begin(), cols->end(), _collision);
5958d7a
-  if (colIt != cols->end())
5958d7a
-    sdfwarn << "attempted to add collision to link ["
5958d7a
-      << _link->name
5958d7a
-      << "], but it already exists under group ["
5958d7a
-      << _groupName << "]\n";
5958d7a
-  else
5958d7a
-    cols->push_back(_collision);
5958d7a
+  _link->collision_array.push_back(_collision);
5958d7a
 }
5958d7a
 
5958d7a
 ////////////////////////////////////////////////////////////////////////////////
5958d7a
-void ReduceVisualToParent(UrdfLinkPtr _link,
5958d7a
-    const std::string &_groupName, UrdfVisualPtr _visual)
5958d7a
+void ReduceVisualToParent(UrdfLinkPtr _link, UrdfVisualPtr _visual)
5958d7a
 {
5958d7a
-  boost::shared_ptr<std::vector<UrdfVisualPtr> > viss;
5958d7a
-#if USE_EXTERNAL_URDF && defined(URDF_GE_0P3)
5958d7a
-  if (_link->visual)
5958d7a
-  {
5958d7a
-    viss.reset(new std::vector<UrdfVisualPtr>);
5958d7a
-    viss->push_back(_link->visual);
5958d7a
-  }
5958d7a
-  else
5958d7a
-  {
5958d7a
-    viss = boost::shared_ptr<std::vector<UrdfVisualPtr> >(&_link->visual_array);
5958d7a
-  }
5958d7a
-#else
5958d7a
-  viss = _link->getVisuals(_groupName);
5958d7a
-#endif
5958d7a
-
5958d7a
-  if (!viss)
5958d7a
-  {
5958d7a
-    // group does not exist, create one and add to map
5958d7a
-    viss.reset(new std::vector<UrdfVisualPtr>);
5958d7a
-    // new group name, create vector, add vector to map and
5958d7a
-    //   add Visual to the vector
5958d7a
-    _link->visual_groups.insert(make_pair(_groupName, viss));
5958d7a
-    sdfdbg << "successfully added a new visual group name ["
5958d7a
-          << _groupName << "]\n";
5958d7a
-  }
5958d7a
-
5958d7a
-  // group exists, add Visual to the vector in the map if it's not there
5958d7a
-  std::vector<UrdfVisualPtr>::iterator visIt
5958d7a
-    = find(viss->begin(), viss->end(), _visual);
5958d7a
-  if (visIt != viss->end())
5958d7a
-    sdfwarn << "attempted to add visual to link ["
5958d7a
-      << _link->name
5958d7a
-      << "], but it already exists under group ["
5958d7a
-      << _groupName << "]\n";
5958d7a
-  else
5958d7a
-    viss->push_back(_visual);
5958d7a
+  _link->visual_array.push_back(_visual);
5958d7a
 }
5958d7a
 
5958d7a
 ////////////////////////////////////////////////////////////////////////////////
5958d7a
@@ -839,54 +769,17 @@
5958d7a
 /// reduce fixed joints:  lump visuals to parent link
5958d7a
 void ReduceVisualsToParent(UrdfLinkPtr _link)
5958d7a
 {
5958d7a
-  // lump visual to parent
5958d7a
-  // lump all visual to parent, assign group name
5958d7a
-  // "lump::"+group name+"::'+_link name
5958d7a
-  // lump but keep the _link name in(/as) the group name,
5958d7a
-  // so we can correlate visuals to visuals somehow.
5958d7a
-  for (std::map
5958d7a
-      boost::shared_ptr<std::vector<UrdfVisualPtr> > >::iterator
5958d7a
-      visualsIt = _link->visual_groups.begin();
5958d7a
-      visualsIt != _link->visual_groups.end(); ++visualsIt)
5958d7a
+  for (std::vector<UrdfVisualPtr>::iterator
5958d7a
+      visualIt = _link->visual_array.begin();
5958d7a
+      visualIt != _link->visual_array.end(); ++visualIt)
5958d7a
   {
5958d7a
-    if (visualsIt->first.find(std::string("lump::")) == 0)
5958d7a
-    {
5958d7a
-      // it's a previously lumped mesh, re-lump under same _groupName
5958d7a
-      std::string lumpGroupName = visualsIt->first;
5958d7a
-      sdfdbg << "re-lumping group name [" << lumpGroupName
5958d7a
-             << "] to link [" << _link->getParent()->name << "]\n";
5958d7a
-      for (std::vector<UrdfVisualPtr>::iterator
5958d7a
-          visualIt = visualsIt->second->begin();
5958d7a
-          visualIt != visualsIt->second->end(); ++visualIt)
5958d7a
-      {
5958d7a
-        // transform visual origin from _link frame to parent link
5958d7a
-        // frame before adding to parent
5958d7a
-        (*visualIt)->origin = TransformToParentFrame((*visualIt)->origin,
5958d7a
-            _link->parent_joint->parent_to_joint_origin_transform);
5958d7a
-        // add the modified visual to parent
5958d7a
-        ReduceVisualToParent(_link->getParent(), lumpGroupName,
5958d7a
-            *visualIt);
5958d7a
-      }
5958d7a
-    }
5958d7a
-    else
5958d7a
-    {
5958d7a
-      // default and any other groups meshes
5958d7a
-      std::string lumpGroupName = std::string("lump::")+_link->name;
5958d7a
-      sdfdbg << "adding modified lump group name [" << lumpGroupName
5958d7a
-             << "] to link [" << _link->getParent()->name << "].\n";
5958d7a
-      for (std::vector<UrdfVisualPtr>::iterator
5958d7a
-          visualIt = visualsIt->second->begin();
5958d7a
-          visualIt != visualsIt->second->end(); ++visualIt)
5958d7a
-      {
5958d7a
-        // transform visual origin from _link frame to
5958d7a
-        // parent link frame before adding to parent
5958d7a
-        (*visualIt)->origin = TransformToParentFrame((*visualIt)->origin,
5958d7a
-            _link->parent_joint->parent_to_joint_origin_transform);
5958d7a
-        // add the modified visual to parent
5958d7a
-        ReduceVisualToParent(_link->getParent(), lumpGroupName,
5958d7a
-            *visualIt);
5958d7a
-      }
5958d7a
-    }
5958d7a
+    // transform visual origin from _link frame to parent link
5958d7a
+    // frame before adding to parent
5958d7a
+    (*visualIt)->origin = TransformToParentFrame((*visualIt)->origin,
5958d7a
+        _link->parent_joint->parent_to_joint_origin_transform);
5958d7a
+    // add the modified visual to parent
5958d7a
+    // ReduceVisualToParent(_link->getParent(), *visualIt);
5958d7a
+    _link->getParent()->visual_array.push_back(*visualIt);
5958d7a
   }
5958d7a
 }
5958d7a
 
5958d7a
@@ -894,63 +787,19 @@
5958d7a
 /// reduce fixed joints:  lump collisions to parent link
5958d7a
 void ReduceCollisionsToParent(UrdfLinkPtr _link)
5958d7a
 {
5958d7a
-  // lump collision parent
5958d7a
-  // lump all collision to parent, assign group name
5958d7a
-  // "lump::"+group name+"::'+_link name
5958d7a
-  // lump but keep the _link name in(/as) the group name,
5958d7a
-  // so we can correlate visuals to collisions somehow.
5958d7a
-  for (std::map
5958d7a
-      boost::shared_ptr<std::vector<UrdfCollisionPtr> > >::iterator
5958d7a
-      collisionsIt = _link->collision_groups.begin();
5958d7a
-      collisionsIt != _link->collision_groups.end(); ++collisionsIt)
5958d7a
+  for (std::vector<UrdfCollisionPtr>::iterator
5958d7a
+      collisionIt = _link->collision_array.begin();
5958d7a
+      collisionIt != _link->collision_array.end(); ++collisionIt)
5958d7a
   {
5958d7a
-    if (collisionsIt->first.find(std::string("lump::")) == 0)
5958d7a
-    {
5958d7a
-      // if it's a previously lumped mesh, relump under same _groupName
5958d7a
-      std::string lumpGroupName = collisionsIt->first;
5958d7a
-      sdfdbg << "re-lumping collision [" << collisionsIt->first
5958d7a
-             << "] for link [" << _link->name
5958d7a
-             << "] to parent [" << _link->getParent()->name
5958d7a
-             << "] with group name [" << lumpGroupName << "]\n";
5958d7a
-      for (std::vector<UrdfCollisionPtr>::iterator
5958d7a
-          collisionIt = collisionsIt->second->begin();
5958d7a
-          collisionIt != collisionsIt->second->end(); ++collisionIt)
5958d7a
-      {
5958d7a
-        // transform collision origin from _link frame to
5958d7a
-        // parent link frame before adding to parent
5958d7a
-        (*collisionIt)->origin = TransformToParentFrame(
5958d7a
-            (*collisionIt)->origin,
5958d7a
-            _link->parent_joint->parent_to_joint_origin_transform);
5958d7a
-        // add the modified collision to parent
5958d7a
-        ReduceCollisionToParent(_link->getParent(), lumpGroupName,
5958d7a
-            *collisionIt);
5958d7a
-      }
5958d7a
-    }
5958d7a
-    else
5958d7a
-    {
5958d7a
-      // default and any other group meshes
5958d7a
-      std::string lumpGroupName = std::string("lump::")+_link->name;
5958d7a
-      sdfdbg << "lumping collision [" << collisionsIt->first
5958d7a
-             << "] for link [" << _link->name
5958d7a
-             << "] to parent [" << _link->getParent()->name
5958d7a
-             << "] with group name [" << lumpGroupName << "]\n";
5958d7a
-      for (std::vector<UrdfCollisionPtr>::iterator
5958d7a
-          collisionIt = collisionsIt->second->begin();
5958d7a
-          collisionIt != collisionsIt->second->end(); ++collisionIt)
5958d7a
-      {
5958d7a
-        // transform collision origin from _link frame to
5958d7a
-        // parent link frame before adding to parent
5958d7a
-        (*collisionIt)->origin = TransformToParentFrame(
5958d7a
-            (*collisionIt)->origin,
5958d7a
-            _link->parent_joint->parent_to_joint_origin_transform);
5958d7a
-
5958d7a
-        // add the modified collision to parent
5958d7a
-        ReduceCollisionToParent(_link->getParent(), lumpGroupName,
5958d7a
-            *collisionIt);
5958d7a
-      }
5958d7a
-    }
5958d7a
+    // transform collision origin from _link frame to
5958d7a
+    // parent link frame before adding to parent
5958d7a
+    (*collisionIt)->origin = TransformToParentFrame(
5958d7a
+        (*collisionIt)->origin,
5958d7a
+        _link->parent_joint->parent_to_joint_origin_transform);
5958d7a
+    // add the modified collision to parent
5958d7a
+    // ReduceCollisionToParent(_link->getParent(), *collisionIt);
5958d7a
+    _link->getParent()->collision_array.push_back(*collisionIt);
5958d7a
   }
5958d7a
-  // this->PrintCollisionGroups(_link->getParent());
5958d7a
 }
5958d7a
 
5958d7a
 /////////////////////////////////////////////////
5958d7a
@@ -1827,17 +1676,8 @@
5958d7a
 void PrintCollisionGroups(UrdfLinkPtr _link)
5958d7a
 {
5958d7a
   sdfdbg << "COLLISION LUMPING: link: [" << _link->name << "] contains ["
5958d7a
-    << static_cast<int>(_link->collision_groups.size())
5958d7a
+    << static_cast<int>(_link->collision_array.size())
5958d7a
     << "] collisions.\n";
5958d7a
-  for (std::map
5958d7a
-      boost::shared_ptr<std::vector<UrdfCollisionPtr > > >::iterator
5958d7a
-      colsIt = _link->collision_groups.begin();
5958d7a
-      colsIt != _link->collision_groups.end(); ++colsIt)
5958d7a
-  {
5958d7a
-    sdfdbg << "    collision_groups: [" << colsIt->first << "] has ["
5958d7a
-      << static_cast<int>(colsIt->second->size())
5958d7a
-      << "] Collision objects\n";
5958d7a
-  }
5958d7a
 }
5958d7a
 
5958d7a
 ////////////////////////////////////////////////////////////////////////////////
5958d7a
@@ -2206,86 +2046,21 @@
5958d7a
 }
5958d7a
 
5958d7a
 ////////////////////////////////////////////////////////////////////////////////
5958d7a
-void CreateCollisions(TiXmlElement* _elem,
5958d7a
-    ConstUrdfLinkPtr _link)
5958d7a
+void CreateCollisions(TiXmlElement* _elem, ConstUrdfLinkPtr _link)
5958d7a
 {
5958d7a
-  // loop through all collision groups. as well as additional collision from
5958d7a
-  //   lumped meshes (fixed joint reduction)
5958d7a
-  for (std::map
5958d7a
-      boost::shared_ptr<std::vector<UrdfCollisionPtr> > >::const_iterator
5958d7a
-      collisionsIt = _link->collision_groups.begin();
5958d7a
-      collisionsIt != _link->collision_groups.end(); ++collisionsIt)
5958d7a
+  // loop through collisions
5958d7a
+  for (std::vector<UrdfCollisionPtr>::const_iterator
5958d7a
+      collision =  _link->collision_array.begin();
5958d7a
+      collision != _link->collision_array.end();
5958d7a
+      ++collision)
5958d7a
   {
5958d7a
-    unsigned int defaultMeshCount = 0;
5958d7a
-    unsigned int groupMeshCount = 0;
5958d7a
-    unsigned int lumpMeshCount = 0;
5958d7a
-    // loop through collisions in each group
5958d7a
-    for (std::vector<UrdfCollisionPtr>::iterator
5958d7a
-        collision = collisionsIt->second->begin();
5958d7a
-        collision != collisionsIt->second->end();
5958d7a
-        ++collision)
5958d7a
-    {
5958d7a
-      if (collisionsIt->first == "default")
5958d7a
-      {
5958d7a
-        sdfdbg << "creating default collision for link [" << _link->name
5958d7a
-               << "]";
5958d7a
+    sdfdbg << "creating default collision for link [" << _link->name
5958d7a
+           << "]";
5958d7a
 
5958d7a
-        std::string collisionPrefix = _link->name;
5958d7a
+    std::string collisionPrefix = _link->name + (*collision)->name;
5958d7a
 
5958d7a
-        if (defaultMeshCount > 0)
5958d7a
-        {
5958d7a
-          // append _[meshCount] to link name for additional collisions
5958d7a
-          std::ostringstream collisionNameStream;
5958d7a
-          collisionNameStream << collisionPrefix << "_" << defaultMeshCount;
5958d7a
-          collisionPrefix = collisionNameStream.str();
5958d7a
-        }
5958d7a
-
5958d7a
-        /* make a <collision> block */
5958d7a
-        CreateCollision(_elem, _link, *collision, collisionPrefix);
5958d7a
-
5958d7a
-        // only 1 default mesh
5958d7a
-        ++defaultMeshCount;
5958d7a
-      }
5958d7a
-      else if (collisionsIt->first.find(std::string("lump::")) == 0)
5958d7a
-      {
5958d7a
-        // if collision name starts with "lump::", pass through
5958d7a
-        //   original parent link name
5958d7a
-        sdfdbg << "creating lump collision [" << collisionsIt->first
5958d7a
-               << "] for link [" << _link->name << "].\n";
5958d7a
-        /// collisionPrefix is the original name before lumping
5958d7a
-        std::string collisionPrefix = collisionsIt->first.substr(6);
5958d7a
-
5958d7a
-        if (lumpMeshCount > 0)
5958d7a
-        {
5958d7a
-          // append _[meshCount] to link name for additional collisions
5958d7a
-          std::ostringstream collisionNameStream;
5958d7a
-          collisionNameStream << collisionPrefix << "_" << lumpMeshCount;
5958d7a
-          collisionPrefix = collisionNameStream.str();
5958d7a
-        }
5958d7a
-
5958d7a
-        CreateCollision(_elem, _link, *collision, collisionPrefix);
5958d7a
-        ++lumpMeshCount;
5958d7a
-      }
5958d7a
-      else
5958d7a
-      {
5958d7a
-        sdfdbg << "adding collisions from collision group ["
5958d7a
-              << collisionsIt->first << "]\n";
5958d7a
-
5958d7a
-        std::string collisionPrefix = _link->name + std::string("_") +
5958d7a
-          collisionsIt->first;
5958d7a
-
5958d7a
-        if (groupMeshCount > 0)
5958d7a
-        {
5958d7a
-          // append _[meshCount] to _link name for additional collisions
5958d7a
-          std::ostringstream collisionNameStream;
5958d7a
-          collisionNameStream << collisionPrefix << "_" << groupMeshCount;
5958d7a
-          collisionPrefix = collisionNameStream.str();
5958d7a
-        }
5958d7a
-
5958d7a
-        CreateCollision(_elem, _link, *collision, collisionPrefix);
5958d7a
-        ++groupMeshCount;
5958d7a
-      }
5958d7a
-    }
5958d7a
+    /* make a <collision> block */
5958d7a
+    CreateCollision(_elem, _link, *collision, collisionPrefix);
5958d7a
   }
5958d7a
 }
5958d7a
 
5958d7a
@@ -2293,83 +2068,18 @@
5958d7a
 void CreateVisuals(TiXmlElement* _elem,
5958d7a
     ConstUrdfLinkPtr _link)
5958d7a
 {
5958d7a
-  // loop through all visual groups. as well as additional visuals from
5958d7a
-  //   lumped meshes (fixed joint reduction)
5958d7a
-  for (std::map
5958d7a
-      boost::shared_ptr<std::vector<UrdfVisualPtr> > >::const_iterator
5958d7a
-      visualsIt = _link->visual_groups.begin();
5958d7a
-      visualsIt != _link->visual_groups.end(); ++visualsIt)
5958d7a
+  // loop through visuals
5958d7a
+  for (std::vector<UrdfVisualPtr>::const_iterator
5958d7a
+      visual = _link->visual_array.begin();
5958d7a
+      visual != _link->visual_array.end(); ++visual)
5958d7a
   {
5958d7a
-    unsigned int defaultMeshCount = 0;
5958d7a
-    unsigned int groupMeshCount = 0;
5958d7a
-    unsigned int lumpMeshCount = 0;
5958d7a
-    // loop through all visuals in this group
5958d7a
-    for (std::vector<UrdfVisualPtr>::iterator
5958d7a
-        visual = visualsIt->second->begin();
5958d7a
-        visual != visualsIt->second->end();
5958d7a
-        ++visual)
5958d7a
-    {
5958d7a
-      if (visualsIt->first == "default")
5958d7a
-      {
5958d7a
-        sdfdbg << "creating default visual for link [" << _link->name
5958d7a
-               << "]";
5958d7a
+    sdfdbg << "creating default visual for link [" << _link->name
5958d7a
+           << "]";
5958d7a
 
5958d7a
-        std::string visualPrefix = _link->name;
5958d7a
+    std::string visualPrefix = _link->name + (*visual)->name;
5958d7a
 
5958d7a
-        if (defaultMeshCount > 0)
5958d7a
-        {
5958d7a
-          // append _[meshCount] to _link name for additional visuals
5958d7a
-          std::ostringstream visualNameStream;
5958d7a
-          visualNameStream << visualPrefix << "_" << defaultMeshCount;
5958d7a
-          visualPrefix = visualNameStream.str();
5958d7a
-        }
5958d7a
-
5958d7a
-        // create a <visual> block
5958d7a
-        CreateVisual(_elem, _link, *visual, visualPrefix);
5958d7a
-
5958d7a
-        // only 1 default mesh
5958d7a
-        ++defaultMeshCount;
5958d7a
-      }
5958d7a
-      else if (visualsIt->first.find(std::string("lump::")) == 0)
5958d7a
-      {
5958d7a
-        // if visual name starts with "lump::", pass through
5958d7a
-        //   original parent link name
5958d7a
-        sdfdbg << "creating lump visual [" << visualsIt->first
5958d7a
-               << "] for link [" << _link->name << "].\n";
5958d7a
-        /// visualPrefix is the original name before lumping
5958d7a
-        std::string visualPrefix = visualsIt->first.substr(6);
5958d7a
-
5958d7a
-        if (lumpMeshCount > 0)
5958d7a
-        {
5958d7a
-          // append _[meshCount] to _link name for additional visuals
5958d7a
-          std::ostringstream visualNameStream;
5958d7a
-          visualNameStream << visualPrefix << "_" << lumpMeshCount;
5958d7a
-          visualPrefix = visualNameStream.str();
5958d7a
-        }
5958d7a
-
5958d7a
-        CreateVisual(_elem, _link, *visual, visualPrefix);
5958d7a
-        ++lumpMeshCount;
5958d7a
-      }
5958d7a
-      else
5958d7a
-      {
5958d7a
-        sdfdbg << "adding visuals from visual group ["
5958d7a
-              << visualsIt->first << "]\n";
5958d7a
-
5958d7a
-        std::string visualPrefix = _link->name + std::string("_") +
5958d7a
-          visualsIt->first;
5958d7a
-
5958d7a
-        if (groupMeshCount > 0)
5958d7a
-        {
5958d7a
-          // append _[meshCount] to _link name for additional visuals
5958d7a
-          std::ostringstream visualNameStream;
5958d7a
-          visualNameStream << visualPrefix << "_" << groupMeshCount;
5958d7a
-          visualPrefix = visualNameStream.str();
5958d7a
-        }
5958d7a
-
5958d7a
-        CreateVisual(_elem, _link, *visual, visualPrefix);
5958d7a
-        ++groupMeshCount;
5958d7a
-      }
5958d7a
-    }
5958d7a
+    // create a <visual> block
5958d7a
+    CreateVisual(_elem, _link, *visual, visualPrefix);
5958d7a
   }
5958d7a
 }
5958d7a