Skip to content

Release: develop → main (postprocess consolidation, OAK → generic rename, new SLAM image) - #31

Merged
simheo merged 27 commits into
mainfrom
develop
Oct 21, 2026
Merged

simheo merged 27 commits into
mainfrom
develop

Conversation

@simheo

@simheo simheo commented Oct 21, 2026

Copy link
Copy Markdown
Member

Release develop → main. Merging this deploys the prod Space pollen-robotics/grabette-slam automatically (sync-to-hf-space.yml runs on push to main). Prod currently runs main at fd30627 (2026-09-17).

What's in it

Behaviour changes users may notice

Verification

🤖 Generated with Claude Code

CarolinePascal and others added 27 commits October 9, 2026 17:04
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
…r-trajectory-check

22 modify the threshold for trajectory check
#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
Make grabette-postprocess here the source of truth: license, tests, CI, docs
The Orbbec Gemini 305 replaced the OAK-D SR as the default depth camera;
#27 made the prose generic, this renames what was left:

- modules/scripts: oak_slam.py -> slam.py (run_oak_slam -> run_slam),
  run_oak_slam.py -> run_slam.py, convert_episode_to_oak.py ->
  convert_episode_for_slam.py, docker/oak_vslam/ -> docker/vslam/
- checks.sync: check_oak_imu / load_oak_gyro_norm / oak_left_frame_ts ->
  check_dcam_imu / load_dcam_gyro_norm / dcam_left_frame_ts; private helpers
  and locals likewise (oak_dir -> slam_dir, oak_ts -> dcam_ts, ...)
- per-episode SLAM input dir oak/ -> slam_input/, log oak_slam_stdout.txt ->
  slam_stdout.txt
- SLAM base image pollenrobotics/oak-vslam -> pollenrobotics/grabette-vslam
  (same image, retagged; the old name stays as a frozen alias)
- pipeline.py imports the slam module so its own batch run_slam() keeps its name
- leftover OAK wording in dataset.py, slam.py, app.py, pipeline.py
- an IMU-less camera now logs "no IMU (IMU-less camera)" instead of a raw
  FileNotFoundError; other IMU failures keep the error (tests added)
- dataset.py: h264 rationale comment, needless f-string prefix dropped

Kept: legacy oakd_*/oak_mask.png names (old recordings), OAK-D-specific
notes, the "oak" camera label in offline_vslam.cpp. THIRD_PARTY_NOTICES only
gets the moved docker/vslam/ paths.

Assisted-by: Claude:claude-opus-5-5
Rename OAK-specific post-processing identifiers to generic names
The published base (:2026-07-22) predated IMU-less camera support in
offline_vslam.cpp, so its binary aborted on every Gemini episode in local
Docker runs. Rebuilt from this tree as a multi-arch image (amd64 + arm64)
and published as :2026-10-20, now also :latest.

- docker/vslam/Dockerfile: BUILD_JOBS build arg (default nproc); the
  10-job RTAB-Map compile OOMs in Docker Desktop's 8 GB VM.
- README: pin :2026-10-20, note multi-arch and BUILD_JOBS.
- Root Dockerfile: update the drift comment.

Assisted-by: Claude:claude-opus-5-5
Rebuild SLAM base image as grabette-vslam:2026-10-20 (multi-arch)
@simheo
simheo merged commit fae6e99 into main Oct 21, 2026
2 checks passed
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.

3 participants