dashi commited on
Commit
f7ce10c
·
verified ·
1 Parent(s): d91181d

publish backroll: perpetual, Mjlab-GotATalent-MicroDuck

Browse files
Files changed (5) hide show
  1. README.md +47 -0
  2. checkpoint.pt +3 -0
  3. manifest.json +58 -0
  4. policy.onnx +3 -0
  5. 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
+ }