Skip to main content

Basic utilities for PyBullet, including collision detection, ghost (i.e. visual-only) objects, and cameras.

Project description

pyb_utils: utilities for PyBullet

This is a collection of utilities I've found useful for working with PyBullet, including:

  • Collision detection: conveniently set up shortest distance computations and collision checking between arbitrary objects in arbitrary configurations with PyBullet. See the accompanying blog post.
  • Ghost objects: add purely visual objects to the simulation, optionally attached to another body.
  • Camera: virtual camera from which to get RGBA, depth, segmentation, and point cloud data. Also provides video recording using OpenCV.
  • Convenience class for easily creating rigid bodies.
  • Versions of some PyBullet functions that return named tuples, for easy field access.
  • Basic quaternion functions.

Install and run

This package supports Python 3.8–3.11. It has been tested on Ubuntu 16.04, 18.04, and 20.04.

From pip

pip install pyb_utils

From source

Clone the repository:

git clone https://github.com/adamheins/pyb_utils
cd pyb_utils

Install using poetry:

poetry install
poetry run python examples/collision_detection_example.py  # for example

Or using pip:

python -m pip install .

Documentation

The project's documentation is available here.

Usage and examples

This package provides a few basic quality-of-life utilities. First, PyBullet represents rotations using quaternions (in [x, y, z, w] order). We provide a few helper routines to create quaternions about the principal axes, convert quaternions to rotation matrices, and to rotate points (using scipy under the hood):

>>> import pyb_utils
>>> q = pyb_utils.quatz(np.pi / 2) # 90 deg rotation about z-axis
>>> q
array([0., 0., 0.70710678, 0.70710678])

>>> pyb_utils.quaternion_to_matrix(q)  # convert to rotation matrix
array([[-0.,  -1.,  0.],
       [ 1.,  -0.,  0.],
       [ 0.,   0.,  1.]])

>>> pyb_utils.quaternion_multiply(q, q)  # rotate two quaternions together
array([0, 0, 1, 0])                      # 180 deg rotate about z

>>> pyb_utils.quaternion_rotate(q, [1, 0, 0])  # rotate a point
array([0, 1, 0])

Second, we provide a simple class to quickly create rigid bodies programmatically, which is useful for adding basic objects to manipulate or act as obstacles:

>>> import pybullet as pyb
>>> import pyb_utils

>>> pyb.connect(pyb.GUI)

# create a 1x1x1 cube at the origin
>>> box = pyb_utils.BulletBody.box(position=[0, 0, 0], half_extents=[0.5, 0.5, 0.5])

# put a ball on top
>>> ball = pyb_utils.BulletBody.sphere(position=[0, 0, 1.5], radius=0.5)

# now put it somewhere else
>>> ball.set_pose(position=[2, 0, 0.5])

Third, we wrap some PyBullet functions to return named tuples, rather than normal tuples. When the tuples have 10+ fields in them, it is rather helpful to have names! The names and arguments of these functions are the same as the underlying PyBullet ones, to make swapping effortless. Continuing our previous example:

# built-in PyBullet method
# the output is not easy to read!
>>> pyb.getDynamicsInfo(box.uid, -1)
(1.0,
 0.5,
 (0.16666666666666666, 0.16666666666666666, 0.16666666666666666),
 (0.0, 0.0, 0.0),
 (0.0, 0.0, 0.0, 1.0),
 0.0,
 0.0,
 0.0,
 -1.0,
 -1.0,
 2,
 0.001)

# switch to the pyb_utils version
# now we can access fields by name
>>> info = pyb_utils.getDynamicsInfo(box.uid, -1)
>>> info.mass
1.0
>>> info.localInertiaDiagonal
(0.16666666666666666, 0.16666666666666666, 0.16666666666666666),

The functions we've wrapped in this way are getClosestPoints, getConstraintInfo, getContactPoints, getDynamicsInfo, getJointInfo, getJointState(s), and getLinkState(s). There are two differences from the vanilla PyBullet API. The first is that in pyb_utils getJointInfo also accepts an optional argument decode, which will convert the byte strings returned by PyBullet to the specified encoding. For example, decode="utf8". The second difference is that in pyb_utils getLinkState(s) will always return LinkState tuples with 8 fields, even if computeLinkVelocity=False. When computeLinkVelocity=False, then worldLinkLinearVelocity and worldLinkAngularVelocity are both set to None.

And there's more! You can find example scripts of all of this package's utilities in the examples/ directory:

Video Output

Writing a video with the VideoRecorder defaults to using the mp4v codec, which is widely supported but (at least on my computer running Ubuntu 20.04) does not play natively in web browsers. The availability of codecs depends on what is compiled into the version of OpenCV you have installed (i.e., the one backing the cv2 Python module); using an alternative codec may require a different version of OpenCV.

Known issues

Feel free to open issues (or better yet, a pull request!) if you find a problem. Currently known issues:

  • Ghost objects sometimes flicker (spooky, but undesirable). This is probably because they are updated by directly changing the object pose; we cannot have them updated automatically by, e.g., constraints since they are not dynamic objects (and we wouldn't want them to be; then they would influence the simulation).
  • The field name localInerialPos in the DynamicsInfo named tuple is spelled incorrectly. This will be fixed in a future major version.
  • The deprecated GhostSphere class will be removed in a future major version. Use GhostObject.sphere instead.

Development

  • Run tox to run the tests.
  • Sphinx is used to build the documentation. With Sphinx installed, run make html in the docs directory.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyb_utils-2.2.0.tar.gz (22.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyb_utils-2.2.0-py3-none-any.whl (24.4 kB view details)

Uploaded Python 3

File details

Details for the file pyb_utils-2.2.0.tar.gz.

File metadata

  • Download URL: pyb_utils-2.2.0.tar.gz
  • Upload date:
  • Size: 22.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.8.10 Linux/5.15.79-rt54

File hashes

Hashes for pyb_utils-2.2.0.tar.gz
Algorithm Hash digest
SHA256 922ffcc08e216c09e1cb0bb0c37618309bad708f2b642ae9094866770eaf629f
MD5 277b014606558732af351494b587b63b
BLAKE2b-256 f706f0e1e8c70f466db8423f293e10ac5dd06676fca0caf71a0c2027e8418766

See more details on using hashes here.

File details

Details for the file pyb_utils-2.2.0-py3-none-any.whl.

File metadata

  • Download URL: pyb_utils-2.2.0-py3-none-any.whl
  • Upload date:
  • Size: 24.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.5.1 CPython/3.8.10 Linux/5.15.79-rt54

File hashes

Hashes for pyb_utils-2.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e4a532e858ec7bdc4f0e1327677cfc39deb7bb608a2f21a886c2d5b28a003d5c
MD5 947440499b442c1383f41e0afac0179a
BLAKE2b-256 f9b94479458522877807eb0357abcb965315f916242c60d6dbd963e7beb07271

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page