Skip to content

Repository files navigation

rebotb601-rerun-stack

Teach a reBot arm a task, end to end: teleoperated data collection into Rerun recordings, curation via a local catalog, export to LeRobot v3 for training, and replay back on the arm.

Default hardware: B601-DM follower (seeed_b601_dm_follower) + optional reBot 102 leader. Inspired by so100-hackathonnot a fork.

Honorable Mention at the Embodied Metal Hackathon, hosted by Mission Robotics, New Theory, Savant, and North Star.

Welcome

This is a reusable, general-purpose Rerun data pipeline for reBot teams. Clone it, install deps with pip, run the fake smoke loop, then point config/ at your ports and cameras.

There is no always-on so100-server, and no required newt / Pixi toolchain. Training and Hugging Face upload are optional and pluggable.

Install

git clone https://github.com/<your-org>/rebotb601-rerun-stack.git
cd rebotb601-rerun-stack

python -m venv .venv
# Windows: .\.venv\Scripts\Activate.ps1
# Unix:    source .venv/bin/activate

pip install -r requirements.txt
pip install -e .

If you skip editable install, set PYTHONPATH=src (the smoke scripts do this for you).

Optional for richer parquet export: pip install pyarrow. Optional for live arms: install your team's LeRobot + Seeed robot packages on the venue machine.

START HERE

After install, run the fake end-to-end smoke from the repo root:

# Windows
.\scripts\smoke_fake.ps1
# macOS / Linux
chmod +x scripts/smoke_fake.sh
./scripts/smoke_fake.sh

This exercises: log_rebot --fakerecord_episode --fakequery_api_cliexport_lerobot --fallbackreplay_episode --fake. It fails fast with a nonzero exit on errors. No hardware required.

Status: --fake e2e is verified via smoke scripts. Live-arm e2e (record → query → export → replay without --fake) is still venue / TODO — not claimed verified here.

Set up

  1. Edit config/arm.yaml — joints, robot_type, optional urdf.
  2. Edit config/recording.yaml — follower port, optional leader, camera indices.
  3. URDF (optional): set urdf: in arm.yaml, env REBOT_URDF, or CLI --urdf. If missing/unreadable, tools warn and continue — joints + cameras still work.

Windows / live ports

On Windows, run lerobot-find-port and set the resulting COM* values in config/recording.yaml (robot.port, optional teleop.port). Keep config/arm.yaml robot_type / teleop_type aligned with those entries. Linux venue defaults are /dev/ttyACM0 (follower) and /dev/ttyUSB0 (leader).

Smoke the logger (viewer optional):

python -m rebot_rerun.log_rebot --fake --seconds 5 --no-viewer
# live follower-only (no leader required):
python -m rebot_rerun.log_rebot --seconds 10 --no-viewer
# live with leader teleop:
python -m rebot_rerun.log_rebot --teleop --seconds 10

Leader is optional. Full teleop collect needs a leader; log_rebot / replay_episode can run follower-only.

Logged entities (SO-compatible roles):

  • follower/position — joint state
  • follower/goal — commanded action (teleop / record)
  • camera/cam0, camera/cam1 — front / side
  • follower/urdf — path reference when available

Collect

python -m rebot_rerun.record_episode \
  --dataset my_task --task "Describe your task" --tag "Good episode" --seconds 8

# dry-run
python -m rebot_rerun.record_episode --fake --dataset my_task \
  --tag "Good episode" --seconds 3 --no-viewer

# follower-only (no leader port)
python -m rebot_rerun.record_episode --no-teleop --dataset my_task --seconds 8

Writes recordings/<dataset>/<episode>.rrd, .traj.npz, optional JPEG frames, and a row in recordings/catalog.json.

Refine (catalog + Query API)

Local catalog (no so100-server):

python -m rebot_rerun.query_dataset --dataset my_task
python -m rebot_rerun.query_dataset --dataset my_task --tag "Good episode"

Rerun Query API CLI (rr.server.Server + DataFusion reader()):

python -m rebot_rerun.query_api_cli --dataset my_task --schema
python -m rebot_rerun.query_api_cli --dataset my_task --compare goal-vs-position

Step-by-step: docs/QUERY_API.md. Rerun Viewer is optional visualization only.

Prepare (export)

Export tagged episodes to LeRobot v3 under datasets/:

python -m rebot_rerun.export_lerobot --dataset my_task --tag "Good episode" --fallback
# all tags:
python -m rebot_rerun.export_lerobot --dataset my_task --tag "" --repo-id local/my_task_rerun --fallback

Units (important)

Export keeps the units that were logged at record time:

  • Live: Seeed / LeRobot wire units
  • --fake: synthetic degrees-like floats

There is no silent conversion to SO-style ±100 (or SO gripper conventions). Dataset meta/info.json records units: as_logged. Do not mix with SO ±100 community data without an explicit conversion of your own. If a conversion flag is added later, default remains no conversion.

Training / HF upload is optional — plug in your own trainer after export.

Deploy (replay)

Replay is follower-only (leader not required):

python -m rebot_rerun.replay_episode --dataset my_task --episode episode_01 --fake --speed 0.5 --no-viewer
# live (keep a hand near the arm):
python -m rebot_rerun.replay_episode --dataset my_task --episode episode_01 --speed 0.5

Adopt on your reBot

See docs/examples/adopt_other_rebot.md.

Summary: change ports / camera indices / joint list / robot_type in config/, set URDF via config or REBOT_URDF, re-run smoke_fake, then live.

Diff vs SO-100

Reference: mission-robotics-ai/so100-hackathon

Topic so100-hackathon this repo
Package manager Pixi-first pip + requirements.txt
Catalog so100-server local catalog.json
Query server + tools query_api_cli terminal
Hardware SO-100/101 reBot B601-DM (+ optional 102 leader)
Joints SO set 7-DoF incl. wrist_yaw
Export units SO ±100 conversion as-logged (no silent convert)
GUI / newt course + newt not required

Calibrate notes

There is no in-repo calibrate_rebot CLI — docs + venue tools are enough.

Venue setup (reproducible):

  1. SDK zero — run the reBotArm_control_py zero/read example (e.g. 2_zero_and_read) on the follower so homing matches your hardware docs.
  2. Leaderlerobot-calibrate for rebot_arm_102_leader (when using teleop).
  3. Follower — follow Seeed / LeRobot zero + calibrate for seeed_b601_dm_follower.

Then record with matching wire units so export stays as-logged (no silent SO ±100).

Module entrypoints

python -m rebot_rerun.log_rebot
python -m rebot_rerun.record_episode
python -m rebot_rerun.query_dataset
python -m rebot_rerun.query_api_cli
python -m rebot_rerun.export_lerobot
python -m rebot_rerun.replay_episode

License / attribution

MIT — see LICENSE. Attribution: NOTICE.md.

Inspired by mission-robotics-ai/so100-hackathon; not a fork.

About

End-to-end Rerun stack for reBot B601-DM (record → curate → LeRobot v3 → replay)

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages