From dcb309aefdc4a912c37af3c918e9fd3d044b0abc Mon Sep 17 00:00:00 2001
From: Joseph Mirabel <jmirabel@laas.fr>
Date: Wed, 17 Aug 2016 10:14:40 +0200
Subject: [PATCH] [C++][Bug] Fix geometry placement computation in URDF

---
 src/parsers/urdf/geometry.cpp | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/src/parsers/urdf/geometry.cpp b/src/parsers/urdf/geometry.cpp
index 0d6d316e3..8d5e6f250 100644
--- a/src/parsers/urdf/geometry.cpp
+++ b/src/parsers/urdf/geometry.cpp
@@ -198,6 +198,10 @@ namespace se3
           }
           std::vector< boost::shared_ptr< T > > geometries_array = getLinkGeometryArray<T>(link);
 
+          FrameIndex frame_id = model.getFrameId(link_name);
+          SE3 body_placement = model.frames[frame_id].placement;
+          assert(model.frames[frame_id].type == BODY);
+
           std::size_t objectId = 0;
           for (typename std::vector< boost::shared_ptr< T > >::const_iterator i = geometries_array.begin();i != geometries_array.end(); ++i)
           {
@@ -211,12 +215,11 @@ namespace se3
             const boost::shared_ptr<fcl::CollisionGeometry> geometry(new fcl::CollisionGeometry());
 #endif // WITH_HPP_FCL            
             
-            SE3 geomPlacement = convertFromUrdf((*i)->origin);
+            SE3 geomPlacement = body_placement * convertFromUrdf((*i)->origin);
             std::ostringstream geometry_object_suffix;
             geometry_object_suffix << "_" << objectId;
             const std::string & geometry_object_name = std::string(link_name + geometry_object_suffix.str());
-            assert(model.getFrameType(model.getFrameId(link_name)) == se3::BODY);
-            geom_model.addGeometryObject(model, model.getFrameId(link_name), geometry, geomPlacement, geometry_object_name, mesh_path);
+            geom_model.addGeometryObject(model, frame_id, geometry, geomPlacement, geometry_object_name, mesh_path);
             ++objectId; 
           }
         }
-- 
GitLab