Instructions to use dashi/microduck-backroll with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Microduck
How to use dashi/microduck-backroll with Microduck:
# Replace SLOT with the slot specified in the model card (walk, stand, sitstand, ground_pick, kick_left, kick_right, roulade). sudo robotctl policy load SLOT dashi/microduck-backroll
- Notebooks
- Google Colab
- Kaggle
publish backroll: perpetual, Mjlab-GotATalent-MicroDuck
Browse files- README.md +47 -0
- checkpoint.pt +3 -0
- manifest.json +58 -0
- policy.onnx +3 -0
- timeline.json +19 -0
README.md
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
tags:
|
| 3 |
+
- microduck
|
| 4 |
+
- robotics
|
| 5 |
+
- reinforcement-learning
|
| 6 |
+
- onnx
|
| 7 |
+
library_name: microduck
|
| 8 |
+
pipeline_tag: robotics
|
| 9 |
+
---
|
| 10 |
+
|
| 11 |
+
# backroll
|
| 12 |
+
|
| 13 |
+
Mjlab-GotATalent-MicroDuck
|
| 14 |
+
|
| 15 |
+
A **perpetual** policy for the [microduck](https://github.com/pollen-robotics/microduck) (61-D observation, 14 actions, 50 Hz). Runs until told otherwise — a gait, loaded into a policy slot.
|
| 16 |
+
|
| 17 |
+
## Run it on a robot
|
| 18 |
+
|
| 19 |
+
```bash
|
| 20 |
+
sudo robotctl policy load <slot> dashi/microduck-backroll
|
| 21 |
+
```
|
| 22 |
+
|
| 23 |
+
The observation normalizer is baked into `policy.onnx`; feed raw observations.
|
| 24 |
+
`manifest.json` follows schema 2 of the microduck policy manifest (`docs/policy-manifest.md` in the daemon repo).
|
| 25 |
+
|
| 26 |
+
## Training
|
| 27 |
+
|
| 28 |
+
- **task_id**: `Mjlab-GotATalent-MicroDuck`
|
| 29 |
+
- **repo**: `https://github.com/bxshi/microduck-challenges.git`
|
| 30 |
+
- **branch**: `HEAD`
|
| 31 |
+
- **commit**: `65971f273`
|
| 32 |
+
- **checkpoint**: `750`
|
| 33 |
+
- **seed**: `1`
|
| 34 |
+
- **base**: `mjlab-microduck 0.1.0 @ 8d0dbc94c`
|
| 35 |
+
- **started**: `2026-10-22T00:46:36Z`
|
| 36 |
+
|
| 37 |
+
## Reproduce
|
| 38 |
+
|
| 39 |
+
Same code, same `uv.lock`, same command, same seed. Training it again yields a comparable policy, not the same weights: GPU reinforcement learning is not bit-reproducible across machines.
|
| 40 |
+
|
| 41 |
+
```bash
|
| 42 |
+
git clone https://github.com/bxshi/microduck-challenges.git
|
| 43 |
+
cd microduck-challenges
|
| 44 |
+
git checkout 65971f273
|
| 45 |
+
uv sync
|
| 46 |
+
uv run train Mjlab-GotATalent-MicroDuck --env.scene.num-envs 4096 --agent.max-iterations 3000 --agent.seed 1 --agent.logger tensorboard --agent.run-name roll4
|
| 47 |
+
```
|
checkpoint.pt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:2d4eab17de4ee03eff19e88fa643482fe7b5bfc6c0a20763cce3bfd78c24957b
|
| 3 |
+
size 4849507
|
manifest.json
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_version": 2,
|
| 3 |
+
"model_api": 1,
|
| 4 |
+
"obs_len": 61,
|
| 5 |
+
"action_len": 14,
|
| 6 |
+
"robot": {
|
| 7 |
+
"model": "microduck",
|
| 8 |
+
"hw_rev": 1,
|
| 9 |
+
"servos": "xl330",
|
| 10 |
+
"control_hz": 50,
|
| 11 |
+
"accessories": []
|
| 12 |
+
},
|
| 13 |
+
"name": "backroll",
|
| 14 |
+
"kind": "perpetual",
|
| 15 |
+
"entry_pose": "standing",
|
| 16 |
+
"description": "Mjlab-GotATalent-MicroDuck",
|
| 17 |
+
"command": {
|
| 18 |
+
"encoding": "constant",
|
| 19 |
+
"idle": [
|
| 20 |
+
0.0,
|
| 21 |
+
0.0,
|
| 22 |
+
0.0
|
| 23 |
+
],
|
| 24 |
+
"twist": "[sit flag, held 0 (stand); roll trigger: a short pulse of 1 starts one backward roll and stand-up; unused]",
|
| 25 |
+
"head": "[neck_pitch, head_pitch, head_yaw, head_roll]: rad from the default pose",
|
| 26 |
+
"body": "unused (zeros)"
|
| 27 |
+
},
|
| 28 |
+
"duration_s": null,
|
| 29 |
+
"training": {
|
| 30 |
+
"repo": "https://github.com/bxshi/microduck-challenges.git",
|
| 31 |
+
"commit": "65971f273",
|
| 32 |
+
"branch": "HEAD",
|
| 33 |
+
"dirty": false,
|
| 34 |
+
"command": [
|
| 35 |
+
"train",
|
| 36 |
+
"Mjlab-GotATalent-MicroDuck",
|
| 37 |
+
"--env.scene.num-envs",
|
| 38 |
+
"4096",
|
| 39 |
+
"--agent.max-iterations",
|
| 40 |
+
"3000",
|
| 41 |
+
"--agent.seed",
|
| 42 |
+
"1",
|
| 43 |
+
"--agent.logger",
|
| 44 |
+
"tensorboard",
|
| 45 |
+
"--agent.run-name",
|
| 46 |
+
"roll4"
|
| 47 |
+
],
|
| 48 |
+
"seed": 1,
|
| 49 |
+
"base": "mjlab-microduck 0.1.0 @ 8d0dbc94c",
|
| 50 |
+
"started": "2026-10-22T00:46:36Z",
|
| 51 |
+
"task_id": "Mjlab-GotATalent-MicroDuck",
|
| 52 |
+
"checkpoint": 750,
|
| 53 |
+
"source_file": "model_750.pt"
|
| 54 |
+
},
|
| 55 |
+
"arena": {
|
| 56 |
+
"event": "got-a-talent"
|
| 57 |
+
}
|
| 58 |
+
}
|
policy.onnx
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:4e8ce68291e295faa20a5f1c4af88744dd629788f8370b3f78d04c252b54f809
|
| 3 |
+
size 793754
|
timeline.json
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"timeline_version": 1,
|
| 3 |
+
"duration_s": 20.0,
|
| 4 |
+
"keyframes": [
|
| 5 |
+
{"t": 0.0, "twist": [0, 0, 0], "head": [0, 0, 0, 0]},
|
| 6 |
+
{"t": 2.0, "twist": [0, 1, 0], "head": [0, 0, 0, 0]},
|
| 7 |
+
{"t": 2.6, "twist": [0, 0, 0], "head": [0, 0, 0, 0]},
|
| 8 |
+
{"t": 5.0, "twist": [0, 1, 0], "head": [0, 0, 0, 0]},
|
| 9 |
+
{"t": 5.6, "twist": [0, 0, 0], "head": [0, 0, 0, 0]},
|
| 10 |
+
{"t": 8.0, "twist": [0, 1, 0], "head": [0, 0, 0, 0]},
|
| 11 |
+
{"t": 8.6, "twist": [0, 0, 0], "head": [0, 0, 0, 0]},
|
| 12 |
+
{"t": 11.0, "twist": [0, 1, 0], "head": [0, 0, 0, 0]},
|
| 13 |
+
{"t": 11.6, "twist": [0, 0, 0], "head": [0, 0, 0, 0]},
|
| 14 |
+
{"t": 14.0, "twist": [0, 1, 0], "head": [0, 0, 0, 0]},
|
| 15 |
+
{"t": 14.6, "twist": [0, 0, 0], "head": [0, 0, 0, 0]},
|
| 16 |
+
{"t": 17.0, "twist": [0, 1, 0], "head": [0, 0, 0, 0]},
|
| 17 |
+
{"t": 17.6, "twist": [0, 0, 0], "head": [0, 0, 0, 0]}
|
| 18 |
+
]
|
| 19 |
+
}
|