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-hackathon — not a fork.
Honorable Mention at the Embodied Metal Hackathon, hosted by Mission Robotics, New Theory, Savant, and North Star.
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.
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.
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.shThis exercises: log_rebot --fake → record_episode --fake → query_api_cli →
export_lerobot --fallback → replay_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.
- Edit
config/arm.yaml— joints,robot_type, optionalurdf. - Edit
config/recording.yaml— follower port, optional leader, camera indices. - URDF (optional): set
urdf:in arm.yaml, envREBOT_URDF, or CLI--urdf. If missing/unreadable, tools warn and continue — joints + cameras still work.
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 10Leader is optional. Full teleop collect needs a leader; log_rebot / replay_episode
can run follower-only.
Logged entities (SO-compatible roles):
follower/position— joint statefollower/goal— commanded action (teleop / record)camera/cam0,camera/cam1— front / sidefollower/urdf— path reference when available
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 8Writes recordings/<dataset>/<episode>.rrd, .traj.npz, optional JPEG frames, and a row
in recordings/catalog.json.
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-positionStep-by-step: docs/QUERY_API.md. Rerun Viewer is optional visualization only.
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 --fallbackExport 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.
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.5See 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.
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 |
There is no in-repo calibrate_rebot CLI — docs + venue tools are enough.
Venue setup (reproducible):
- 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. - Leader —
lerobot-calibrateforrebot_arm_102_leader(when using teleop). - 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).
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
MIT — see LICENSE. Attribution: NOTICE.md.
Inspired by mission-robotics-ai/so100-hackathon; not a fork.