Open-source toolkit for collecting robotic manipulation demonstrations and turning them into training-ready datasets.
A GRABETTE rig records synchronized camera + IMU streams from hand-held or gripper-mounted devices, recovers camera trajectories with SLAM, and exports LeRobot datasets for policy learning. The data-collection pipeline is arm-agnostic — OpenArm is provided as one worked integration, not a requirement.
This is a uv workspace monorepo. It supersedes the former per-component repositories (
grabette,casquette,gripette,grabette-data,openarm_gripette_simu,openarm_gripette_model), which are archived read-only. Electronics and screen firmware live in a separate hardware repo.
| Package | Role | Target | Interface |
|---|---|---|---|
grabette |
On-device data-collection service (camera + IMU + angle/OAK-D) | Raspberry Pi | HTTP/WebSocket, :8000 |
casquette |
POV head-mounted camera + IMU collection service | Raspberry Pi Zero 2W | HTTP/WebSocket, :8001 |
gripette |
Gripper motor + camera service | Raspberry Pi Zero 2W | gRPC, :50051 |
grabette-postprocess |
SLAM/VIO (OAK-D + RTAB-Map, Dockerized) → LeRobot dataset generation | Workstation | CLI |
| Package | Role |
|---|---|
openarm_gripette_simu |
MuJoCo simulation of OpenArm + Gripette, with gRPC gripper (:50051) and arm (:50052) control and synthetic data collection |
openarm_gripette_model |
Robot description (URDF / MuJoCo XML) and mesh assets, generated from Onshape |
Using GRABETTE with a different arm: the core in packages/ carries no
OpenArm dependency. To target another platform, add an
integrations/<your-arm>/ alongside openarm/ — the OpenArm integration is the
reference example.
packages/ arm-agnostic core (uv workspace members)
integrations/openarm/ reference integration for the OpenArm arm
pyproject.toml uv workspace root
uv.lock single lock for the whole workspace
Requires uv. Python ≥ 3.11.
uv sync --all-packages # build the full workspace environment
uv run --package grabette python packages/grabette/main.py # run a service (mock backend by default)Work on a single component without pulling the rest:
uv sync --package grabette-postprocess
uv run --package grabette-postprocess python scripts/arducam_slam/generate_dataset.py --help- Python /
lerobot:lerobot(used bygrabette-postprocessand the sim'sdatasetextra) requires Python ≥ 3.12, so it is gated by an environment marker. The on-device services still install and run on Python 3.11 (Raspberry Pi OS Bookworm) — they don't depend onlerobot. - OpenArm sim system deps:
placo(sim kinematics) dynamically linksliburdfdom; install it from your distro's packages before running the sim. - Raspberry Pi install: use the
make install-rpitarget (see below) — a bareuv syncskips the apt deps and--system-site-packagesvenv thatpicamera2needs, and the service silently falls back to the mock backend.
The on-device services (grabette, casquette, gripette) install through a
make target that builds the --system-site-packages venv at the workspace
root, with the device's apt-provided picamera2/libcamera:
# clone skipping the OpenArm meshes (not needed on-device)
GIT_LFS_SKIP_SMUDGE=1 git clone git@github.com:pollen-robotics/grabette.git
cd grabette/packages/grabette
make install-rpi # apt deps + venv + sync + verify imports
uv run --package grabette python -m grabette # run the service (auto-detects hardware)
make install-systemd # optional: enable boot-time autostartOn success the log shows RPi hardware detected, using RpiBackend (not
MockBackend). casquette follows the same pattern from packages/casquette;
run make help in either package for the available targets.
Apache-2.0. See LICENSE.