Repository navigation
Merged
Conversation
…ge-stats Fix streaming image statistics
…ency 24 modify the frame frequency
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Release
develop→main. Merging this deploys the prod Spacepollen-robotics/grabette-slamautomatically (sync-to-hf-space.ymlruns on push tomain). Prod currently runsmainat fd30627 (2026-09-17).What's in it
OAK_VSLAM_BINARYtoVSLAM_BINARYoak_slam.py→slam.py, the per-episodeoak/dir →slam_input/,docker/oak_vslam/→docker/vslam/. IMU-less cameras now get a plain log line instead of a raw[Errno 2]pollenrobotics/grabette-vslam:2026-10-20(multi-arch), so itsoffline_vslambinary supports IMU-less camerasBehaviour changes users may notice
slam_input/,slam_stdout.txt(Rename OAK-specific post-processing identifiers to generic names #29).Verification
developtip (39116d8) on the test Space. Rebuild SLAM base image as grabette-vslam:2026-10-20 (multi-arch) #30 changed the rootDockerfile's base image after Rename OAK-specific post-processing identifiers to generic names #29's Space run. The test Space is currently in use by another branch.🤖 Generated with Claude Code