5.1. Using PyBullet

5.1.1. First Step

The first step is to connect to PyBullet and verify that the system is working.

Copy and paste the following example into a Python script or REPL. If, when run, you see the output Connected: True, then everything is working properly.

from compas_fab.backends import PyBulletClient
with PyBulletClient(connection_type='direct') as client:
    print('Connected:', client.is_connected)

Note

From the PyBullet user manual:

The GUI connection will create a new graphical user interface (GUI) with 3D OpenGL rendering, within the same process space as PyBullet. On Linux and Windows this GUI runs in a separate thread, while on OSX it runs in the same thread due to operating system limitations. On Mac OSX you may see a spinning wheel in the OpenGL Window, until you run a ‘stepSimulation’ or other PyBullet command.

Our first example loads the UR5 robot from a URDF and then adds, then removes, a floor as a collision mesh. The calls to sleep are only necessary to prevent the gui from closing this example too quickly.

import time
from compas.datastructures import Mesh

import compas_fab
from compas_fab.backends.pybullet import PyBulletClient
from compas_fab.robots import CollisionMesh

with PyBulletClient() as client:
    urdf_filepath = compas_fab.get('universal_robot/ur_description/urdf/ur5.urdf')
    robot = client.load_robot(urdf_filepath)

    mesh = Mesh.from_stl(compas_fab.get('planning_scene/floor.stl'))
    cm = CollisionMesh(mesh, 'floor')
    client.add_collision_mesh(cm)

    time.sleep(1)

    client.remove_collision_mesh('floor')

    time.sleep(1)

Adding and removing a collision mesh attached to the end effector link of the robot is similar. Again, the calls to sleep and step_simulation exist only to make the GUI rendering smoother.

import time

import compas_fab
from compas_fab.backends.pybullet import PyBulletClient
from compas_fab.robots import AttachedCollisionMesh
from compas_fab.robots import CollisionMesh

from compas.datastructures import Mesh

with PyBulletClient() as client:
    urdf_filepath = compas_fab.get('universal_robot/ur_description/urdf/ur5.urdf')
    robot = client.load_robot(urdf_filepath)

    mesh = Mesh.from_stl(compas_fab.get('planning_scene/cone.stl'))
    cm = CollisionMesh(mesh, 'tip')
    acm = AttachedCollisionMesh(cm, 'ee_link')
    client.add_attached_collision_mesh(acm, {'mass': 1, 'robot': robot})

    time.sleep(1)
    client.step_simulation()
    time.sleep(1)

    client.remove_attached_collision_mesh('tip')

    time.sleep(1)