Imitation learning on a LeRobot SO-101 arm, originally hacked together for RoboHack 2026 at EPFL — a 36-hour robotics hackathon we won with a peg-in-keyhole insertion task.
Full write-up: boesch.dev/posts/robohack
⚠️ This is hackathon code. It runs end-to-end, but expect duplicate scripts, sketchy comments, and one-off branches that worked once at 4AM
- Teleoperation, recording, training and inference for the SO-101 arm
- Multi-cloud training scripts (HuggingFace Jobs, RunPod, SLURM on KIT HoReKa, plus a SageMaker stub we never quite landed)
- A small MuJoCo sim viewer for sanity-checking trajectories
- An LLM-based open-vocabulary agent (separate from the ACT policy — experimental, not used in the hackathon submission)
- LeRobot SO-101 leader + follower arms (build guide)
- One or more USB webcams (or an MJPEG stream from another host — see
WSL_SETUP.mdfor the cross-host setup we used during the hackathon) - A 3D printer (we modified the gripper + workpieces; STL files available on request)
# 1. Install
uv sync
# 2. Find your motor ports
scripts/find-port.sh
# 3. Calibrate (one-time per arm)
scripts/calibrate.sh
# 4. Teleoperate
scripts/teleop.sh
# 5. Record demonstrations
DATASET_NAME=my_task TASK="pick up the thing" scripts/record.sh
# 6. Train
DATASET_NAME=my_task scripts/train.sh
# 7. Run trained policy on the arm
scripts/run_policy.sh outputs/train/<run>/checkpoints/last/pretrained_model
# 8. Systematic eval (records rollouts as a dataset for review)
scripts/eval.sh outputs/train/<run>/checkpoints/last/pretrained_model.env (copy from .env.example) holds the per-machine port + camera
config. Don't commit it.
The 1st-place hackathon checkpoint is on the Hub:
Encrux/act-put_finger_in_hole_v1_110_eps— ACT, 110 demos, bs=128, 15k steps, RTX PRO 6000
| Target | Entry point | Use when |
|---|---|---|
| HuggingFace Jobs | scripts/train_hf_job.py (via hf jobs uv run) |
Quick, pay-per-minute, lerobot-native |
| RunPod | scripts/runpod_train.sh |
Need a beefy GPU you don't have locally |
| KIT HoReKa (SLURM) | scripts/train.sbatch (1h chained jobs) |
Free if you have an allocation |
| SageMaker | scripts/sagemaker_train.py + launch_sagemaker.py |
Untested past quota issues; see blog |
src/robohack/ # Inference + recording entry points
scripts/ # Shell + Python utility scripts (cluttered, sorry)
scenes/ # MuJoCo XML scenes for the sim viewer
models/ # MuJoCo XML for the SO-101 mesh
tests/ # A handful of unit tests for the agent module
MIT.
