microduck-stilts
Eight MicroDuck forward-walking policies specialized to blend-0.50 stilts
from 10 cm to 2.0 m. Every row has its own complete silent 10-second
video, ONNX deployment graph, and continuation checkpoint.
The root policy.onnx, manifest.json, and replay.mp4 are convenient
aliases for the 10 cm default variant. The height-specific directories
remain the authoritative files for all eight variants.
Stilt hardware gallery
<table>
<tr>
<td align="center"><img src="media/stilts_front.png" width="230" alt="Green 10 cm stilts, front view"><br><sub>Front</sub></td>
<td align="center"><img src="media/stilts_three_quarter.png" width="230" alt="Green 10 cm stilts, three-quarter view"><br><sub>Three-quarter</sub></td>
<td align="center"><img src="media/stilts_side.png" width="230" alt="Green 10 cm stilts, side view"><br><sub>Side</sub></td>
<td align="center"><img src="media/printed_stilt.jpg" width="230" alt="Green 3D-printed MicroDuck replacement sole and stilt prototype"><br><sub>3D-printed prototype</sub></td>
</tr>
</table>
<table>
<thead>
<tr><th>Height</th><th>Full policy rollout</th><th>Files</th></tr>
</thead>
<tbody>
<tr>
<td><strong>10 cm</strong><br><sub>iteration 2,200</sub></td>
<td><video src="https://huggingface.co/HannesVonEssen/microduck-stilts/resolve/main/10cm/preview.mp4" width="360" controls autoplay loop muted playsinline preload="metadata"></video><br><a href="10cm/preview.mp4">Open silent MP4</a></td>
<td><a href="10cm/policy.onnx">ONNX</a> · <a href="10cm/checkpoint.pt">checkpoint</a> · <a href="10cm/manifest.json">manifest</a> · <a href="https://github.com/Vottivott/microduck-playground/blob/c5fcc50219fef01ac9931d0079c583ccbb29b689/hardware/stilts/generated/release/direct_replacement_pair_b0p50_h10p0cm.stl">3D print</a></td>
</tr>
<tr>
<td><strong>15 cm</strong><br><sub>iteration 2,400</sub></td>
<td><video src="https://huggingface.co/HannesVonEssen/microduck-stilts/resolve/main/15cm/preview.mp4" width="360" controls autoplay loop muted playsinline preload="metadata"></video><br><a href="15cm/preview.mp4">Open silent MP4</a></td>
<td><a href="15cm/policy.onnx">ONNX</a> · <a href="15cm/checkpoint.pt">checkpoint</a> · <a href="15cm/manifest.json">manifest</a> · <a href="https://github.com/Vottivott/microduck-playground/blob/c5fcc50219fef01ac9931d0079c583ccbb29b689/hardware/stilts/generated/release/direct_replacement_pair_b0p50_h15p0cm.stl">3D print</a></td>
</tr>
<tr>
<td><strong>20 cm</strong><br><sub>iteration 2,600</sub></td>
<td><video src="https://huggingface.co/HannesVonEssen/microduck-stilts/resolve/main/20cm/preview.mp4" width="360" controls autoplay loop muted playsinline preload="metadata"></video><br><a href="20cm/preview.mp4">Open silent MP4</a></td>
<td><a href="20cm/policy.onnx">ONNX</a> · <a href="20cm/checkpoint.pt">checkpoint</a> · <a href="20cm/manifest.json">manifest</a> · <a href="https://github.com/Vottivott/microduck-playground/blob/c5fcc50219fef01ac9931d0079c583ccbb29b689/hardware/stilts/generated/release/direct_replacement_pair_b0p50_h20p0cm.stl">3D print</a></td>
</tr>
<tr>
<td><strong>25 cm</strong><br><sub>iteration 2,800</sub></td>
<td><video src="https://huggingface.co/HannesVonEssen/microduck-stilts/resolve/main/25cm/preview.mp4" width="360" controls autoplay loop muted playsinline preload="metadata"></video><br><a href="25cm/preview.mp4">Open silent MP4</a></td>
<td><a href="25cm/policy.onnx">ONNX</a> · <a href="25cm/checkpoint.pt">checkpoint</a> · <a href="25cm/manifest.json">manifest</a> · <a href="https://github.com/Vottivott/microduck-playground/blob/c5fcc50219fef01ac9931d0079c583ccbb29b689/hardware/stilts/generated/release/direct_replacement_pair_b0p50_h25p0cm.stl">3D print</a></td>
</tr>
<tr>
<td><strong>50 cm</strong><br><sub>iteration 3,400</sub></td>
<td><video src="https://huggingface.co/HannesVonEssen/microduck-stilts/resolve/main/50cm/preview.mp4" width="360" controls autoplay loop muted playsinline preload="metadata"></video><br><a href="50cm/preview.mp4">Open silent MP4</a></td>
<td><a href="50cm/policy.onnx">ONNX</a> · <a href="50cm/checkpoint.pt">checkpoint</a> · <a href="50cm/manifest.json">manifest</a> · <a href="https://github.com/Vottivott/microduck-playground/blob/c5fcc50219fef01ac9931d0079c583ccbb29b689/hardware/stilts/generated/release/direct_replacement_pair_b0p50_h50p0cm.stl">3D print</a></td>
</tr>
<tr>
<td><strong>1.0 m</strong><br><sub>iteration 4,000</sub></td>
<td><video src="https://huggingface.co/HannesVonEssen/microduck-stilts/resolve/main/100cm/preview.mp4" width="360" controls autoplay loop muted playsinline preload="metadata"></video><br><a href="100cm/preview.mp4">Open silent MP4</a></td>
<td><a href="100cm/policy.onnx">ONNX</a> · <a href="100cm/checkpoint.pt">checkpoint</a> · <a href="100cm/manifest.json">manifest</a> · <a href="https://github.com/Vottivott/microduck-playground/blob/c5fcc50219fef01ac9931d0079c583ccbb29b689/hardware/stilts/generated/release/direct_replacement_pair_b0p50_h100p0cm.stl">3D print</a></td>
</tr>
<tr>
<td><strong>1.4 m</strong><br><sub>iteration 4,300</sub></td>
<td><video src="https://huggingface.co/HannesVonEssen/microduck-stilts/resolve/main/140cm/preview.mp4" width="360" controls autoplay loop muted playsinline preload="metadata"></video><br><a href="140cm/preview.mp4">Open silent MP4</a></td>
<td><a href="140cm/policy.onnx">ONNX</a> · <a href="140cm/checkpoint.pt">checkpoint</a> · <a href="140cm/manifest.json">manifest</a> · <a href="https://github.com/Vottivott/microduck-playground/blob/c5fcc50219fef01ac9931d0079c583ccbb29b689/hardware/stilts/generated/release/direct_replacement_pair_b0p50_h140p0cm.stl">3D print</a></td>
</tr>
<tr>
<td><strong>2.0 m</strong><br><sub>iteration 6,500</sub></td>
<td><video src="https://huggingface.co/HannesVonEssen/microduck-stilts/resolve/main/200cm/preview.mp4" width="360" controls autoplay loop muted playsinline preload="metadata"></video><br><a href="200cm/preview.mp4">Open silent MP4</a></td>
<td><a href="200cm/policy.onnx">ONNX</a> · <a href="200cm/checkpoint.pt">checkpoint</a> · <a href="200cm/manifest.json">manifest</a> · <a href="https://github.com/Vottivott/microduck-playground/blob/c5fcc50219fef01ac9931d0079c583ccbb29b689/hardware/stilts/generated/release/direct_replacement_pair_b0p50_h200p0cm.stl">3D print</a></td>
</tr>
</tbody>
</table>
All videos show alternating stilt support for the full horizon without reset
or auxiliary body contact. These are simulation experiments, not
hardware-validated policies. The 50 cm–2.0 m variants are extreme controller
research results, not recommendations for monolithic printed hardware.
The simulation mass law is 12 g + 1 g/cm per stilt. The 10 cm policy was
trained at 22 g per stilt; the prototype slicer estimate is about 29 g per
stilt. The unchanged actor survived an initial 64-environment, 10-second
simulation battery at 29 g, but broader mass-randomized continuation and
tethered hardware testing are still required. See the exact mass audit.
Matching geometry and source
Training code, the executed curriculum, and left/right/paired STLs for every
released height are in
Vottivott/microduck-playground
at commit
c5fcc50.
Run one policy
git clone https://github.com/Vottivott/microduck-playground.git
cd microduck-playground
git checkout c5fcc50219fef01ac9931d0079c583ccbb29b689
uv sync
hf download HannesVonEssen/microduck-stilts 25cm/policy.onnx config.json \
--local-dir policies/stilts
MICRODUCK_STILT_HEIGHT_CM=25 MICRODUCK_STILT_BLEND=0.5 \
uv run python scripts/infer_policy.py \
--walking policies/stilts/25cm/policy.onnx \
--new-cmd-obs --lin-vel-x 0.15
Continue training
Each checkpoint.pt preserves the exact released actor and normalizer. Because
the original stilt critic and optimizer snapshots were not retained, it uses a
fresh compatible critic scaffold, empty optimizer moments, 1e-5 learning
rate, and 0.1 exploration standard deviation. It is an actor-exact warm
start, not the original full PPO state.
mkdir -p logs/rsl_rl/stilt_locomotion/release-25cm
cp policies/stilts/25cm/checkpoint.pt \
logs/rsl_rl/stilt_locomotion/release-25cm/model_2800.pt
MICRODUCK_STILT_HEIGHT_CM=25 MICRODUCK_STILT_BLEND=0.5 \
uv run train Mjlab-Stilt-Flat-MicroDuck \
--agent.resume True \
--agent.load-run release-25cm \
--agent.load-checkpoint model_2800.pt \
--agent.max-iterations 100
See TRAINING.md for the full lineage, checkpoint caveat, and
promotion procedure. PyTorch checkpoints use pickle internally; load them only
from a repository and revision you trust.
Runtime contract
- input:
obs, float32 [1, 61]
- output:
actions, float32 [1, 14]
- control rate: 50 Hz
- action scale: 1.0 rad around MicroDuck HOME joint pose
- observation normalizer: baked into each ONNX
- command:
twist=[0.15, 0, 0], zero head/body commands
- morphology: matching height, blend 0.50, 17 × 22 mm rounded tips
The 3.0 m demonstration is intentionally absent: it was a zero-shot failure
of the unchanged 2.0 m policy, not a separately trained model.
<a href="https://hfviewer.com/HannesVonEssen/microduck-stilts?utm_source=huggingface&utm_medium=embedded_model_card&utm_campaign=HannesVonEssen__microduck-stilts_card&utm_content=embedded_card_open_viewer&from=embedded-model-card" target="_blank" rel="noopener">
<img
src="https://hfviewer.com/api/card.svg?source=HannesVonEssen%2Fmicroduck-stilts&granularity=auto&v=20260902-action-contract-r2"
alt="Architecture graph for HannesVonEssen/microduck-stilts. Open in hfviewer"
width="100%"
/>
</a>