Unified collision environment

MoveIt contained a split collision environment of the robot itself and the world into CollisionWorld and CollisionRobot. CollisionRobot is used for self-collision checks whereas CollisionWorld for robot-world collision detection.

After discussions within the community, we decided that a single unified collision environment is the better solution. It reduces complexity and improves maintainability. Adding other collision detectors like Bullet and leveraging their full performance potential becomes easier. For more details, please see the PR.

The changes are only merged in the master branch and will not be cherry-picked to any stable release.

Migration notes

The changes break the existing API in two places: Code which directly interacts with the collision detection through the getCollisionRobot or getCollisionWorld environment. These functions do not exist anymore and are superseded by getCollisionEnv which returns the new unified collision environment. The new CollisionEnv provides the union of all functions in CollisionRobot and CollisionWorld.

Please report any bugs and issues you encounter during the transition on GitHub.

4 Likes

Thanks @jpetit! Could you better emphasize the collision checking speedups this unification gets us?

The unification itself does not bring speed improvements but is a big step in the direction of more performant collision checking. I did some benchmarks using Bullet in a unified collision setup and it is able to outperform FCL in many different scenarios (all values in checks per second):

Collision environment Bullet Unified FCL World Robot
Robot self check, no collision 270,000 110,000
World clutter 100 meshes, no collision 50,000 35,000
World clutter 100 meshes, 4 in collision 8600 800

When the closest distance is needed, Bullet is also considerably (factor 10) faster. See this post for more details. Bullet will hopefully be available within this month.