Skip to content

Commit bf66bac

Browse files
committed
Fix bug to force CollisionObjects to update AABBs
1 parent 31d6061 commit bf66bac

4 files changed

Lines changed: 28 additions & 1 deletion

File tree

fcl/fcl.pyx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,21 @@ cdef class CollisionObject:
113113

114114
def setTranslation(self, vec):
115115
self.thisptr.setTranslation(numpy_to_vec3f(vec))
116+
self.thisptr.computeAABB()
116117

117118
def getRotation(self):
118119
return mat3f_to_numpy(self.thisptr.getRotation())
119120

120121
def setRotation(self, mat):
121122
self.thisptr.setRotation(numpy_to_mat3f(mat))
123+
self.thisptr.computeAABB()
122124

123125
def getQuatRotation(self):
124126
return quaternion3f_to_numpy(self.thisptr.getQuatRotation())
125127

126128
def setQuatRotation(self, q):
127129
self.thisptr.setQuatRotation(numpy_to_quaternion3f(q))
130+
self.thisptr.computeAABB()
128131

129132
def getTransform(self):
130133
rot = self.getRotation()
@@ -133,6 +136,7 @@ cdef class CollisionObject:
133136

134137
def setTransform(self, tf):
135138
self.thisptr.setTransform(deref((<Transform> tf).thisptr))
139+
self.thisptr.computeAABB()
136140

137141
def isOccupied(self):
138142
return self.thisptr.isOccupied()

fcl/fcl_defs.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ cdef extern from "fcl/collision_object.h" namespace "fcl":
183183
void setTransform(Matrix3f& q, Vec3f& T)
184184
void setTransform(Transform3f& tf)
185185
void setUserData(void *data)
186+
void computeAABB()
186187
void *getUserData()
187188
bool isOccupied()
188189
bool isFree()

fcl/version.py

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

test/test_fcl.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,28 @@ def test_managed_collisions(self):
203203
manager1.collide(manager3, cdata, fcl.defaultCollisionCallback)
204204
self.assertTrue(cdata.result.is_collision)
205205

206+
def test_updates(self):
207+
manager = fcl.DynamicAABBTreeCollisionManager()
208+
209+
objs = [fcl.CollisionObject(self.geometry['sphere']),
210+
fcl.CollisionObject(self.geometry['sphere'], fcl.Transform(np.array([0.0, 0.0, -5.0])))]
211+
212+
manager.registerObjects(objs)
213+
manager.setup()
214+
215+
self.assertTrue(len(manager.getObjects()) == 2)
216+
217+
# Many-to-many, internal
218+
cdata = fcl.CollisionData(self.crequest, fcl.CollisionResult())
219+
manager.collide(cdata, fcl.defaultCollisionCallback)
220+
self.assertFalse(cdata.result.is_collision)
221+
222+
objs[1].setTranslation(np.array([0.0, 0.0, -0.3]))
223+
cdata = fcl.CollisionData(self.crequest, fcl.CollisionResult())
224+
manager.update(objs[1])
225+
manager.collide(cdata, fcl.defaultCollisionCallback)
226+
self.assertTrue(cdata.result.is_collision)
227+
206228
def test_managed_distances(self):
207229
manager1 = fcl.DynamicAABBTreeCollisionManager()
208230
manager2 = fcl.DynamicAABBTreeCollisionManager()

0 commit comments

Comments
 (0)