Skip to content

Make grabette-postprocess here the source of truth: license, tests, CI, docs - #26

Merged
simheo merged 10 commits into
developfrom
postprocess-consolidation
Oct 20, 2026
Merged

simheo merged 10 commits into
developfrom
postprocess-consolidation

Conversation

@simheo

@simheo simheo commented Oct 19, 2026 •

Copy link
Copy Markdown
Member

Phase 1 of the repo split: grabette-slam becomes the home of the SLAM → LeRobot pipeline (grabette-postprocess "part 1"). Later, the grabette monorepo drops its own copy and keeps only what ships in the RPi images, and the training-side code moves to a new grabette-policy repo.

No library module, app file, Dockerfile or requirements.txt is touched, so the Space's runtime behaviour does not change.

Commits

  1. License: root Apache-2.0 LICENSE, NOTICE, THIRD_PARTY_NOTICES.md (RTAB-Map, DepthAI, LeRobot), plus grabette-postprocess/LICENSE. The repo is public now and had none.
  2. Tests: the monorepo's 7 part-1 test files (episode files, trajectory, recording/trajectory checks, tags, dataset build, lerobot API tripwires). They pass unchanged against this copy. Adds a test extra and pytest config; the lock only gains pytest, pluggy and iniconfig.
    test_lerobot_api.py: dropped the DiffusionPolicy-only check, added a guard for lerobot.datasets.lerobot_dataset, the path dataset.py imports.
  3. CI: new tests.yml on PRs and pushes to develop/main. It installs the exact uv.lock versions with CPU torch and runs the whole suite. The deploy workflows are unchanged.
  4. Scripts & docs:
    • compare_trajectories.py, csv_to_tum.py, normalize_tum.py added under scripts/checks/
    • run_oak_slam.py docstring: the oak-vslam image is published
    • --fps help text fixed: it said 50fps, but the fallback is 30 since 2de4bf1
    • postprocess README: Python 3.12, docker pull, sanity-check step, --extra viz, tests
    • Log/ added to .gitignore
  5. Root README:
    • removed the stale deploy.sh / ../../packages section
    • documented how the GitHub Actions workflows deploy both Spaces
    • added a local-dev section

Overlap with open work

This PR deliberately leaves alone the library files edited by #5 (dataset.py), #23 (checks/tags.py, checks/trajectory.py) and feat/tactile-sensing (dataset.py, oak_slam.py, trajectory.py). The root README.md will conflict with #13 and community-datasets-consolidation; that's expected and will be resolved when they land.

Verification

  • pytest: 67 passed with lerobot 0.6.1 (locked); 59 passed + 2 skipped without lerobot
  • CI install commands dry-run locally (uv export → CPU torch → pytest): 67 passed
  • --help runs for the 3 new scripts plus generate_dataset.py and run_oak_slam.py
  • Native local run (README "Local development"): UI on :7860, mocked sign-in, /api/status answers
  • Docker local-run commands in the README: build + run on 2521653 serve the UI on :7860 and /api/status/<id> answers. On Apple Silicon this needs Docker Desktop's Rosetta emulation (segfaults under qemu); README note added in 213b123
  • Test Space build: deployed this branch (ec5db15) to grabette-slam-test; built in ~3 min, RUNNING, / and /api/status answer

🤖 Generated with Claude Code

The repository is now public. License and attributions match the grabette
monorepo, which the vendored grabette-postprocess package comes from:
RTAB-Map (BSD-3), DepthAI (MIT, offline_vslam.cpp adapts RTABMapVIO) and
LeRobot (Apache-2.0).

Assisted-by: Claude:claude-opus-5-5
The vendored grabette-postprocess had no tests. These seven files cover
the modules the Space imports (episode files, trajectory, recording and
trajectory checks, tags, dataset build) and the lerobot API surface
dataset.py relies on. They pass unchanged against this copy, with and
without lerobot installed.

test_lerobot_api.py: drop the DiffusionPolicy-only recompute_stats check
and guard lerobot.datasets.lerobot_dataset, the path dataset.py imports.

Adds a 'test' extra (pytest) and pytest config; the lock only gains
pytest, pluggy and iniconfig.

Assisted-by: Claude:claude-opus-5-5
There was no test workflow, only the two Space deploy workflows. One job
installs the exact uv.lock versions with CPU torch and runs the whole
suite, lerobot boundary tests included. Deploy workflows are unchanged.

Assisted-by: Claude:claude-opus-5-5
…orepo

- scripts/checks: compare_trajectories.py (from the monorepo's postprocess),
  csv_to_tum.py and normalize_tum.py (from packages/grabette/scripts). Pure
  click/numpy/pandas/scipy, no new dependencies.
- run_oak_slam.py: the oak-vslam image is published; say docker pull first.
- generate_dataset.py: --fps help said 50fps, but the fallback is 30 since
  2de4bf1.
- README: Python 3.12, docker pull + pinned tag, the recording sanity check
  and lerobot-dataset-viz steps, --extra viz for Rerun, the new scripts, and
  how to run the tests.
- .gitignore: the Orbbec SDK's Log/ directory.

Library modules are untouched.

Assisted-by: Claude:claude-opus-5-5
…al dev

deploy.sh and the ../../packages path date from when this Space lived in the
grabette monorepo. The pipeline now lives here, and both Spaces deploy
through the GitHub Actions workflows.

Local development: a native run (verified: UI, mocked sign-in and REST API
come up on :7860; SLAM needs the image) and the Docker image with SYSTEM
cleared so Gradio mocks OAuth with the local HF login.

Assisted-by: Claude:claude-opus-5-5
The Orbbec Gemini 305 is the default depth camera, yet comments, docs, log
messages and check labels still described every recording as an OAK-D's.
Reword them in terms of "the depth camera" (the dcam_ files are already
named that way), and say which behaviour depends on an IMU.

- READMEs: intro, data flow, SLAM description and Hardware section list the
  Gemini 305 (default, no IMU) and the OAK-D SR.
- User-visible strings: the Space's sync message, check labels, recording
  check messages ("oak imu: ..." -> "imu: ...", matching "imu: none").
- VSLAM_BINARY replaces OAK_VSLAM_BINARY (set in the Dockerfile, read by
  pipeline.py; renamed together, so the Space is unaffected).

No identifier, file, directory or Docker image is renamed here: those wait
for feat/tactile-sensing, #5 and #23 to land. Lines inside their hunks
(app.py, dataset.py, oak_slam.py, trajectory.py, checks/tags.py,
checks/trajectory.py, pipeline.py:433) are left alone. Legacy oakd_* names
stay: old recordings still use them.

Assisted-by: Claude:claude-opus-5-5
#23 made tracking < 50% an error (BAD) and 50-75% a warning. The test
copied from the monorepo still expected 40% to only warn: move the WARN
case to 60% and add a 40% -> BAD case.

Assisted-by: Claude:claude-opus-5-5
Describe the depth camera generically, not as an OAK-D (docs, messages, env var)
The image is amd64-only; under Docker Desktop's default qemu emulation the
app segfaults at startup (pyarrow import). Verified with Rosetta on: the
README's build + run commands serve the UI on :7860.

Assisted-by: Claude:claude-opus-5-5
@simheo
simheo merged commit 25bb4d9 into develop Oct 20, 2026
1 check passed
@simheo
simheo deleted the postprocess-consolidation branch October 20, 2026 16:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant