BulletLab
Developed by Ranasurya Ghosh
A high-level robotics simulation and experimentation framework built on PyBullet.
BulletLab provides a high-level object-oriented interface to PyBullet that simplifies robotics experimentation by exposing joints, links, sensors, and environments as intuitive Python objects instead of raw physics engine IDs. It combines real-time simulation with a Dear ImGui-powered modern interface for interactive control, parameter tuning, telemetry visualization, and experiment management, while also offering reinforcement learning integration for training and evaluating autonomous robotic systems within a unified workflow.
Why BulletLab?
Without BulletLab |
With BulletLab |
|---|---|
p.setJointMotorControl2(robot_id, i, p.VELOCITY_CONTROL, ...) |
robot.joints["motor"].velocity = 15 |
p.changeDynamics(robot_id, i, mass=5) |
robot.links["wheel"].mass = 5 |
p.getBasePositionAndOrientation(...) |
robot.base_position |
| Complex IDs everywhere | Named Python objects |
Key Features
- ⚡ One-Line Model Deployment (
quickLaunch) — deploy and inspect any model (local URDF or Arsenal package) with a single line of code, complete with interactive 3-mode joint controls, telemetry, and camera tracking - Object-oriented robot interface — joints and links as Python objects
- Dear ImGui control window — modern interface, separate from PyBullet visualization
- Interactive UI Console — live test API calls, script sequential movements, and register custom commands
- BulletLab Arsenal — built-in model registry to seamlessly download and spawn high-quality robots on the fly
- Live telemetry — watch any robot state variable
- Data logging — CSV and JSON output
- Live plots — ImPlot-powered real-time charts
- RL-ready — clean state/action interface, no ML framework required
- Generic — works with any URDF or MJCF robot
Quick Start
Instant Deployment (quickLaunch)
Deploy any robot model in a full interactive simulation with rich UI controls in just one line:
import bulletlab
# Deploy a built-in URDF or local file
bulletlab.quickLaunch("kuka_iiwa/model.urdf")
# Or deploy directly from BulletLab Arsenal
bulletlab.quickLaunch("arsenal:reference_bot")
Custom Simulation Script
from bulletlab import Simulation, Robot
sim = Simulation()
sim.start()
robot = Robot.load("kuka_iiwa/model.urdf", sim=sim)
# Control by name
robot.joints["iiwa_joint_1"].set_position(1.0)
robot.links["iiwa_link_0"].mass = 5.0
while True:
sim.step()
Installation
Or from source: