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)