Collision Checker
fcl_collision_object_group.cc
Go to the documentation of this file.
4 
5 namespace collision {
6 namespace solvers {
7 namespace solverFCL {
9  const ICollisionContainer *cont, const CollisionObject *parent,
10  const IFCLCollisionObjectGroup *parent_interface)
11  : m_CollisionContainer(cont),
12  m_parent(parent),
13  m_parent_interface(parent_interface) {
16  m_broadphase_factory = getDefaultBroadphaseFactory();
17 }
19  const FCLCollisionObjectGroup &copy) {
20  m_CollisionContainer = copy.m_CollisionContainer;
21  m_parent = copy.m_parent;
22  m_parent_interface = copy.m_parent_interface;
23 
26  m_broadphase_factory = copy.m_broadphase_factory;
27 }
28 
30  BroadPhaseManagerFactoryConstPtr broadphase_factory) {
31  m_broadphase_factory = broadphase_factory;
33  invalidateManagerCache(); // recreate BV hierarchy when broadphase manager is
34  // replaced
35  return 0;
36 }
37 
40  FCL_PRECISION tolerance) const {
41  SolverEntity_FCL *obj2_entity;
42  FCL_COLLISION_ENTITY_TYPE obj2_entity_type =
43  get_object_fcl_entity_type(&obj2, obj2_entity);
44 
45  if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECT) {
47  *this, *(static_cast<const FCLCollisionObject *>(obj2_entity)),
48  distance, tolerance);
49  return result;
50  } else if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECTGROUP) {
52  *this, *(static_cast<const FCLCollisionObjectGroup *>(obj2_entity)),
53  distance, tolerance);
54  return result;
55  } else
56  return -1;
57 }
58 
60  const CollisionObject &obj2, double &distance,
61  FCL_TOLERANCE_CHECK_TYPE check_type, FCL_PRECISION tolerance) const {
62  SolverEntity_FCL *obj2_entity;
63  FCL_COLLISION_ENTITY_TYPE obj2_entity_type =
64  get_object_fcl_entity_type(&obj2, obj2_entity);
65  if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECT) {
67  *this, *(static_cast<const FCLCollisionObject *>(obj2_entity)),
68  distance, check_type, tolerance);
69 
70  } else if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECTGROUP) {
72  *this, *(static_cast<const FCLCollisionObjectGroup *>(obj2_entity)),
73  distance, check_type, tolerance);
74  } else
75  return -1;
76 }
77 
78 /*
79 int FCLCollisionObjectGroup::ToleranceCheck(CollisionObjectConstPtr obj2, bool&
80 result, double& distance, FCL_TOLERANCE_CHECK_TYPE check_type, FCL_PRECISION
81 tolerance) const
82 {
83 SolverEntity_FCL* obj2_entity;
84 FCL_COLLISION_ENTITY_TYPE obj2_entity_type = get_object_fcl_entity_type(obj2,
85 obj2_entity);
86 
87 if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECT)
88 {
89 int tolerance_result = fcl_primitive_queries::FCL_DistanceTolerance(*this,
90 *(static_cast<const FCLCollisionObject*>(obj2_entity)), distance,check_type,
91 tolerance); if (tolerance_result >= 0)
92 {
93 if (distance > -1 * (abs(tolerance)))
94 result = true;
95 else
96 result = false;
97 }
98 return tolerance_result;
99 }
100 else if (obj2_entity_type == COLLISION_ENTITY_TYPE_FCL_OBJECTGROUP)
101 {
102 int tolerance_result = fcl_primitive_queries::FCL_DistanceTolerance(*this,
103 *(static_cast<const FCLCollisionObjectGroup*>(obj2_entity)), distance,
104 check_type, tolerance); if (distance > -1 * (abs(tolerance))) result = true;
105 else
106 result = false;
107 return tolerance_result;
108 }
109 else
110 return -1;
111 }
112 */
113 
115  fcl::BroadPhaseCollisionManager<FCL_PRECISION> *&mngr) const {
116  // todo: add a shared pointer for better concurrency?
117  if (!manager_cached) {
118  if (!manager_instance_cached) {
119  m_group_manager =
120  std::unique_ptr<fcl::BroadPhaseCollisionManager<FCL_PRECISION>>(
121  m_broadphase_factory->instantiateBroadphaseManager());
122  manager_instance_cached = true;
123  }
124  m_group_manager->clear();
125  std::vector<fcl::CollisionObject<FCL_PRECISION> *> objects;
126  m_parent_interface->getCollisionObjects(objects);
127  m_group_manager->registerObjects(objects);
128  m_group_manager->setup();
129  manager_cached = true;
130  }
131  mngr = m_group_manager.get();
132  return 0;
133 }
135  manager_cached = false;
136 }
138  manager_instance_cached = false;
139 }
140 
141 } // namespace solverFCL
142 } // namespace solvers
143 } // namespace collision
int FCL_CalculateDistance(const FCLCollisionObject &obj1, const FCLCollisionObject &obj2, FCL_PRECISION &distance, double distance_tolerance=1e-6)
BroadPhaseManagerFactoryConstPtr getDefaultBroadphaseFactory(void)
std::shared_ptr< const BroadPhaseManagerFactory > BroadPhaseManagerFactoryConstPtr
int FCL_DistanceTolerance(const FCLCollisionObjectGroup &group1, const FCLCollisionObject &obj2, FCL_PRECISION &distance, FCL_TOLERANCE_CHECK_TYPE check_type=TOLERANCE_CHECK_NARROWPHASE, double distance_tolerance=1e-6)
FCLCollisionObjectGroup(const ICollisionContainer *, const CollisionObject *, const IFCLCollisionObjectGroup *parent_interface)
std::size_t distance(const CollisionObject &obj1, const CollisionObject &obj2, DistanceResult &res, const DistanceRequest &req)
virtual int getCollisionObjects(std::vector< fcl::CollisionObject< FCL_PRECISION > *> &) const =0
int replaceBroadphaseFactory(BroadPhaseManagerFactoryConstPtr broadphase_factory)
int calculateDistanceNegTolerance(const CollisionObject &obj2, double &distance, FCL_TOLERANCE_CHECK_TYPE check_type=TOLERANCE_CHECK_NARROWPHASE, FCL_PRECISION tolerance=1e-6) const
FCL_COLLISION_ENTITY_TYPE get_object_fcl_entity_type(const CollisionObject *obj2)
Definition: fcl_helpers.h:11
int calculateDistance(const CollisionObject &obj2, FCL_PRECISION &distance, FCL_PRECISION tolerance=1e-6) const
Base class for CollisionObjects and some of their groups.
int getManager_fcl(fcl::BroadPhaseCollisionManager< FCL_PRECISION > *&) const