| title | Grabette Slam | |||
|---|---|---|---|---|
| emoji | 🌍 | |||
| colorFrom | blue | |||
| colorTo | indigo | |||
| sdk | docker | |||
| app_port | 7860 | |||
| hf_oauth | true | |||
| hf_oauth_scopes |
|
A HuggingFace Space that turns a raw Grabette recording dataset into a LeRobot dataset and pushes it to the Hub.
- Sign in with your Hugging Face account (OAuth).
- Give a source dataset
repo_id(raw Grabette recording on the Hub), a targetrepo_idto create, and a task description. - For each episode the Space runs, in-process:
convert_episode— expand the recording into theslam_input/layoutrun_slam— RGB-D odometry (visual-inertial when the camera has an IMU) via the bundledoffline_vslambinarybuild_dataset— assemble a LeRobot v3 datasetpush_to_hub— upload under your account
- A link + embedded view of the LeRobot visualizer is shown for the result (the dataset must be public to be visualized).
The SLAM step is a compiled C++ binary (offline_vslam, built on RTAB-Map).
Locally it runs in the pollenrobotics/grabette-vslam Docker image, but Spaces cannot
run Docker-in-Docker. So this Space is that image: it builds the binary at
image-build time and run_slam(..., binary=...) calls it directly.
The pipeline lives in this repo: ./grabette-postprocess is the package the
Space installs (with offline_vslam.cpp, compiled at image-build time) and is
its source of truth. The Docker build needs nothing outside this tree.
Note: RTAB-Map is compiled with
--parallel 2to stay within the HF build runner's memory (full parallelism OOMs it).
Both Spaces build from this repo, through GitHub Actions:
- prod: every push to
mainsyncs it to the main Space (sync-to-hf-space.yml). - test: run Deploy a branch to HF test Space
(
deploy-branch-to-hf-test-space.yml) from the Actions tab, on any branch, tag or SHA.
Native (fast, for the UI and pipeline glue). From the repo root:
uv venv --python 3.12
uv pip install -e ./grabette-postprocess -r requirements.txt
hf auth login # once: the local Sign-in button is mocked with this account
.venv/bin/python app.py # → http://localhost:7860The SLAM step needs the offline_vslam binary (VSLAM_BINARY, default
/usr/local/bin/offline_vslam), which is only built inside the Docker image.
For anything that runs SLAM, use the image.
Docker (the same image as the Space).
docker build -t grabette-slam .
docker run --rm -p 7860:7860 -e SYSTEM= \
-v ~/.cache/huggingface:/home/user/.cache/huggingface grabette-slamSYSTEM= clears the image's SYSTEM=spaces, so Gradio mocks the sign-in with
your local Hugging Face login instead of expecting the Space's OAuth variables.
On Apple Silicon, turn on Docker Desktop → Settings → General → "Use Rosetta for x86_64/amd64 emulation": the image is amd64-only, and under the default qemu emulation the app segfaults at startup.
Tests: see grabette-postprocess/README.md.