Microduck tricks: run β forward roll, roller-skate cone slalom, single-blade lift
Three new skills for the Microduck biped (Hugging Face Γ Pollen Robotics), trained with PPO on mjlab (MuJoCo Warp) on Hugging Face Jobs, evaluated with deployment-protocol batteries in the simulator. All policies use the repo's shared 61-D observation contract at 50 Hz, so they hot-swap in the existing runtime next to the official policies.
| skill | policy | held-out result (simulator) |
|---|---|---|
| Run β forward roll β stand (Γ©lan roulade) | policies/roulade_elan_v2_ckpt3750.onnx |
walk hand-off success 200/200 (official policy: 86 %); impulse start 98.4 %; robust to Β±10 % mass, foot friction 0.5β1.5, mid-roll pushes |
| Roller-skate cone slalom | policies/roller_slalom_v2_ckpt2000.onnx |
8-cone course at 0.7 m spacing: 8/8 gates, 0 cone hits, 0/50 falls at 0.5 m/s (official policy: 21 % gates, 75 % falls) |
| Single-blade lift while skating (partial) | policies/roller_glide_short_v15_ckpt1750.onnx |
on a command flag: lifts a foot, rides one blade 0.4β0.6 s (true single support by contact load), puts it down, keeps skating; 0 falls in 24 seeded takes. A sustained one-blade glide is not reachable on this robot (measured ceiling β 1 s) |
Single-blade lift clip: media/glide_v15_1750_lift.mp4.
Code, training recipes, evaluation scripts
Branch overnight-elan-slalom of the fork: https://github.com/easyrider11/microduck_rl/tree/overnight-elan-slalom
(upstream: https://github.com/pollen-robotics/microduck_rl). Results index and write-ups live in docs/results/ there
and are copied into docs/ here.
- Train:
uv run train Mjlab-RouladeElan-Flat-MicroDuck --env.scene.num-envs 4096 --hf-jobs(same forMjlab-RollerSlalomV2-Flat-MicroDuckandMjlab-RollerGlideV15-Flat-MicroDuck). - Evaluate:
scripts/eval_roulade_entry.py,scripts/eval_roller_slalom.py,scripts/eval_single_blade.py; sweep every checkpoint of a run withscripts/sweep_hf_checkpoints.py. - Run a policy in the CPU simulator:
uv run scripts/infer_policy.py --walking policies/<file>.onnx --new-cmd-obs.
The lesson worth exporting
Training reward is not a selection criterion: in every run the held-out deployment battery (hand-off from the walking policy, physical cones, standing / rolling starts) moved independently of the training curves, and checkpoints were picked only by that battery. For the single-blade glide the decisive step was a zero-cost physics probe before any further training: a model-based controller with the full state and a sampling MPC with the perfect model both top out at β 1 s of true single support, so the target was redefined to what the hardware can do.
Simulator results only; nothing here has been run on the physical robot yet. License follows the upstream repository.

