Skip to content

Commit 5b1f160

Browse files
committed
Fix bug in propagating is_collision properly
1 parent bf66bac commit 5b1f160

3 files changed

Lines changed: 61 additions & 6 deletions

File tree

fcl/fcl.pyx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -545,7 +545,7 @@ def collide(CollisionObject o1, CollisionObject o2,
545545
),
546546
cresult)
547547

548-
result.is_collision = cresult.isCollision()
548+
result.is_collision = result.is_collision or cresult.isCollision()
549549

550550
cdef vector[defs.Contact] contacts
551551
cresult.getContacts(contacts)
@@ -582,8 +582,8 @@ def continuousCollide(CollisionObject o1, Transform tf1_end,
582582
),
583583
cresult)
584584

585-
result.is_collide = cresult.is_collide
586-
result.time_of_contact = cresult.time_of_contact
585+
result.is_collide = result.is_collide or cresult.is_collide
586+
result.time_of_contact = min(cresult.time_of_contact, result.time_of_contact)
587587
return ret
588588

589589
def distance(CollisionObject o1, CollisionObject o2,
@@ -603,7 +603,7 @@ def distance(CollisionObject o1, CollisionObject o2,
603603
),
604604
cresult)
605605

606-
result.min_distance = cresult.min_distance
606+
result.min_distance = min(cresult.min_distance, result.min_distance)
607607
result.nearest_points = [vec3f_to_numpy(cresult.nearest_points[0]),
608608
vec3f_to_numpy(cresult.nearest_points[1])]
609609
result.o1 = c_to_python_collision_geometry(cresult.o1, o1, o2)

fcl/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '0.0.5'
1+
__version__ = '0.0.6'

test/test_fcl.py

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,37 +48,44 @@ def test_pairwise_collisions(self):
4848
cone = fcl.CollisionObject(self.geometry['cone'])
4949
mesh = fcl.CollisionObject(self.geometry['mesh'])
5050

51+
result = fcl.CollisionResult()
5152
ret = fcl.collide(box, cone, self.crequest, result)
5253
self.assertTrue(ret > 0)
5354
self.assertTrue(result.is_collision)
5455

56+
result = fcl.CollisionResult()
5557
ret = fcl.collide(box, mesh, self.crequest, result)
5658
self.assertTrue(ret > 0)
5759
self.assertTrue(result.is_collision)
5860

61+
result = fcl.CollisionResult()
5962
ret = fcl.collide(cone, mesh, self.crequest, result)
6063
self.assertTrue(ret > 0)
6164
self.assertTrue(result.is_collision)
6265

6366
cone.setTranslation(np.array([0.0, 0.0, -0.6]))
6467

68+
result = fcl.CollisionResult()
6569
ret = fcl.collide(box, cone, self.crequest, result)
6670
self.assertTrue(ret > 0)
6771
self.assertTrue(result.is_collision)
6872

73+
result = fcl.CollisionResult()
6974
ret = fcl.collide(cone, mesh, self.crequest, result)
7075
self.assertTrue(ret == 0)
7176
self.assertFalse(result.is_collision)
7277

7378
cone.setTranslation(np.array([0.0, -0.9, 0.0]))
7479
cone.setRotation(self.x_axis_rot)
7580

81+
result = fcl.CollisionResult()
7682
ret = fcl.collide(box, cone, self.crequest, result)
7783
self.assertTrue(ret > 0)
7884
self.assertTrue(result.is_collision)
7985

8086
cone.setTranslation(np.array([0.0, -1.1, 0.0]))
8187

88+
result = fcl.CollisionResult()
8289
ret = fcl.collide(box, cone, self.crequest, result)
8390
self.assertTrue(ret == 0)
8491
self.assertFalse(result.is_collision)
@@ -90,31 +97,38 @@ def test_pairwise_distances(self):
9097
cone = fcl.CollisionObject(self.geometry['cone'])
9198
mesh = fcl.CollisionObject(self.geometry['mesh'])
9299

100+
result = fcl.DistanceResult()
93101
ret = fcl.distance(box, cone, self.drequest, result)
94102
self.assertTrue(ret < 0)
95103

104+
result = fcl.DistanceResult()
96105
ret = fcl.distance(box, mesh, self.drequest, result)
97106
self.assertTrue(ret < 0)
98107

108+
result = fcl.DistanceResult()
99109
ret = fcl.distance(cone, mesh, self.drequest, result)
100110
self.assertTrue(ret < 0)
101111

102112
cone.setTranslation(np.array([0.0, 0.0, -0.6]))
103113

114+
result = fcl.DistanceResult()
104115
ret = fcl.distance(box, cone, self.drequest, result)
105116
self.assertTrue(ret < 0)
106117

118+
result = fcl.DistanceResult()
107119
ret = fcl.distance(cone, mesh, self.drequest, result)
108120
self.assertAlmostEqual(ret, 0.1)
109121

110122
cone.setTranslation(np.array([0.0, -0.9, 0.0]))
111123
cone.setRotation(self.x_axis_rot)
112124

125+
result = fcl.DistanceResult()
113126
ret = fcl.distance(box, cone, self.drequest, result)
114127
self.assertTrue(ret < 0)
115128

116129
cone.setTranslation(np.array([0.0, -1.1, 0.0]))
117130

131+
result = fcl.DistanceResult()
118132
ret = fcl.distance(box, cone, self.drequest, result)
119133
self.assertAlmostEqual(ret, 0.1)
120134

@@ -129,7 +143,7 @@ def test_pairwise_continuous_collisions(self):
129143
ret = fcl.continuousCollide(box, fcl.Transform(),
130144
cone, fcl.Transform(),
131145
request, result)
132-
146+
133147
'''
134148
## WHY DOES THIS FAIL ##
135149
self.assertTrue(result.is_collide)
@@ -225,6 +239,47 @@ def test_updates(self):
225239
manager.collide(cdata, fcl.defaultCollisionCallback)
226240
self.assertTrue(cdata.result.is_collision)
227241

242+
def test_many_objects(self):
243+
manager = fcl.DynamicAABBTreeCollisionManager()
244+
245+
objs = [fcl.CollisionObject(self.geometry['sphere']),
246+
fcl.CollisionObject(self.geometry['sphere'], fcl.Transform(np.array([0.0, 0.0, -5.0]))),
247+
fcl.CollisionObject(self.geometry['sphere'], fcl.Transform(np.array([0.0, 0.0, 5.0])))]
248+
249+
manager.registerObjects(objs)
250+
manager.setup()
251+
252+
self.assertTrue(len(manager.getObjects()) == 3)
253+
254+
# Many-to-many, internal
255+
cdata = fcl.CollisionData(self.crequest, fcl.CollisionResult())
256+
manager.collide(cdata, fcl.defaultCollisionCallback)
257+
self.assertFalse(cdata.result.is_collision)
258+
259+
objs[1].setTranslation(np.array([0.0, 0.0, -0.3]))
260+
manager.update(objs[1])
261+
cdata = fcl.CollisionData(self.crequest, fcl.CollisionResult())
262+
manager.collide(cdata, fcl.defaultCollisionCallback)
263+
self.assertTrue(cdata.result.is_collision)
264+
265+
objs[1].setTranslation(np.array([0.0, 0.0, -5.0]))
266+
manager.update(objs[1])
267+
cdata = fcl.CollisionData(self.crequest, fcl.CollisionResult())
268+
manager.collide(cdata, fcl.defaultCollisionCallback)
269+
self.assertFalse(cdata.result.is_collision)
270+
271+
objs[2].setTranslation(np.array([0.0, 0.0, 0.3]))
272+
manager.update(objs[2])
273+
cdata = fcl.CollisionData(self.crequest, fcl.CollisionResult())
274+
manager.collide(cdata, fcl.defaultCollisionCallback)
275+
self.assertTrue(cdata.result.is_collision)
276+
277+
objs[2].setTranslation(np.array([0.0, 0.0, 5.0]))
278+
manager.update(objs[2])
279+
cdata = fcl.CollisionData(self.crequest, fcl.CollisionResult())
280+
manager.collide(cdata, fcl.defaultCollisionCallback)
281+
self.assertFalse(cdata.result.is_collision)
282+
228283
def test_managed_distances(self):
229284
manager1 = fcl.DynamicAABBTreeCollisionManager()
230285
manager2 = fcl.DynamicAABBTreeCollisionManager()

0 commit comments

Comments
 (0)