pollen-robotics/grabette

Grabette: robotic data recording device

Python

123

785 commits

updated Oct 15, 2026

See the code

README

GRABETTE

Discord




Open-source toolkit for collecting robotic manipulation demonstrations and turning them into training-ready datasets.

A GRABETTE rig records synchronized camera + depth streams (+ IMU with the OAK-D SR) from hand-held or gripper-mounted devices, recovers camera trajectories with SLAM, and exports LeRobot datasets for policy learning. The data-collection pipeline is robot-agnostic.

🔩 Build the hardware: Bill of Materials · CAD — Onshape · Assembly guides: Grabette · Gripette


https://github.com/user-attachments/assets/6db9dd7b-1762-4004-8a76-ce76323499ba




Components

packages/ — robot-agnostic core

PackageRoleTargetInterface
grabetteHand held data-collection deviceRaspberry PiHTTP/WebSocket, :8000
gripetteRobot mounted Gripper motorRaspberry Pi Zero 2WgRPC, :50051
grabette-postprocessData postprocess + SLAM → LeRobot dataset generationWorkstationCLI
grabette-chunkrelOptional chunk-relative action representation (maths + LeRobot processor steps); per-step deltas stay the defaultWorkstation / GPUPython library
casquette (WIP)POV head-mounted deviceRaspberry Pi Zero 2WHTTP/WebSocket, :8001

integrations/ — integration example (OpenArm 7-DOF arm + Gripette)

PackageRole
openarm_gripetteCode to control the OpenArm + Gripette robot
openarm_gripette_simuMuJoCo simulation of OpenArm + Gripette and synthetic data collection
openarm_gripette_modelRobot description (URDF / MuJoCo XML) and mesh assets, generated from Onshape
DiffusionPolicyDiffusion Policy training code
Pi05π0.5 VLA fine-tuning, gates, and remote-GPU deployment (shares the DiffusionPolicy dataset pipeline)

Using GRABETTE with a different robot 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.

Cloning

The repo uses Git LFS for mesh assets (*.stl, see .gitattributes). Install LFS once per workstation, then clone normally:

sudo apt install git-lfs             # Debian / Ubuntu / Pi OS — install the binary first
                                     # (macOS: brew install git-lfs; see git-lfs.com for others)
git lfs install                      # one-time per user — configures git filters
git clone [email protected]:pollen-robotics/grabette.git

If you cloned before git lfs install, the .stl files are 130-byte pointer text files. Fetch the real binaries:

cd grabette
git lfs pull

Verify:

file packages/grabette/urdf/grabette_right/assets/*.stl | head -3
# expected: "Binary"   |   bad: "ASCII text" (pointer file → run `git lfs pull`)

For on-device installs where you don't need the meshes (Pi services don't load them), skip LFS to save disk + bandwidth:

GIT_LFS_SKIP_SMUDGE=1 git clone [email protected]:pollen-robotics/grabette.git

Development

Requires uv. Python ≥ 3.11.

uv sync --all-packages          # full workspace dev environment
uv run --package grabette python packages/grabette/main.py   # run a service (mock backend by default)

The one rule to know: this repo is a single uv workspace — one shared .venv and one uv.lock at the root. A bare uv sync, run from the repo root, builds the whole workspace and installs every package's dependencies — gigabytes of torch/mujoco on a Raspberry Pi if you're not careful. Therefore:

  • Single package / deployment → uv sync --package <name> (extras attach to it: uv sync --package grabette --extra rpi).
  • Full dev environment → uv sync --all-packages.
  • integrations/DiffusionPolicy is deliberately standalone (own uv.lock, heavy training pins) — inside it a plain uv sync is correct.

On-device install (Raspberry Pi): the simplest path is to flash the prebuilt grabetteos / gripetteos image from the latest grabette-os release, which has everything below baked in. For a manual install, each device package ships a make install-rpi target that builds the --system-site-packages venv picamera2 needs (a bare uv sync skips it and the service falls back to the mock backend). Follow the package's own README for the exact steps: grabette, gripette, casquette (WIP).

Note — lerobot / Python 3.12: grabette-postprocess's LeRobot commands, the real OpenArm driver, and the sim's dataset/eval extras require Python ≥ 3.12 (gated by env markers so the device packages remain installable on 3.11). The OpenArm sim also needs the system liburdfdom package for placo.

License

Apache-2.0. See LICENSE.

robotics

Significant stargazers

Pedro Cuenca

889 followers · starred Jul 2026

Silvio Traversaro

578 followers · starred Sep 2026

Andreas Köpf

595 followers · starred Aug 2026

Adil Zouitine

344 followers · starred Jul 2026

pollen-robotics/grabette

Grabette: robotic data recording device

Python

123

785 commits

updated Oct 15, 2026

See the code

README

GRABETTE

Discord




Open-source toolkit for collecting robotic manipulation demonstrations and turning them into training-ready datasets.

A GRABETTE rig records synchronized camera + depth streams (+ IMU with the OAK-D SR) from hand-held or gripper-mounted devices, recovers camera trajectories with SLAM, and exports LeRobot datasets for policy learning. The data-collection pipeline is robot-agnostic.

🔩 Build the hardware: Bill of Materials · CAD — Onshape · Assembly guides: Grabette · Gripette


https://github.com/user-attachments/assets/6db9dd7b-1762-4004-8a76-ce76323499ba




Components

packages/ — robot-agnostic core

PackageRoleTargetInterface
grabetteHand held data-collection deviceRaspberry PiHTTP/WebSocket, :8000
gripetteRobot mounted Gripper motorRaspberry Pi Zero 2WgRPC, :50051
grabette-postprocessData postprocess + SLAM → LeRobot dataset generationWorkstationCLI
grabette-chunkrelOptional chunk-relative action representation (maths + LeRobot processor steps); per-step deltas stay the defaultWorkstation / GPUPython library
casquette (WIP)POV head-mounted deviceRaspberry Pi Zero 2WHTTP/WebSocket, :8001

integrations/ — integration example (OpenArm 7-DOF arm + Gripette)

PackageRole
openarm_gripetteCode to control the OpenArm + Gripette robot
openarm_gripette_simuMuJoCo simulation of OpenArm + Gripette and synthetic data collection
openarm_gripette_modelRobot description (URDF / MuJoCo XML) and mesh assets, generated from Onshape
DiffusionPolicyDiffusion Policy training code
Pi05π0.5 VLA fine-tuning, gates, and remote-GPU deployment (shares the DiffusionPolicy dataset pipeline)

Using GRABETTE with a different robot 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.

Cloning

The repo uses Git LFS for mesh assets (*.stl, see .gitattributes). Install LFS once per workstation, then clone normally:

sudo apt install git-lfs             # Debian / Ubuntu / Pi OS — install the binary first
                                     # (macOS: brew install git-lfs; see git-lfs.com for others)
git lfs install                      # one-time per user — configures git filters
git clone [email protected]:pollen-robotics/grabette.git

If you cloned before git lfs install, the .stl files are 130-byte pointer text files. Fetch the real binaries:

cd grabette
git lfs pull

Verify:

file packages/grabette/urdf/grabette_right/assets/*.stl | head -3
# expected: "Binary"   |   bad: "ASCII text" (pointer file → run `git lfs pull`)

For on-device installs where you don't need the meshes (Pi services don't load them), skip LFS to save disk + bandwidth:

GIT_LFS_SKIP_SMUDGE=1 git clone [email protected]:pollen-robotics/grabette.git

Development

Requires uv. Python ≥ 3.11.

uv sync --all-packages          # full workspace dev environment
uv run --package grabette python packages/grabette/main.py   # run a service (mock backend by default)

The one rule to know: this repo is a single uv workspace — one shared .venv and one uv.lock at the root. A bare uv sync, run from the repo root, builds the whole workspace and installs every package's dependencies — gigabytes of torch/mujoco on a Raspberry Pi if you're not careful. Therefore:

  • Single package / deployment → uv sync --package <name> (extras attach to it: uv sync --package grabette --extra rpi).
  • Full dev environment → uv sync --all-packages.
  • integrations/DiffusionPolicy is deliberately standalone (own uv.lock, heavy training pins) — inside it a plain uv sync is correct.

On-device install (Raspberry Pi): the simplest path is to flash the prebuilt grabetteos / gripetteos image from the latest grabette-os release, which has everything below baked in. For a manual install, each device package ships a make install-rpi target that builds the --system-site-packages venv picamera2 needs (a bare uv sync skips it and the service falls back to the mock backend). Follow the package's own README for the exact steps: grabette, gripette, casquette (WIP).

Note — lerobot / Python 3.12: grabette-postprocess's LeRobot commands, the real OpenArm driver, and the sim's dataset/eval extras require Python ≥ 3.12 (gated by env markers so the device packages remain installable on 3.11). The OpenArm sim also needs the system liburdfdom package for placo.

License

Apache-2.0. See LICENSE.

robotics

Significant stargazers

Pedro Cuenca

889 followers · starred Jul 2026

Silvio Traversaro

578 followers · starred Sep 2026

Andreas Köpf

595 followers · starred Aug 2026

Adil Zouitine

344 followers · starred Jul 2026