GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: unittest/geom.cpp Lines: 266 266 100.0 %
Date: 2024-04-26 13:14:21 Branches: 911 1792 50.8 %

Line Branch Exec Source
1
//
2
// Copyright (c) 2015-2021 CNRS INRIA
3
//
4
5
#include <iostream>
6
7
#include "pinocchio/multibody/model.hpp"
8
#include "pinocchio/multibody/data.hpp"
9
10
#include "pinocchio/multibody/geometry.hpp"
11
#include "pinocchio/algorithm/kinematics.hpp"
12
#include "pinocchio/algorithm/geometry.hpp"
13
#include "pinocchio/parsers/urdf.hpp"
14
#include "pinocchio/parsers/srdf.hpp"
15
16
#include <vector>
17
#include <boost/test/unit_test.hpp>
18
19
using namespace pinocchio;
20
21
typedef std::map <std::string, pinocchio::SE3> PositionsMap_t;
22
typedef std::map <std::string, pinocchio::SE3> JointPositionsMap_t;
23
typedef std::map <std::string, pinocchio::SE3> GeometryPositionsMap_t;
24
typedef std::map <std::pair < std::string , std::string >, fcl::DistanceResult > PairDistanceMap_t;
25
JointPositionsMap_t fillPinocchioJointPositions(const pinocchio::Model& model, const pinocchio::Data & data);
26
GeometryPositionsMap_t fillPinocchioGeometryPositions(const pinocchio::GeometryModel & geomModel,
27
                                                      const pinocchio::GeometryData & geomData);
28
29
std::vector<std::string> getBodiesList();
30
31
BOOST_AUTO_TEST_SUITE ( BOOST_TEST_MODULE )
32
33
















4
BOOST_AUTO_TEST_CASE ( simple_boxes )
34
{
35
  using namespace pinocchio;
36
4
  Model model;
37
4
  GeometryModel geomModel;
38
39
  Model::JointIndex idx;
40



2
  idx = model.addJoint(model.getJointId("universe"),JointModelPlanar(),SE3::Identity(),"planar1_joint");
41
2
  model.addJointFrame(idx);
42

2
  model.appendBodyToJoint(idx,Inertia::Random(),SE3::Identity());
43

2
  model.addBodyFrame("planar1_body", idx, SE3::Identity());
44
45



2
  idx = model.addJoint(model.getJointId("universe"),JointModelPlanar(),SE3::Identity(),"planar2_joint");
46
2
  model.addJointFrame(idx);
47

2
  model.appendBodyToJoint(idx,Inertia::Random(),SE3::Identity());
48

2
  model.addBodyFrame("planar2_body", idx, SE3::Identity());
49
50

4
  shared_ptr<fcl::Box> sample(new fcl::Box(1, 1, 1));
51

2
  Model::FrameIndex body_id_1 = model.getBodyId("planar1_body");
52
2
  Model::JointIndex joint_parent_1 = model.frames[body_id_1].parent;
53





10
  Model::JointIndex idx_geom1 = geomModel.addGeometryObject(GeometryObject("ff1_collision_object",
54
                                                                           model.getBodyId("planar1_body"),joint_parent_1,
55

8
                                                                           sample,SE3::Identity(), "", Eigen::Vector3d::Ones())
56
                                                            );
57
2
  geomModel.geometryObjects[idx_geom1].parentJoint = model.frames[body_id_1].parent;
58
59
60

4
  shared_ptr<fcl::Box> sample2(new fcl::Box(1, 1, 1));
61

2
  Model::FrameIndex body_id_2 = model.getBodyId("planar2_body");
62
2
  Model::JointIndex joint_parent_2 = model.frames[body_id_2].parent;
63





10
  Model::JointIndex idx_geom2 = geomModel.addGeometryObject(GeometryObject("ff2_collision_object",
64
                                                                           model.getBodyId("planar2_body"),joint_parent_2,
65

8
                                                                           sample2,SE3::Identity(), "", Eigen::Vector3d::Ones()),
66
                                                            model);
67



2
  BOOST_CHECK(geomModel.geometryObjects[idx_geom2].parentJoint == model.frames[body_id_2].parent);
68
69

4
  shared_ptr<fcl::Box> universe_body_geometry(new fcl::Box(1, 1, 1));
70

2
  model.addBodyFrame("universe_body", 0, SE3::Identity());
71

2
  Model::FrameIndex body_id_3 = model.getBodyId("universe_body");
72
2
  Model::JointIndex joint_parent_3 = model.frames[body_id_3].parent;
73
2
  SE3 universe_body_placement = SE3::Random();
74





6
  Model::JointIndex idx_geom3 = geomModel.addGeometryObject(GeometryObject("universe_collision_object",
75
                                                                           model.getBodyId("universe_body"),joint_parent_3,
76
4
                                                                           universe_body_geometry,universe_body_placement, "", Eigen::Vector3d::Ones()),
77
                                                            model);
78
79



2
  BOOST_CHECK(geomModel.geometryObjects[idx_geom3].parentJoint == model.frames[body_id_3].parent);
80
81
2
  geomModel.addAllCollisionPairs();
82
4
  pinocchio::Data data(model);
83
4
  pinocchio::GeometryData geomData(geomModel);
84
85



2
  BOOST_CHECK(CollisionPair(0,1) == geomModel.collisionPairs[0]);
86
87

2
  std::cout << "------ Model ------ " << std::endl;
88
2
  std::cout << model;
89

2
  std::cout << "------ Geom ------ " << std::endl;
90
2
  std::cout << geomModel;
91

2
  std::cout << "------ DataGeom ------ " << std::endl;
92
2
  std::cout << geomData;
93
94
4
  Eigen::VectorXd q(model.nq);
95


2
  q <<  0, 0, 1, 0,
96


2
        0, 0, 1, 0 ;
97
98
2
  pinocchio::updateGeometryPlacements(model, data, geomModel, geomData, q);
99



2
  BOOST_CHECK(geomData.oMg[idx_geom3].isApprox(universe_body_placement));
100



2
  BOOST_CHECK(computeCollision(geomModel,geomData,0) == true);
101
102


2
  q <<  2, 0, 1, 0,
103


2
        0, 0, 1, 0 ;
104
105
2
  pinocchio::updateGeometryPlacements(model, data, geomModel, geomData, q);
106



2
  BOOST_CHECK(computeCollision(geomModel,geomData,0) == false);
107
108


2
  q <<  0.99, 0, 1, 0,
109


2
        0, 0, 1, 0 ;
110
111
2
  pinocchio::updateGeometryPlacements(model, data, geomModel, geomData, q);
112



2
  BOOST_CHECK(computeCollision(geomModel,geomData,0) == true);
113
114


2
  q <<  1.01, 0, 1, 0,
115


2
        0, 0, 1, 0 ;
116
117
2
  pinocchio::updateGeometryPlacements(model, data, geomModel, geomData, q);
118



2
  BOOST_CHECK(computeCollision(geomModel,geomData,0) == false);
119
120

2
  geomModel.removeGeometryObject("ff2_collision_object");
121

2
  geomData = pinocchio::GeometryData(geomModel);
122
123



2
  BOOST_CHECK(geomModel.ngeoms == 2);
124



2
  BOOST_CHECK(geomModel.geometryObjects.size() == 2);
125



2
  BOOST_CHECK(geomModel.collisionPairs.size() == 1);
126





2
  BOOST_CHECK((geomModel.collisionPairs[0].first == 0 && geomModel.collisionPairs[0].second == 1) ||
127
	      (geomModel.collisionPairs[0].first == 1 && geomModel.collisionPairs[0].second == 0));
128



2
  BOOST_CHECK(geomData.activeCollisionPairs.size() == 1);
129



2
  BOOST_CHECK(geomData.distanceRequests.size() == 1);
130



2
  BOOST_CHECK(geomData.distanceResults.size() == 1);
131



2
  BOOST_CHECK(geomData.distanceResults.size() == 1);
132



2
  BOOST_CHECK(geomData.collisionResults.size() == 1);
133
2
}
134
135
















4
BOOST_AUTO_TEST_CASE ( loading_model )
136
{
137
  typedef pinocchio::Model Model;
138
  typedef pinocchio::GeometryModel GeometryModel;
139
  typedef pinocchio::Data Data;
140
  typedef pinocchio::GeometryData GeometryData;
141
142

6
  std::string filename = PINOCCHIO_MODEL_DIR + std::string("/example-robot-data/robots/romeo_description/urdf/romeo_small.urdf");
143
4
  std::vector < std::string > packageDirs;
144
4
  std::string meshDir  = PINOCCHIO_MODEL_DIR;
145
2
  packageDirs.push_back(meshDir);
146
147
4
  Model model;
148

2
  pinocchio::urdf::buildModel(filename, pinocchio::JointModelFreeFlyer(),model);
149
4
  GeometryModel geomModel;
150
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geomModel, packageDirs );
151
2
  geomModel.addAllCollisionPairs();
152
153

6
  GeometryModel geomModelOther = pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geomModel, packageDirs );
154



2
  BOOST_CHECK(geomModelOther == geomModel);
155
156
4
  Data data(model);
157
4
  GeometryData geomData(geomModel);
158
4
  fcl::CollisionResult result;
159
160
4
  Eigen::VectorXd q(model.nq);
161








2
  q << 0, 0, 0.840252, 0, 0, 0, 1, 0, 0, -0.3490658, 0.6981317, -0.3490658, 0, 0, 0, -0.3490658,
162







2
       0.6981317, -0.3490658, 0, 0, 1.5, 0.6, -0.5, -1.05, -0.4, -0.3, -0.2, 0, 0, 0, 0,
163



2
       1.5, -0.6, 0.5, 1.05, -0.4, -0.3, -0.2 ;
164
165
2
  pinocchio::updateGeometryPlacements(model, data, geomModel, geomData, q);
166

2
  pinocchio::Index idx = geomModel.findCollisionPair(CollisionPair(1,10));
167



2
  BOOST_CHECK(computeCollision(geomModel,geomData,idx) == false);
168
169

2
  fcl::DistanceResult distance_res = computeDistance(geomModel,geomData,idx);
170



2
  BOOST_CHECK(distance_res.min_distance > 0.);
171
2
}
172
173
















4
BOOST_AUTO_TEST_CASE(manage_collision_pairs)
174
{
175
  typedef pinocchio::Model Model;
176
  typedef pinocchio::GeometryModel GeometryModel;
177
  typedef pinocchio::GeometryData GeometryData;
178
179

6
  std::string filename = PINOCCHIO_MODEL_DIR + std::string("/example-robot-data/robots/romeo_description/urdf/romeo_small.urdf");
180
4
  std::vector < std::string > package_dirs;
181
4
  std::string mesh_dir  = PINOCCHIO_MODEL_DIR;
182
2
  package_dirs.push_back(mesh_dir);
183
184
4
  Model model;
185

2
  pinocchio::urdf::buildModel(filename, pinocchio::JointModelFreeFlyer(),model);
186
4
  GeometryModel geom_model;
187
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geom_model, package_dirs);
188
2
  geom_model.addAllCollisionPairs();
189
190

4
  GeometryModel::MatrixXb collision_map(GeometryModel::MatrixXb::Zero((Eigen::DenseIndex)geom_model.ngeoms,(Eigen::DenseIndex)geom_model.ngeoms));
191
192
382
  for(size_t k = 0; k < geom_model.collisionPairs.size(); ++k)
193
  {
194
380
    const CollisionPair & cp = geom_model.collisionPairs[k];
195
380
    collision_map((Eigen::DenseIndex)cp.first,(Eigen::DenseIndex)cp.second) = true;
196
  }
197

4
  GeometryModel::MatrixXb collision_map_lower = collision_map.transpose();
198
199

4
  GeometryModel geom_model_copy, geom_model_copy_lower;
200
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geom_model_copy, package_dirs);
201
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geom_model_copy_lower, package_dirs);
202
2
  geom_model_copy.setCollisionPairs(collision_map);
203
2
  geom_model_copy_lower.setCollisionPairs(collision_map_lower,false);
204
205



2
  BOOST_CHECK(geom_model_copy.collisionPairs.size() == geom_model.collisionPairs.size());
206



2
  BOOST_CHECK(geom_model_copy_lower.collisionPairs.size() == geom_model.collisionPairs.size());
207
382
  for(size_t k = 0; k < geom_model_copy.collisionPairs.size(); ++k)
208
  {
209



380
    BOOST_CHECK(geom_model.existCollisionPair(geom_model_copy.collisionPairs[k]));
210



380
    BOOST_CHECK(geom_model.existCollisionPair(geom_model_copy_lower.collisionPairs[k]));
211
  }
212
382
  for(size_t k = 0; k < geom_model.collisionPairs.size(); ++k)
213
  {
214



380
    BOOST_CHECK(geom_model_copy.existCollisionPair(geom_model.collisionPairs[k]));
215



380
    BOOST_CHECK(geom_model_copy_lower.existCollisionPair(geom_model.collisionPairs[k]));
216
  }
217
218
  {
219
4
    GeometryData geom_data(geom_model);
220
2
    geom_data.activateAllCollisionPairs();
221
222
382
    for(size_t k = 0; k < geom_data.activeCollisionPairs.size(); ++k)
223



380
      BOOST_CHECK(geom_data.activeCollisionPairs[k]);
224
  }
225
226
  {
227
4
    GeometryData geom_data(geom_model);
228
2
    geom_data.deactivateAllCollisionPairs();
229
230
382
    for(size_t k = 0; k < geom_data.activeCollisionPairs.size(); ++k)
231



380
      BOOST_CHECK(!geom_data.activeCollisionPairs[k]);
232
  }
233
234
  {
235

4
    GeometryData geom_data(geom_model), geom_data_copy(geom_model), geom_data_copy_lower(geom_model);
236
2
    geom_data_copy.deactivateAllCollisionPairs();
237
2
    geom_data_copy_lower.deactivateAllCollisionPairs();
238
239

4
    GeometryData::MatrixXb collision_map(GeometryModel::MatrixXb::Zero((Eigen::DenseIndex)geom_model.ngeoms,(Eigen::DenseIndex)geom_model.ngeoms));
240
382
    for(size_t k = 0; k < geom_data.activeCollisionPairs.size(); ++k)
241
    {
242
380
      const CollisionPair & cp = geom_model.collisionPairs[k];
243
380
      collision_map((Eigen::DenseIndex)cp.first,(Eigen::DenseIndex)cp.second) = geom_data.activeCollisionPairs[k];
244
    }
245

4
    GeometryData::MatrixXb collision_map_lower = collision_map.transpose();
246
247
2
    geom_data_copy.setActiveCollisionPairs(geom_model, collision_map);
248



2
    BOOST_CHECK(geom_data_copy.activeCollisionPairs == geom_data.activeCollisionPairs);
249
250
2
    geom_data_copy_lower.setActiveCollisionPairs(geom_model, collision_map_lower, false);
251



2
    BOOST_CHECK(geom_data_copy_lower.activeCollisionPairs == geom_data.activeCollisionPairs);
252
  }
253
254
  // Test security margins
255
  {
256

4
    GeometryData geom_data_upper(geom_model), geom_data_lower(geom_model);
257
258

4
    const GeometryData::MatrixXs security_margin_map(GeometryData::MatrixXs::Ones((Eigen::DenseIndex)geom_model.ngeoms,(Eigen::DenseIndex)geom_model.ngeoms));
259
4
    GeometryData::MatrixXs security_margin_map_upper(security_margin_map);
260

2
    security_margin_map_upper.triangularView<Eigen::Lower>().fill(0.);
261
262
2
    geom_data_upper.setSecurityMargins(geom_model, security_margin_map);
263
382
    for(size_t k = 0; k < geom_data_upper.collisionRequests.size(); ++k)
264
    {
265



380
      BOOST_CHECK(geom_data_upper.collisionRequests[k].security_margin == 1.);
266
    }
267
268
2
    geom_data_lower.setSecurityMargins(geom_model, security_margin_map, false);
269
382
    for(size_t k = 0; k < geom_data_lower.collisionRequests.size(); ++k)
270
    {
271



380
      BOOST_CHECK(geom_data_lower.collisionRequests[k].security_margin == 1.);
272
    }
273
  }
274
275
  // Test enableGeometryCollision
276
  {
277
4
    GeometryData geom_data(geom_model);
278
2
    geom_data.deactivateAllCollisionPairs();
279
2
    geom_data.setGeometryCollisionStatus(geom_model,0,true);
280
281
382
    for(size_t k = 0; k < geom_data.activeCollisionPairs.size(); ++k)
282
    {
283
380
      const CollisionPair & cp = geom_model.collisionPairs[k];
284

380
      if(cp.first == 0 || cp.second == 0)
285
      {
286



38
        BOOST_CHECK(geom_data.activeCollisionPairs[k]);
287
      }
288
      else
289
      {
290



342
        BOOST_CHECK(!geom_data.activeCollisionPairs[k]);
291
      }
292
    }
293
294
  }
295
296
  // Test disableGeometryCollision
297
  {
298
4
    GeometryData geom_data(geom_model);
299
2
    geom_data.activateAllCollisionPairs();
300
2
    geom_data.setGeometryCollisionStatus(geom_model,0,false);
301
302
382
    for(size_t k = 0; k < geom_data.activeCollisionPairs.size(); ++k)
303
    {
304
380
      const CollisionPair & cp = geom_model.collisionPairs[k];
305

380
      if(cp.first == 0 || cp.second == 0)
306
      {
307



38
        BOOST_CHECK(!geom_data.activeCollisionPairs[k]);
308
      }
309
      else
310
      {
311



342
        BOOST_CHECK(geom_data.activeCollisionPairs[k]);
312
      }
313
    }
314
315
  }
316
2
}
317
318
















4
BOOST_AUTO_TEST_CASE ( test_collisions )
319
{
320
  typedef pinocchio::Model Model;
321
  typedef pinocchio::GeometryModel GeometryModel;
322
  typedef pinocchio::Data Data;
323
  typedef pinocchio::GeometryData GeometryData;
324
325

6
  const std::string filename = PINOCCHIO_MODEL_DIR + std::string("/example-robot-data/robots/romeo_description/urdf/romeo_small.urdf");
326
4
  std::vector < std::string > packageDirs;
327
4
  const std::string meshDir  = PINOCCHIO_MODEL_DIR;
328
2
  packageDirs.push_back(meshDir);
329

6
  const std::string srdf_filename = PINOCCHIO_MODEL_DIR + std::string("/example-robot-data/robots/romeo_description/srdf/romeo.srdf");
330
331
4
  Model model;
332

2
  pinocchio::urdf::buildModel(filename, pinocchio::JointModelFreeFlyer(),model);
333
4
  GeometryModel geom_model;
334
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geom_model, packageDirs);
335
2
  geom_model.addAllCollisionPairs();
336
2
  pinocchio::srdf::removeCollisionPairs(model,geom_model,srdf_filename,false);
337
338
4
  Data data(model);
339
4
  GeometryData geom_data(geom_model);
340
341
2
  pinocchio::srdf::loadReferenceConfigurations(model,srdf_filename,false);
342

6
  Eigen::VectorXd q = model.referenceConfigurations["half_sitting"];
343
344
2
  pinocchio::updateGeometryPlacements(model, data, geom_model, geom_data, q);
345
346



2
  BOOST_CHECK(computeCollisions(geom_model,geom_data) == false);
347



2
  BOOST_CHECK(computeCollisions(geom_model,geom_data,false) == false);
348
349
142
  for(size_t cp_index = 0; cp_index < geom_model.collisionPairs.size(); ++cp_index)
350
  {
351
140
    const CollisionPair & cp = geom_model.collisionPairs[cp_index];
352
140
    const GeometryObject & obj1 = geom_model.geometryObjects[cp.first];
353
140
    const GeometryObject & obj2 = geom_model.geometryObjects[cp.second];
354
355
280
    hpp::fcl::CollisionResult other_res;
356
140
    computeCollision(geom_model,geom_data,cp_index);
357
358
140
    fcl::Transform3f oM1 (toFclTransform3f(geom_data.oMg[cp.first ])),
359
140
                     oM2 (toFclTransform3f(geom_data.oMg[cp.second]));
360
361
140
    fcl::collide(obj1.geometry.get(), oM1,
362
140
                 obj2.geometry.get(), oM2,
363
140
                 geom_data.collisionRequests[cp_index],
364
                 other_res);
365
366
140
    const hpp::fcl::CollisionResult & res = geom_data.collisionResults[cp_index];
367
368



140
    BOOST_CHECK(res.isCollision() == other_res.isCollision());
369



140
    BOOST_CHECK(!res.isCollision());
370
  }
371
372
  // test other signatures
373
  {
374
4
    Data data(model);
375
4
    GeometryData geom_data(geom_model);
376



2
    BOOST_CHECK(computeCollisions(model,data,geom_model,geom_data,q) == false);
377
  }
378
2
}
379
380
















4
BOOST_AUTO_TEST_CASE ( test_distances )
381
{
382
  typedef pinocchio::Model Model;
383
  typedef pinocchio::GeometryModel GeometryModel;
384
  typedef pinocchio::Data Data;
385
  typedef pinocchio::GeometryData GeometryData;
386
387

6
  const std::string filename = PINOCCHIO_MODEL_DIR + std::string("/example-robot-data/robots/romeo_description/urdf/romeo_small.urdf");
388
4
  std::vector < std::string > packageDirs;
389
4
  const std::string meshDir  = PINOCCHIO_MODEL_DIR;
390
2
  packageDirs.push_back(meshDir);
391

6
  const std::string srdf_filename = PINOCCHIO_MODEL_DIR + std::string("/example-robot-data/robots/romeo_description/srdf/romeo.srdf");
392
393
4
  Model model;
394

2
  pinocchio::urdf::buildModel(filename, pinocchio::JointModelFreeFlyer(),model);
395
4
  GeometryModel geom_model;
396
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geom_model, packageDirs);
397
2
  geom_model.addAllCollisionPairs();
398
2
  pinocchio::srdf::removeCollisionPairs(model,geom_model,srdf_filename,false);
399
400
4
  Data data(model);
401
4
  GeometryData geom_data(geom_model);
402
403
2
  pinocchio::srdf::loadReferenceConfigurations(model,srdf_filename,false);
404

6
  Eigen::VectorXd q = model.referenceConfigurations["half_sitting"];
405
406
2
  pinocchio::updateGeometryPlacements(model, data, geom_model, geom_data, q);
407
408



2
  BOOST_CHECK(computeDistances(geom_model,geom_data) < geom_model.collisionPairs.size());
409
410
  {
411
4
    Data data(model);
412
4
    GeometryData geom_data(geom_model);
413



2
    BOOST_CHECK(computeDistances(model,data,geom_model,geom_data,q) < geom_model.collisionPairs.size());
414
  }
415
2
}
416
417
















4
BOOST_AUTO_TEST_CASE ( test_append_geom_models )
418
{
419
  typedef pinocchio::Model Model;
420
  typedef pinocchio::GeometryModel GeometryModel;
421
422

6
  const std::string filename = PINOCCHIO_MODEL_DIR + std::string("/example-robot-data/robots/romeo_description/urdf/romeo_small.urdf");
423
4
  std::vector < std::string > packageDirs;
424
4
  const std::string meshDir  = PINOCCHIO_MODEL_DIR;
425
2
  packageDirs.push_back(meshDir);
426
427
4
  Model model;
428

2
  pinocchio::urdf::buildModel(filename, pinocchio::JointModelFreeFlyer(),model);
429
4
  GeometryModel geom_model1;
430
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geom_model1, packageDirs);
431
432
4
  GeometryModel geom_model2;
433
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geom_model2, packageDirs);
434
435
2
  appendGeometryModel(geom_model2,geom_model1);
436



2
  BOOST_CHECK(geom_model2.ngeoms == 2*geom_model1.ngeoms);
437
438
  // Check that collision pairs between geoms on the same joint are discarded.
439
762
  for (pinocchio::Index i = 0; i < geom_model2.collisionPairs.size(); ++i) {
440
760
    pinocchio::CollisionPair cp = geom_model2.collisionPairs[i];
441


760
    BOOST_CHECK_NE(
442
        geom_model2.geometryObjects[cp.first].parentJoint,
443
        geom_model2.geometryObjects[cp.second].parentJoint
444
    );
445
  }
446
447
  {
448
4
    GeometryModel geom_model_empty;
449
4
    GeometryModel geom_model;
450



2
    BOOST_CHECK(geom_model_empty.ngeoms == 0);
451
2
    appendGeometryModel(geom_model,geom_model_empty);
452



2
    BOOST_CHECK(geom_model.ngeoms== 0);
453
  }
454
2
}
455
456
#if defined(PINOCCHIO_WITH_URDFDOM) && defined(PINOCCHIO_WITH_HPP_FCL)
457
















4
BOOST_AUTO_TEST_CASE (radius)
458
{
459
4
  std::vector < std::string > packageDirs;
460
461

6
  std::string filename = PINOCCHIO_MODEL_DIR + std::string("/example-robot-data/robots/romeo_description/urdf/romeo_small.urdf");
462
4
  std::string meshDir  = PINOCCHIO_MODEL_DIR;
463
2
  packageDirs.push_back(meshDir);
464
465
4
  pinocchio::Model model;
466

2
  pinocchio::urdf::buildModel(filename, pinocchio::JointModelFreeFlyer(),model);
467
4
  pinocchio::GeometryModel geom;
468
2
  pinocchio::urdf::buildGeom(model, filename, pinocchio::COLLISION, geom, packageDirs);
469
4
  Data data(model);
470
4
  GeometryData geomData(geom);
471
472
  // Test that the algorithm does not crash
473
2
  pinocchio::computeBodyRadius(model, geom, geomData);
474










134
  BOOST_FOREACH( double radius, geomData.radius) BOOST_CHECK(radius>=0.);
475
2
}
476
#endif // if defined(PINOCCHIO_WITH_URDFDOM) && defined(PINOCCHIO_WITH_HPP_FCL)
477
478
BOOST_AUTO_TEST_SUITE_END ()