HannesVonEssen commited on
Commit
af0e6b5
·
verified ·
1 Parent(s): 87e6fb0

Promote robust iteration 12195 running policy

Browse files
.gitattributes CHANGED
@@ -1,3 +1,6 @@
1
  *.onnx filter=lfs diff=lfs merge=lfs -text
2
  *.mp4 filter=lfs diff=lfs merge=lfs -text
3
 
 
 
 
 
1
  *.onnx filter=lfs diff=lfs merge=lfs -text
2
  *.mp4 filter=lfs diff=lfs merge=lfs -text
3
 
4
+ checkpoint.pt filter=lfs diff=lfs merge=lfs -text
5
+ legacy/iteration-8749/checkpoint.pt filter=lfs diff=lfs merge=lfs -text
6
+ lineage/iteration-11748/checkpoint.pt filter=lfs diff=lfs merge=lfs -text
README.md CHANGED
@@ -6,43 +6,53 @@ license: apache-2.0
6
 
7
  # microduck-running
8
 
9
- Run forward on flat ground with a stock MicroDuck. This is the iteration-8,749
10
- policy used in the run-into-mat video, not the later faster continuation.
 
 
11
 
12
- **Status: simulation only; not yet validated on hardware.** It is a sim-to-real
13
- candidate, not a hardware-ready claim. The policy reaches a mean 1.61 m/s
14
- body-forward speed at the recommended 1.80 m/s simulation command, but its
15
- heading control is still weak.
16
 
17
- ## Normal simulation rollout
18
 
19
  <video src="https://huggingface.co/HannesVonEssen/microduck-running/resolve/main/media/preview.mp4" width="720" controls autoplay loop muted playsinline preload="metadata"></video>
20
 
21
  [Open the full silent MP4](media/preview.mp4).
22
 
23
- ## Run-into-mat edit
24
 
25
  <video src="https://huggingface.co/HannesVonEssen/microduck-running/resolve/main/media/run-into-mat.mp4" controls loop muted playsinline></video>
26
 
27
  [Open the full silent run-into-mat MP4](media/run-into-mat.mp4).
28
 
29
- The second video uses the same running checkpoint, but the mat, full-body
30
- collision additions, fixed-camera treatment, post-impact motor cutoff, and
31
- sparks are scripted demonstration elements. The ONNX policy has no obstacle
32
- perception and did not learn to run into, react to, or stop at a mat. Both
33
- videos are silent.
 
 
 
 
 
 
 
 
34
 
35
  ## Command
36
 
37
  The 13-D command block is `[twist(3), head_pose(4), body_pose(6)]`.
38
 
39
- | slot | meaning |
40
  |---|---|
41
- | `twist[0]` | forward-velocity command; curriculum trained through 1.65 m/s, evaluated at 1.80 m/s |
42
- | `twist[1]` | lateral command; use 0 (only a tiny ±0.02 m/s range was seen in training) |
43
- | `twist[2]` | yaw-rate command; use 0 (only a tiny ±0.05 rad/s range was seen in training) |
44
- | `head_pose[0:4]` | unused for this policy; zeros |
45
- | `body_pose[0:6]` | unused for this policy; zeros |
46
 
47
  An exact-zero standing bucket made up 3% of training environments, so
48
  `twist = [0, 0, 0]` is the intended idle command. The speed objective rewards
@@ -51,35 +61,43 @@ limiter.
51
 
52
  ## Try it in simulation
53
 
54
- The matching training and evaluation source is in
55
- [`Vottivott/microduck-playground`](https://github.com/Vottivott/microduck-playground)
56
- at commit
57
- [`c5fcc50`](https://github.com/Vottivott/microduck-playground/commit/c5fcc50219fef01ac9931d0079c583ccbb29b689):
58
 
59
  ```bash
60
  git clone https://github.com/Vottivott/microduck-playground.git
61
  cd microduck-playground
62
- git checkout c5fcc50219fef01ac9931d0079c583ccbb29b689
63
  uv sync
64
 
65
  hf download HannesVonEssen/microduck-running policy.onnx config.json --local-dir policies/running
66
  uv run scripts/infer_policy.py \
67
  --walking policies/running/policy.onnx \
68
  --new-cmd-obs \
69
- --lin-vel-x 1.8
70
  ```
71
 
72
  ## Continue training
73
 
74
- `checkpoint.pt` is the complete iteration-8,749 PPO state used for
75
- this release: actor, critic, optimizer, observation normalizers, and curriculum
76
- counter. Place it at
77
- `logs/rsl_rl/running/release-8749/model_8749.pt`, then resume with:
78
 
79
  ```bash
 
 
 
 
 
 
 
 
 
 
 
 
80
  uv run train Mjlab-Running-Flat-MicroDuck \
81
- --agent.resume True --agent.load-run release-8749 \
82
- --agent.load-checkpoint model_8749.pt --agent.max-iterations 100
83
  ```
84
 
85
  PyTorch checkpoints use pickle internally; load them only from a repository
@@ -92,83 +110,84 @@ and revision you trust.
92
  - control rate: 50 Hz
93
  - action scale: 1.0, joint-position targets around MicroDuck HOME
94
  - observation normalizer: baked into `policy.onnx`
 
95
  - entry pose: standing
96
  - robot: MicroDuck hardware revision 1, 14 Dynamixel XL330 servos
97
- - policy type: perpetual flat-ground locomotion
 
 
 
 
98
 
99
  ## Simulation evaluation
100
 
101
- At a 1.80 m/s forward command over 256 randomized environments for 8 seconds:
 
 
 
 
 
 
 
 
 
102
 
103
- | metric | result |
104
- |---|---:|
105
- | survival | 99.22% |
106
- | mean body-forward speed | 1.6073 m/s |
107
- | mean displacement speed along initial heading | 1.3277 m/s |
108
- | mean absolute heading error | 25.22° |
109
- | mean absolute lateral displacement | 3.87 m |
110
- | flight fraction | 65.72% |
111
 
112
- At a 2.00 m/s extrapolated command, mean body-forward speed rose only to
113
- 1.6452 m/s while survival fell to 93.36%. Do not treat a higher command as a
114
- safe route to higher speed. The `1.6 m/s` video label is the measured
115
- simulation body-forward mean at the 1.80 m/s command; it is not a real-hardware
116
- measurement. `WALKING BASELINE 0.4 m/s` refers to the walking task's configured
117
- command ceiling, not a matched measured baseline.
118
 
119
- ## Sim-to-real constraints
120
 
121
- The run kept important deployment-oriented modeling from the MicroDuck walking
122
- recipe:
123
 
124
- - BAM XL330 M6 voltage control, back-EMF, current limiting, battery variation
125
- from 6.5–8.2 V, and load-dependent voltage sag;
126
  - 3–6 physics-step actuator delay, 0–1-step IMU delay, and one-control-step
127
  joint-velocity lag;
128
  - foot friction randomized from 0.7–1.3;
129
- - trunk mass/inertia ±5%, trunk and head CoM ±3 mm, armature ±10%, and BAM
130
- joint friction ±10%;
131
- - joint encoder bias ±0.015 rad, IMU mounting misalignment up to 6°, and actor
132
- observation noise.
133
-
134
- To discover a fast gait, it deliberately relaxed several constraints relative
135
- to the general walking recipe:
136
-
137
- - flat terrain only and no random push disturbances;
138
- - the non-backlash robot model;
139
- - no curricula widening trunk/head CoM or head/body pose-command ranges;
140
- - weaker upright, pose, angular-motion, foot-slip, and action-rate
141
- regularization; head/body pose tracking disabled;
142
- - motor-gain randomization and randomized initial base tilt were already
143
- disabled in the inherited base recipe.
144
-
145
- This combination makes transfer plausible, not proven. The main known concerns
146
- are impact loading, unmodeled gearbox backlash/compliance, real foot contact,
147
- heading drift, and the relaxed robustness training.
148
 
149
  ## Hardware safety
150
 
151
  For a first robot test, use a support/catch rig, keep a remote torque-off path,
152
  start with low commands and ramp conservatively, and log servo current,
153
  temperature, voltage, fall state, and commanded/applied twist. Do not begin at
154
- 1.80 m/s. Stop on repeated saturation, overheating, unexpected oscillation, or
155
  systematic forward pitching.
156
 
157
  ## Provenance and files
158
 
159
- Training task `Mjlab-Running-Flat-MicroDuck`; PPO with `rsl_rl`; run
160
- `sweep-speed-r1`; checkpoint iteration 8,749. Source:
161
- [`Vottivott/microduck-playground@c5fcc50`](https://github.com/Vottivott/microduck-playground/commit/c5fcc50219fef01ac9931d0079c583ccbb29b689),
162
  based on
163
  [`pollen-robotics/microduck_rl@d424a0c`](https://github.com/pollen-robotics/microduck_rl/commit/d424a0c899f6b33cbd3daeb279913134349c0b63).
164
  Exported with `scripts/export.py`, which bakes the observation normalizer into
165
  the ONNX graph.
166
 
167
- - `policy.onnx` — deployment policy
168
- - `checkpoint.pt` — resumable PPO checkpoint
169
  - `manifest.json` — machine-readable contract, evaluation, and provenance
170
- - `media/preview.mp4` — normal 10-second close rollout
171
- - `media/run-into-mat.mp4` — scripted 8-second crash-mat demonstration
 
 
 
172
  - `SHA256SUMS` — artifact integrity hashes
173
 
174
  Format inspired by
@@ -176,7 +195,7 @@ Format inspired by
176
 
177
  <a href="https://hfviewer.com/HannesVonEssen/microduck-running?utm_source=huggingface&amp;utm_medium=embedded_model_card&amp;utm_campaign=HannesVonEssen__microduck-running_card&amp;utm_content=embedded_card_open_viewer&amp;from=embedded-model-card" target="_blank" rel="noopener">
178
  <img
179
- src="https://hfviewer.com/api/card.svg?source=HannesVonEssen%2Fmicroduck-running&amp;granularity=auto&amp;v=20260902-action-contract-r2"
180
  alt="Architecture graph for HannesVonEssen/microduck-running. Open in hfviewer"
181
  width="100%"
182
  />
 
6
 
7
  # microduck-running
8
 
9
+ A robustified forward-running policy for the stock MicroDuck on flat ground.
10
+ The default artifact is iteration **12,195**, continued from the 1.687 m/s
11
+ speed frontier with progressively stronger velocity pushes, centre-of-mass
12
+ variation, and initial tilt.
13
 
14
+ **Status: simulation-only hardware candidate; not validated on hardware.** It
15
+ retains 1.651 m/s mean body-forward speed in the nominal simulation battery and
16
+ 1.612 m/s under the combined backlash-plus-disturbance battery. Heading and
17
+ lateral drift remain substantial.
18
 
19
+ ## Normal simulation rollout — iteration 12,195
20
 
21
  <video src="https://huggingface.co/HannesVonEssen/microduck-running/resolve/main/media/preview.mp4" width="720" controls autoplay loop muted playsinline preload="metadata"></video>
22
 
23
  [Open the full silent MP4](media/preview.mp4).
24
 
25
+ ## Run-into-mat edit — legacy iteration 8,749
26
 
27
  <video src="https://huggingface.co/HannesVonEssen/microduck-running/resolve/main/media/run-into-mat.mp4" controls loop muted playsinline></video>
28
 
29
  [Open the full silent run-into-mat MP4](media/run-into-mat.mp4).
30
 
31
+ The mat video uses the preserved iteration-8,749 controller, not the new root
32
+ policy. Its obstacle, collision augmentation, camera treatment, post-impact
33
+ motor cutoff, and sparks are scripted demonstration elements. The policy has
34
+ no obstacle perception and did not learn to react to a mat. Both videos are
35
+ silent.
36
+
37
+ ## Versions
38
+
39
+ | Role | Iteration | Files | Note |
40
+ |---|---:|---|---|
41
+ | Default robust candidate | 12,195 | [`policy.onnx`](policy.onnx), [`checkpoint.pt`](checkpoint.pt) | Recommended starting point for further simulation and cautious hardware research |
42
+ | Speed-focused parent | 11,748 | [`lineage/iteration-11748/`](lineage/iteration-11748/) | 1.687 m/s frontier used to start robustification |
43
+ | Legacy mat-video policy | 8,749 | [`legacy/iteration-8749/`](legacy/iteration-8749/) | Exact controller used in the run-into-mat edit |
44
 
45
  ## Command
46
 
47
  The 13-D command block is `[twist(3), head_pose(4), body_pose(6)]`.
48
 
49
+ | Slot | Meaning |
50
  |---|---|
51
+ | `twist[0]` | forward-velocity command; trained and evaluated through 2.20 m/s |
52
+ | `twist[1]` | lateral command; use 0 (only ±0.02 m/s was seen in training) |
53
+ | `twist[2]` | yaw-rate command; use 0 (only ±0.05 rad/s was seen in training) |
54
+ | `head_pose[0:4]` | unused; zeros |
55
+ | `body_pose[0:6]` | unused; zeros |
56
 
57
  An exact-zero standing bucket made up 3% of training environments, so
58
  `twist = [0, 0, 0]` is the intended idle command. The speed objective rewards
 
61
 
62
  ## Try it in simulation
63
 
64
+ The matching source is
65
+ [`Vottivott/microduck-playground@828d950`](https://github.com/Vottivott/microduck-playground/commit/828d950134e29a8d04cbb51720a22c8729047fb7):
 
 
66
 
67
  ```bash
68
  git clone https://github.com/Vottivott/microduck-playground.git
69
  cd microduck-playground
70
+ git checkout 828d950134e29a8d04cbb51720a22c8729047fb7
71
  uv sync
72
 
73
  hf download HannesVonEssen/microduck-running policy.onnx config.json --local-dir policies/running
74
  uv run scripts/infer_policy.py \
75
  --walking policies/running/policy.onnx \
76
  --new-cmd-obs \
77
+ --lin-vel-x 2.2
78
  ```
79
 
80
  ## Continue training
81
 
82
+ `checkpoint.pt` is the complete iteration-12,195 PPO state: actor, critic,
83
+ optimizer, observation normalizers, and curriculum counter.
 
 
84
 
85
  ```bash
86
+ mkdir -p logs/rsl_rl/running/release-12195
87
+ cp checkpoint.pt logs/rsl_rl/running/release-12195/model_12195.pt
88
+
89
+ MICRODUCK_RUNNING_TARGET_MAX_SPEED=2.2 \
90
+ MICRODUCK_RUNNING_SPEED_CAP=2.4 \
91
+ MICRODUCK_RUNNING_HIGH_SPEED_STAGE_INTERVAL=750 \
92
+ MICRODUCK_RUNNING_ACTION_RATE_WEIGHT=-0.10 \
93
+ MICRODUCK_RUNNING_FORWARD_PROGRESS_WEIGHT=5.0 \
94
+ MICRODUCK_RUNNING_ROBUST_PUSH_MPS=0.10 \
95
+ MICRODUCK_RUNNING_ROBUST_TRUNK_COM_M=0.008 \
96
+ MICRODUCK_RUNNING_ROBUST_HEAD_COM_M=0.006 \
97
+ MICRODUCK_RUNNING_ROBUST_INITIAL_TILT_DEG=2.0 \
98
  uv run train Mjlab-Running-Flat-MicroDuck \
99
+ --agent.resume True --agent.load-run release-12195 \
100
+ --agent.load-checkpoint model_12195.pt --agent.max-iterations 100
101
  ```
102
 
103
  PyTorch checkpoints use pickle internally; load them only from a repository
 
110
  - control rate: 50 Hz
111
  - action scale: 1.0, joint-position targets around MicroDuck HOME
112
  - observation normalizer: baked into `policy.onnx`
113
+ - output clipping: none; training also used unclipped actor outputs
114
  - entry pose: standing
115
  - robot: MicroDuck hardware revision 1, 14 Dynamixel XL330 servos
116
+ - hardware modifications: none
117
+
118
+ Checkpoint-to-ONNX parity over zero and deterministic random observations had
119
+ a maximum absolute action error of 7.63e-6. See
120
+ [`eval/checkpoint-onnx-parity.json`](eval/checkpoint-onnx-parity.json).
121
 
122
  ## Simulation evaluation
123
 
124
+ All batteries used a 2.20 m/s command, 1-second warm-up, and 10-second
125
+ measurement horizon.
126
+
127
+ | Evaluation | Environments | Body-forward speed | Survival |
128
+ |---|---:|---:|---:|
129
+ | Ordinary model, nominal | 512 | 1.651 m/s | 99.22% |
130
+ | Ordinary model, push/CoM/tilt stress | 512 | 1.635 m/s | 98.83% |
131
+ | Backlash model, nominal | 256 | 1.636 m/s | 98.83% |
132
+ | Backlash model, push/CoM/tilt stress | 256 | 1.612 m/s | 98.44% |
133
+ | High grip plus full stress | 512 | 1.642 m/s | 96.68% |
134
 
135
+ Stress means ±0.10 m/s planar pushes every 3–6 seconds, ±10 mm trunk CoM,
136
+ ±6 mm head CoM, and ±2° initial pitch/roll. The high-grip case widens foot
137
+ friction from 0.7–1.3 to 0.7–1.8. Raw outputs are under [`eval/`](eval/).
 
 
 
 
 
138
 
139
+ The candidate was trained with the ordinary robot model, then evaluated
140
+ unchanged with the backlash model. A separately backlash-trained continuation
141
+ performed worse and was rejected. Robustification costs about 2.1% nominal
142
+ speed relative to iteration 11,748 but gives the stronger overall release.
 
 
143
 
144
+ ## Sim-to-real boundary
145
 
146
+ The policy retains substantial deployment-oriented modeling:
 
147
 
148
+ - BAM XL330 M6 voltage control, back-EMF, current limiting, 6.5–8.2 V battery
149
+ variation, and load-dependent sag;
150
  - 3–6 physics-step actuator delay, 0–1-step IMU delay, and one-control-step
151
  joint-velocity lag;
152
  - foot friction randomized from 0.7–1.3;
153
+ - trunk mass/inertia ±5%, armature ±10%, BAM joint friction ±10%, encoder bias
154
+ ±0.015 rad, IMU misalignment up to 6°, and actor-observation noise;
155
+ - in the final stage: ±0.10 m/s pushes, ±8 mm trunk CoM, ±6 mm head CoM, and
156
+ ±2° initial pitch/roll.
157
+
158
+ Important remaining relaxations are flat terrain, ordinary non-backlash
159
+ training, disabled head/body pose tracking, weaker posture and angular-motion
160
+ regularization, and no motor-gain randomization. Backlash was tested, not part
161
+ of the selected policy's training distribution. Transfer is plausible, not
162
+ proven; heading drift, impact loading, real contact, servo thermal limits, and
163
+ unmodeled compliance remain concerns.
 
 
 
 
 
 
 
 
164
 
165
  ## Hardware safety
166
 
167
  For a first robot test, use a support/catch rig, keep a remote torque-off path,
168
  start with low commands and ramp conservatively, and log servo current,
169
  temperature, voltage, fall state, and commanded/applied twist. Do not begin at
170
+ 2.20 m/s. Stop on repeated saturation, overheating, unexpected oscillation, or
171
  systematic forward pitching.
172
 
173
  ## Provenance and files
174
 
175
+ Training task `Mjlab-Running-Flat-MicroDuck`; PPO with `rsl_rl`; checkpoint
176
+ iteration 12,195. Source:
177
+ [`Vottivott/microduck-playground@828d950`](https://github.com/Vottivott/microduck-playground/commit/828d950134e29a8d04cbb51720a22c8729047fb7),
178
  based on
179
  [`pollen-robotics/microduck_rl@d424a0c`](https://github.com/pollen-robotics/microduck_rl/commit/d424a0c899f6b33cbd3daeb279913134349c0b63).
180
  Exported with `scripts/export.py`, which bakes the observation normalizer into
181
  the ONNX graph.
182
 
183
+ - `policy.onnx` — default robust deployment policy
184
+ - `checkpoint.pt` — default resumable PPO checkpoint
185
  - `manifest.json` — machine-readable contract, evaluation, and provenance
186
+ - `eval/` — raw evaluation records and checkpoint/ONNX parity record
187
+ - `media/preview.mp4` — robust policy's 10-second close rollout
188
+ - `media/run-into-mat.mp4` — scripted legacy iteration-8,749 demonstration
189
+ - `lineage/iteration-11748/` — speed-parent model, checkpoint, video, and evals
190
+ - `legacy/iteration-8749/` — exact mat-video policy, checkpoint, and clean video
191
  - `SHA256SUMS` — artifact integrity hashes
192
 
193
  Format inspired by
 
195
 
196
  <a href="https://hfviewer.com/HannesVonEssen/microduck-running?utm_source=huggingface&amp;utm_medium=embedded_model_card&amp;utm_campaign=HannesVonEssen__microduck-running_card&amp;utm_content=embedded_card_open_viewer&amp;from=embedded-model-card" target="_blank" rel="noopener">
197
  <img
198
+ src="https://hfviewer.com/api/card.svg?source=HannesVonEssen%2Fmicroduck-running&amp;granularity=auto&amp;v=20260903-robust12195"
199
  alt="Architecture graph for HannesVonEssen/microduck-running. Open in hfviewer"
200
  width="100%"
201
  />
SHA256SUMS CHANGED
@@ -1,7 +1,23 @@
1
- 66a9b4ca82dbfe1376989b1f25ab382c276b31dfe96631a86447afc8e65e74ef README.md
2
- ce7707c985d84affda1befec172a8c0a72fafaa4d3476a26bec11dde9199907f checkpoint.pt
3
- d8923f68f7275cacaf2c436e8b222af3f9ea9b98485a4d4387865a0daabac71d config.json
4
- 1907518687eaccf35ef242da3326873b4c7849e31dd0dc0a677f747fc5b6a8f3 manifest.json
5
- 69ce8b5f8855ac76d2413d90b176e770d22d22a72766dcc2dacf34ccbded58d6 media/preview.mp4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6
  13f3eaf36601928125a001c1e5f444285a7294b70dc53a186da195d8cb50bc9a media/run-into-mat.mp4
7
- b4e285fb3671f52c28f671bd4733a4e11fa17c21f40d25f52eaf2614f9e2e02a policy.onnx
 
1
+ 69c602a90098db9642a213367371153a8451e0b66e21eb48d682853f411e5d97 README.md
2
+ 052f6df6683fdae83deb369b7f2c7d13e45f87ed2907adee6e23b1ebf9dfe973 checkpoint.pt
3
+ a9a1e9058642980c5f33b6c9d1ad54f513292429dc3dc57dcea8d3f6f2dc5950 config.json
4
+ d7a92e6ed3b48e72a07973ada6b74f3611bba38aaa8af9747ba0dabaa6ef12e0 eval/checkpoint-onnx-parity.json
5
+ f65329ffd1cfe990c244390ae076532537daee530832cf993f84d95b53e30c78 eval/high-grip-plain.json
6
+ eafe79f0f32f0430efb13bc95bb5896d8aaf1bff575a5dc973ba30aaa2f9d162 eval/nominal-backlash.json
7
+ ef08a1b9c1d4ac51e50d119197d2406d3352b31d7e986190449f7be058ac7236 eval/nominal-plain.json
8
+ 16918366d4208f433eabd3c24a1e57ae8923ab9fb064e70328347e64b5fd65b7 eval/released_12195.json
9
+ a9934320b9f4bf29ff4304ec48be01c519540188cfb679b945a13721de83cb24 eval/stress-backlash.json
10
+ abdb838ea7c4795451e97ddb27870404189f53fb1032084fa517a24e674df098 eval/stress-plain.json
11
+ ce7707c985d84affda1befec172a8c0a72fafaa4d3476a26bec11dde9199907f legacy/iteration-8749/checkpoint.pt
12
+ 1907518687eaccf35ef242da3326873b4c7849e31dd0dc0a677f747fc5b6a8f3 legacy/iteration-8749/manifest.json
13
+ 69ce8b5f8855ac76d2413d90b176e770d22d22a72766dcc2dacf34ccbded58d6 legacy/iteration-8749/media/preview.mp4
14
+ b4e285fb3671f52c28f671bd4733a4e11fa17c21f40d25f52eaf2614f9e2e02a legacy/iteration-8749/policy.onnx
15
+ 1e79df200d8bb19b139ee1e74e6910c62434d57e792f632b66b10a73266894eb lineage/iteration-11748/checkpoint.pt
16
+ a81a468c789b890f935e14f478f992c632b01eeb25179da7d3ba252d663625be lineage/iteration-11748/evaluations.tar.gz
17
+ 04eccc1fe13a8d00c813cac78e7ada8df65ab3b317757a0b2d0a4ac35574ca8f lineage/iteration-11748/manifest.json
18
+ ccd6757b53b591081fdf75dd3effe9a5743f5fac0c2a513fa48dfd5a32231b65 lineage/iteration-11748/policy.onnx
19
+ 256ad675984d544204076986a7e09ea3a66c6070ec15ffb52921212e685e898c lineage/iteration-11748/preview.mp4
20
+ 0ef9f79b9105ed28c8b4d718dd669541de6dc906493732c5357e87a8cc92a0a3 manifest.json
21
+ 942f0802cc0c6795769bd99a9991f866fee682890ea9ea6d71077f7d4eb5492b media/preview.mp4
22
  13f3eaf36601928125a001c1e5f444285a7294b70dc53a186da195d8cb50bc9a media/run-into-mat.mp4
23
+ 007707dd7779b2756ded67c58b2e9f94fe5071794a48c2b5a20d5f8d841efbeb policy.onnx
checkpoint.pt CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:ce7707c985d84affda1befec172a8c0a72fafaa4d3476a26bec11dde9199907f
3
- size 4843445
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:052f6df6683fdae83deb369b7f2c7d13e45f87ed2907adee6e23b1ebf9dfe973
3
+ size 4843527
config.json CHANGED
@@ -8,6 +8,7 @@
8
  "observation_size": 61,
9
  "action_size": 14,
10
  "control_frequency_hz": 50,
 
11
  "source_repository": "Vottivott/microduck-playground",
12
- "source_revision": "c5fcc50219fef01ac9931d0079c583ccbb29b689"
13
  }
 
8
  "observation_size": 61,
9
  "action_size": 14,
10
  "control_frequency_hz": 50,
11
+ "checkpoint_iteration": 12195,
12
  "source_repository": "Vottivott/microduck-playground",
13
+ "source_revision": "828d950134e29a8d04cbb51720a22c8729047fb7"
14
  }
eval/checkpoint-onnx-parity.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint_iteration": 12195,
3
+ "checkpoint_sha256": "052f6df6683fdae83deb369b7f2c7d13e45f87ed2907adee6e23b1ebf9dfe973",
4
+ "onnx_sha256": "007707dd7779b2756ded67c58b2e9f94fe5071794a48c2b5a20d5f8d841efbeb",
5
+ "input_shape": [1, 61],
6
+ "output_shape": [1, 14],
7
+ "samples": "zero plus deterministic random observations",
8
+ "max_absolute_error": 0.00000762939453125,
9
+ "mean_absolute_error": 0.000000862,
10
+ "observation_normalizer_embedded": true,
11
+ "training_action_clipping": false,
12
+ "onnx_output_clip": false
13
+ }
eval/high-grip-plain.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "absolute_lateral_displacement_m": {
3
+ "mean": 6.934412002563477,
4
+ "median": 7.661316394805908,
5
+ "p90": 11.148153305053711
6
+ },
7
+ "actor_observation_dim": 61,
8
+ "checkpoint": "/net/gcp/cloud-storage/europe-west/training/hannes/microduck_running/20260830-hardware-robust/v2-mild-r2/stage-c/checkpoint.pt",
9
+ "command_speed_mps": 2.2,
10
+ "duration_s": 10.0,
11
+ "final_absolute_heading_error_deg": {
12
+ "mean": 75.98717957309084,
13
+ "median": 70.41698272002702,
14
+ "p90": 149.06419312575767
15
+ },
16
+ "flight_events_per_second": 6.993881702423096,
17
+ "flight_fraction": 0.6284358501434326,
18
+ "forward_speed_mps": {
19
+ "clean_survivor_mean": 1.6467944383621216,
20
+ "mean": 1.6424154043197632,
21
+ "median": 1.6616889238357544,
22
+ "p10": 1.4980621337890625,
23
+ "p90": 1.7803144454956055
24
+ },
25
+ "initial_heading_displacement_speed_mps": {
26
+ "mean": 1.0247559547424316,
27
+ "median": 1.148021936416626,
28
+ "p10": 0.19742903113365173
29
+ },
30
+ "max_tilt_deg_median": 16.086403476606087,
31
+ "mean_absolute_heading_error_deg": 42.492167524874674,
32
+ "mean_absolute_lateral_speed_mps": 0.10666095465421677,
33
+ "mean_absolute_yaw_rate_radps": 1.3615901470184326,
34
+ "num_envs": 512,
35
+ "survival_fraction": 0.966796875,
36
+ "task_id": "Mjlab-Running-Flat-MicroDuck"
37
+ }
eval/nominal-backlash.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "absolute_lateral_displacement_m": {
3
+ "mean": 6.03297233581543,
4
+ "median": 6.301413536071777,
5
+ "p90": 10.287883758544922
6
+ },
7
+ "actor_observation_dim": 61,
8
+ "checkpoint": "/net/gcp/cloud-storage/europe-west/training/hannes/microduck_running/20260830-hardware-robust/v2-mild-r2/stage-c/checkpoint.pt",
9
+ "command_speed_mps": 2.2,
10
+ "duration_s": 10.0,
11
+ "final_absolute_heading_error_deg": {
12
+ "mean": 63.66170706483097,
13
+ "median": 57.51983703861542,
14
+ "p90": 133.31073063533844
15
+ },
16
+ "flight_events_per_second": 7.0286455154418945,
17
+ "flight_fraction": 0.6461542844772339,
18
+ "forward_speed_mps": {
19
+ "clean_survivor_mean": 1.6365820169448853,
20
+ "mean": 1.6362495422363281,
21
+ "median": 1.64719820022583,
22
+ "p10": 1.515997052192688,
23
+ "p90": 1.7456064224243164
24
+ },
25
+ "initial_heading_displacement_speed_mps": {
26
+ "mean": 1.1968926191329956,
27
+ "median": 1.324066162109375,
28
+ "p10": 0.6039830446243286
29
+ },
30
+ "max_tilt_deg_median": 15.47616364030588,
31
+ "mean_absolute_heading_error_deg": 32.83215926473935,
32
+ "mean_absolute_lateral_speed_mps": 0.09709258377552032,
33
+ "mean_absolute_yaw_rate_radps": 1.5131072998046875,
34
+ "num_envs": 256,
35
+ "survival_fraction": 0.98828125,
36
+ "task_id": "Mjlab-Running-Flat-Backlash-MicroDuck"
37
+ }
eval/nominal-plain.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "absolute_lateral_displacement_m": {
3
+ "mean": 5.830930709838867,
4
+ "median": 6.121419906616211,
5
+ "p90": 10.318323135375977
6
+ },
7
+ "actor_observation_dim": 61,
8
+ "checkpoint": "/net/gcp/cloud-storage/europe-west/training/hannes/microduck_running/20260830-hardware-robust/v2-mild-r2/stage-c/checkpoint.pt",
9
+ "command_speed_mps": 2.2,
10
+ "duration_s": 10.0,
11
+ "final_absolute_heading_error_deg": {
12
+ "mean": 59.87216784914615,
13
+ "median": 52.358908535713354,
14
+ "p90": 119.16307293954588
15
+ },
16
+ "flight_events_per_second": 7.0729241371154785,
17
+ "flight_fraction": 0.6566617488861084,
18
+ "forward_speed_mps": {
19
+ "clean_survivor_mean": 1.6519087553024292,
20
+ "mean": 1.6510932445526123,
21
+ "median": 1.6662672758102417,
22
+ "p10": 1.5096769332885742,
23
+ "p90": 1.760268211364746
24
+ },
25
+ "initial_heading_displacement_speed_mps": {
26
+ "mean": 1.2437968254089355,
27
+ "median": 1.3523855209350586,
28
+ "p10": 0.7378867864608765
29
+ },
30
+ "max_tilt_deg_median": 15.38079883156687,
31
+ "mean_absolute_heading_error_deg": 31.326498703723402,
32
+ "mean_absolute_lateral_speed_mps": 0.09913850575685501,
33
+ "mean_absolute_yaw_rate_radps": 1.3830451965332031,
34
+ "num_envs": 512,
35
+ "survival_fraction": 0.9921875,
36
+ "task_id": "Mjlab-Running-Flat-MicroDuck"
37
+ }
eval/released_12195.json ADDED
@@ -0,0 +1,129 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 1,
3
+ "experiment": "running",
4
+ "policy": {
5
+ "huggingface_repo": "HannesVonEssen/microduck-running",
6
+ "checkpoint_iteration": 12195,
7
+ "resumed_from_iteration": 11748,
8
+ "policy_onnx_sha256": "007707dd7779b2756ded67c58b2e9f94fe5071794a48c2b5a20d5f8d841efbeb",
9
+ "checkpoint_pt_sha256": "052f6df6683fdae83deb369b7f2c7d13e45f87ed2907adee6e23b1ebf9dfe973"
10
+ },
11
+ "training": {
12
+ "task_id": "Mjlab-Running-Flat-MicroDuck",
13
+ "simulator": "mjlab / MuJoCo Warp",
14
+ "algorithm": "PPO (rsl_rl)",
15
+ "seed": 42,
16
+ "num_envs": 4096,
17
+ "common": {
18
+ "target_max_speed_m_s": 2.2,
19
+ "speed_reward_cap_m_s": 2.4,
20
+ "high_speed_stage_interval_iterations": 750,
21
+ "action_rate_reward_weight": -0.1,
22
+ "forward_progress_reward_weight": 5.0,
23
+ "symmetry_enabled": false,
24
+ "heading_feedback_enabled": false,
25
+ "push_interval_s": [3.0, 6.0],
26
+ "foot_friction_range": [0.7, 1.3]
27
+ },
28
+ "stages": [
29
+ {
30
+ "iterations": 100,
31
+ "push_velocity_m_s": 0.03,
32
+ "trunk_com_offset_m": 0.003,
33
+ "head_com_offset_m": 0.003,
34
+ "initial_pitch_roll_deg": 1.0
35
+ },
36
+ {
37
+ "iterations": 150,
38
+ "push_velocity_m_s": 0.06,
39
+ "trunk_com_offset_m": 0.005,
40
+ "head_com_offset_m": 0.005,
41
+ "initial_pitch_roll_deg": 1.5
42
+ },
43
+ {
44
+ "iterations": 200,
45
+ "push_velocity_m_s": 0.1,
46
+ "trunk_com_offset_m": 0.008,
47
+ "head_com_offset_m": 0.006,
48
+ "initial_pitch_roll_deg": 2.0
49
+ }
50
+ ]
51
+ },
52
+ "evaluation": {
53
+ "command_forward_m_s": 2.2,
54
+ "duration_s": 10.0,
55
+ "warmup_s": 1.0,
56
+ "cases": [
57
+ {
58
+ "name": "nominal",
59
+ "task_id": "Mjlab-Running-Flat-MicroDuck",
60
+ "num_envs": 512,
61
+ "survival_fraction": 0.9921875,
62
+ "mean_body_forward_speed_m_s": 1.6510932445526123,
63
+ "mean_initial_heading_displacement_speed_m_s": 1.2437968254089355,
64
+ "mean_absolute_heading_error_deg": 31.326498703723402
65
+ },
66
+ {
67
+ "name": "push-com-tilt-stress",
68
+ "task_id": "Mjlab-Running-Flat-MicroDuck",
69
+ "num_envs": 512,
70
+ "survival_fraction": 0.98828125,
71
+ "mean_body_forward_speed_m_s": 1.6349653005599976,
72
+ "mean_initial_heading_displacement_speed_m_s": 1.0107059478759766,
73
+ "mean_absolute_heading_error_deg": 43.2924983559655
74
+ },
75
+ {
76
+ "name": "backlash-nominal",
77
+ "task_id": "Mjlab-Running-Flat-Backlash-MicroDuck",
78
+ "num_envs": 256,
79
+ "survival_fraction": 0.98828125,
80
+ "mean_body_forward_speed_m_s": 1.6362495422363281,
81
+ "mean_initial_heading_displacement_speed_m_s": 1.1968926191329956,
82
+ "mean_absolute_heading_error_deg": 32.83215926473935
83
+ },
84
+ {
85
+ "name": "backlash-push-com-tilt-stress",
86
+ "task_id": "Mjlab-Running-Flat-Backlash-MicroDuck",
87
+ "num_envs": 256,
88
+ "survival_fraction": 0.984375,
89
+ "mean_body_forward_speed_m_s": 1.6121970415115356,
90
+ "mean_initial_heading_displacement_speed_m_s": 0.9829199910163879,
91
+ "mean_absolute_heading_error_deg": 43.80756975146533
92
+ },
93
+ {
94
+ "name": "high-grip-push-com-tilt-stress",
95
+ "task_id": "Mjlab-Running-Flat-MicroDuck",
96
+ "num_envs": 512,
97
+ "survival_fraction": 0.966796875,
98
+ "mean_body_forward_speed_m_s": 1.6424154043197632,
99
+ "mean_initial_heading_displacement_speed_m_s": 1.0247559547424316,
100
+ "mean_absolute_heading_error_deg": 42.492167524874674,
101
+ "foot_friction_range": [0.7, 1.8]
102
+ }
103
+ ],
104
+ "stress_definition": {
105
+ "push_velocity_m_s": 0.1,
106
+ "trunk_com_offset_m": 0.01,
107
+ "head_com_offset_m": 0.006,
108
+ "initial_pitch_roll_deg": 2.0
109
+ }
110
+ },
111
+ "checkpoint_onnx_parity": {
112
+ "observation_shape": [1, 61],
113
+ "action_shape": [1, 14],
114
+ "samples": "zero plus deterministic random observations",
115
+ "maximum_absolute_error": 0.00000762939453125,
116
+ "mean_absolute_error": 0.000000862,
117
+ "action_clipping_during_training": false,
118
+ "observation_normalizer_embedded": true
119
+ },
120
+ "media": {
121
+ "path": "../media/preview.mp4",
122
+ "sha256": "942f0802cc0c6795769bd99a9991f866fee682890ea9ea6d71077f7d4eb5492b",
123
+ "duration_s": 10.0,
124
+ "fps": 50,
125
+ "audio": false
126
+ },
127
+ "known_limit": "Heading and lateral drift remain substantial; this has not been validated on hardware.",
128
+ "status": "simulation-only-hardware-candidate"
129
+ }
eval/stress-backlash.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "absolute_lateral_displacement_m": {
3
+ "mean": 6.875430107116699,
4
+ "median": 7.540812969207764,
5
+ "p90": 11.18838882446289
6
+ },
7
+ "actor_observation_dim": 61,
8
+ "checkpoint": "/net/gcp/cloud-storage/europe-west/training/hannes/microduck_running/20260830-hardware-robust/v2-mild-r2/stage-c/checkpoint.pt",
9
+ "command_speed_mps": 2.2,
10
+ "duration_s": 10.0,
11
+ "final_absolute_heading_error_deg": {
12
+ "mean": 78.06403519401661,
13
+ "median": 69.26634856187916,
14
+ "p90": 153.97044094998287
15
+ },
16
+ "flight_events_per_second": 6.991552829742432,
17
+ "flight_fraction": 0.6431052684783936,
18
+ "forward_speed_mps": {
19
+ "clean_survivor_mean": 1.6127194166183472,
20
+ "mean": 1.6121970415115356,
21
+ "median": 1.6359825134277344,
22
+ "p10": 1.4503546953201294,
23
+ "p90": 1.7518620491027832
24
+ },
25
+ "initial_heading_displacement_speed_mps": {
26
+ "mean": 0.9829199910163879,
27
+ "median": 1.1384128332138062,
28
+ "p10": 0.1604430228471756
29
+ },
30
+ "max_tilt_deg_median": 16.76836371428601,
31
+ "mean_absolute_heading_error_deg": 43.80756975146533,
32
+ "mean_absolute_lateral_speed_mps": 0.1000186949968338,
33
+ "mean_absolute_yaw_rate_radps": 1.5083571672439575,
34
+ "num_envs": 256,
35
+ "survival_fraction": 0.984375,
36
+ "task_id": "Mjlab-Running-Flat-Backlash-MicroDuck"
37
+ }
eval/stress-plain.json ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "absolute_lateral_displacement_m": {
3
+ "mean": 6.924654006958008,
4
+ "median": 7.288991451263428,
5
+ "p90": 11.336601257324219
6
+ },
7
+ "actor_observation_dim": 61,
8
+ "checkpoint": "/net/gcp/cloud-storage/europe-west/training/hannes/microduck_running/20260830-hardware-robust/v2-mild-r2/stage-c/checkpoint.pt",
9
+ "command_speed_mps": 2.2,
10
+ "duration_s": 10.0,
11
+ "final_absolute_heading_error_deg": {
12
+ "mean": 75.89308688708473,
13
+ "median": 66.99265371926279,
14
+ "p90": 149.8832694110256
15
+ },
16
+ "flight_events_per_second": 7.019308090209961,
17
+ "flight_fraction": 0.6557417511940002,
18
+ "forward_speed_mps": {
19
+ "clean_survivor_mean": 1.636256456375122,
20
+ "mean": 1.6349653005599976,
21
+ "median": 1.6558061838150024,
22
+ "p10": 1.4708143472671509,
23
+ "p90": 1.7637542486190796
24
+ },
25
+ "initial_heading_displacement_speed_mps": {
26
+ "mean": 1.0107059478759766,
27
+ "median": 1.1746344566345215,
28
+ "p10": 0.1442173719406128
29
+ },
30
+ "max_tilt_deg_median": 16.412852367986844,
31
+ "mean_absolute_heading_error_deg": 43.2924983559655,
32
+ "mean_absolute_lateral_speed_mps": 0.10448182374238968,
33
+ "mean_absolute_yaw_rate_radps": 1.3874105215072632,
34
+ "num_envs": 512,
35
+ "survival_fraction": 0.98828125,
36
+ "task_id": "Mjlab-Running-Flat-MicroDuck"
37
+ }
legacy/iteration-8749/checkpoint.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ce7707c985d84affda1befec172a8c0a72fafaa4d3476a26bec11dde9199907f
3
+ size 4843445
legacy/iteration-8749/manifest.json ADDED
@@ -0,0 +1,103 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema_version": 4,
3
+ "model_api": 1,
4
+ "name": "microduck-running",
5
+ "kind": "perpetual",
6
+ "obs_len": 61,
7
+ "action_len": 14,
8
+ "action_scale": 1.0,
9
+ "entry_pose": "standing",
10
+ "duration_s": null,
11
+ "status": "sim-only",
12
+ "description": "Forward-running policy for the stock MicroDuck on flat ground. This is checkpoint 8749 used in the run-into-mat video, not the later faster continuation.",
13
+ "command": {
14
+ "layout": "twist(3), head_pose(4), body_pose(6)",
15
+ "twist": [
16
+ "forward velocity command in m/s; trained through 1.65, recommended simulation evaluation point 1.80; not a hard speed limit",
17
+ "lateral velocity; use 0 (training range was only -0.02 to 0.02 m/s)",
18
+ "yaw rate; use 0 (training range was only -0.05 to 0.05 rad/s)"
19
+ ],
20
+ "head": "unused; zeros",
21
+ "body": "unused; zeros",
22
+ "idle": [
23
+ 0,
24
+ 0,
25
+ 0
26
+ ],
27
+ "exact_zero_training_fraction": 0.03
28
+ },
29
+ "robot": {
30
+ "model": "microduck",
31
+ "hw_rev": 1,
32
+ "servos": "14x Dynamixel XL330",
33
+ "control_hz": 50,
34
+ "hardware_modifications_required": false
35
+ },
36
+ "training": {
37
+ "task_id": "Mjlab-Running-Flat-MicroDuck",
38
+ "algorithm": "PPO (rsl_rl)",
39
+ "repo": "Vottivott/microduck-playground",
40
+ "commit": "c5fcc50219fef01ac9931d0079c583ccbb29b689",
41
+ "upstream_base": "pollen-robotics/microduck_rl@d424a0c899f6b33cbd3daeb279913134349c0b63",
42
+ "run": "sweep-speed-r1",
43
+ "checkpoint_iteration": 8749,
44
+ "resumed_from": "highspeed-r6 iteration 6750",
45
+ "continuation_iterations": 2000,
46
+ "environment": {
47
+ "MICRODUCK_RUNNING_TARGET_MAX_SPEED": 1.65,
48
+ "MICRODUCK_RUNNING_SPEED_CAP": 1.8,
49
+ "MICRODUCK_RUNNING_ACTION_RATE_WEIGHT": -0.1,
50
+ "MICRODUCK_RUNNING_ENABLE_SYMMETRY": false,
51
+ "MICRODUCK_RUNNING_ENABLE_HEADING_FEEDBACK": false
52
+ },
53
+ "export": "scripts/export.py; observation normalizer baked into policy.onnx",
54
+ "source_commit": "c5fcc50219fef01ac9931d0079c583ccbb29b689",
55
+ "continuation_checkpoint": {
56
+ "path": "checkpoint.pt",
57
+ "sha256": "ce7707c985d84affda1befec172a8c0a72fafaa4d3476a26bec11dde9199907f",
58
+ "actor_exact_to_released_onnx": true,
59
+ "original_full_ppo_state": true
60
+ }
61
+ },
62
+ "eval": {
63
+ "sim_proxy": "mjlab / MuJoCo Warp with BAM XL330 M6 actuator model",
64
+ "command_speed_m_s": 1.8,
65
+ "num_envs": 256,
66
+ "duration_s": 8.0,
67
+ "survival_fraction": 0.9921875,
68
+ "mean_body_forward_speed_m_s": 1.6072514057159424,
69
+ "mean_initial_heading_displacement_speed_m_s": 1.3276939392089844,
70
+ "mean_absolute_heading_error_deg": 25.215665057096395,
71
+ "mean_absolute_lateral_displacement_m": 3.8727223873138428,
72
+ "flight_fraction": 0.6572428941726685,
73
+ "known_limits": "Heading drift is substantial. At a 2.00 m/s extrapolated command, mean body-forward speed was 1.6452 m/s and survival fell to 0.9336. Never tested on hardware."
74
+ },
75
+ "sim2real": {
76
+ "retained": [
77
+ "BAM XL330 M6 voltage control, back-EMF, current limiting, battery 6.5-8.2 V, and load-dependent sag",
78
+ "3-6 physics-step actuator delay, 0-1-step IMU delay, and one-control-step joint-velocity lag",
79
+ "foot friction 0.7-1.3",
80
+ "trunk mass/inertia +/-5%, trunk/head CoM +/-3 mm, armature +/-10%, BAM joint friction +/-10%",
81
+ "encoder bias +/-0.015 rad, IMU misalignment up to 6 degrees, and actor observation noise"
82
+ ],
83
+ "relaxed": [
84
+ "flat terrain only",
85
+ "random push disturbances removed",
86
+ "non-backlash robot model",
87
+ "CoM/head-CoM and head/body pose-command widening curricula removed",
88
+ "weaker posture, angular-motion, foot-slip, and action-rate regularization; head/body pose tracking disabled",
89
+ "motor-gain randomization and randomized initial base tilt disabled in inherited base recipe"
90
+ ],
91
+ "hardware_validated": false
92
+ },
93
+ "media": {
94
+ "preview": "media/preview.mp4",
95
+ "run_into_mat": "media/run-into-mat.mp4",
96
+ "run_into_mat_note": "Same policy checkpoint; obstacle, collision augmentation, camera treatment, motor cutoff, and sparks are scripted demo elements. The policy has no obstacle perception.",
97
+ "audio": false
98
+ },
99
+ "source_artifact_sha256": "b4e285fb3671f52c28f671bd4733a4e11fa17c21f40d25f52eaf2614f9e2e02a",
100
+ "artifacts": {
101
+ "policy_onnx_sha256": "b4e285fb3671f52c28f671bd4733a4e11fa17c21f40d25f52eaf2614f9e2e02a"
102
+ }
103
+ }
legacy/iteration-8749/media/preview.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:69ce8b5f8855ac76d2413d90b176e770d22d22a72766dcc2dacf34ccbded58d6
3
+ size 3133555
legacy/iteration-8749/policy.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:b4e285fb3671f52c28f671bd4733a4e11fa17c21f40d25f52eaf2614f9e2e02a
3
+ size 793819
lineage/iteration-11748/checkpoint.pt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:1e79df200d8bb19b139ee1e74e6910c62434d57e792f632b66b10a73266894eb
3
+ size 4843527
lineage/iteration-11748/evaluations.tar.gz ADDED
Binary file (12.7 kB). View file
 
lineage/iteration-11748/manifest.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "checkpoint_iteration": 11748,
3
+ "role": "speed-focused parent of the robustified default",
4
+ "command_speed_m_s": 2.2,
5
+ "mean_body_forward_speed_m_s": 1.6873,
6
+ "survival_fraction": 0.9883,
7
+ "num_envs": 1024,
8
+ "duration_s": 10.0,
9
+ "policy_onnx_sha256": "ccd6757b53b591081fdf75dd3effe9a5743f5fac0c2a513fa48dfd5a32231b65",
10
+ "checkpoint_pt_sha256": "1e79df200d8bb19b139ee1e74e6910c62434d57e792f632b66b10a73266894eb",
11
+ "preview_mp4_sha256": "256ad675984d544204076986a7e09ea3a66c6070ec15ffb52921212e685e898c",
12
+ "evaluations_tar_sha256": "a81a468c789b890f935e14f478f992c632b01eeb25179da7d3ba252d663625be"
13
+ }
lineage/iteration-11748/policy.onnx ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:ccd6757b53b591081fdf75dd3effe9a5743f5fac0c2a513fa48dfd5a32231b65
3
+ size 793831
lineage/iteration-11748/preview.mp4 ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:256ad675984d544204076986a7e09ea3a66c6070ec15ffb52921212e685e898c
3
+ size 3244149
manifest.json CHANGED
@@ -1,5 +1,5 @@
1
  {
2
- "schema_version": 4,
3
  "model_api": 1,
4
  "name": "microduck-running",
5
  "kind": "perpetual",
@@ -8,22 +8,18 @@
8
  "action_scale": 1.0,
9
  "entry_pose": "standing",
10
  "duration_s": null,
11
- "status": "sim-only",
12
- "description": "Forward-running policy for the stock MicroDuck on flat ground. This is checkpoint 8749 used in the run-into-mat video, not the later faster continuation.",
13
  "command": {
14
  "layout": "twist(3), head_pose(4), body_pose(6)",
15
  "twist": [
16
- "forward velocity command in m/s; trained through 1.65, recommended simulation evaluation point 1.80; not a hard speed limit",
17
  "lateral velocity; use 0 (training range was only -0.02 to 0.02 m/s)",
18
  "yaw rate; use 0 (training range was only -0.05 to 0.05 rad/s)"
19
  ],
20
  "head": "unused; zeros",
21
  "body": "unused; zeros",
22
- "idle": [
23
- 0,
24
- 0,
25
- 0
26
- ],
27
  "exact_zero_training_fraction": 0.03
28
  },
29
  "robot": {
@@ -37,67 +33,91 @@
37
  "task_id": "Mjlab-Running-Flat-MicroDuck",
38
  "algorithm": "PPO (rsl_rl)",
39
  "repo": "Vottivott/microduck-playground",
40
- "commit": "c5fcc50219fef01ac9931d0079c583ccbb29b689",
41
  "upstream_base": "pollen-robotics/microduck_rl@d424a0c899f6b33cbd3daeb279913134349c0b63",
42
- "run": "sweep-speed-r1",
43
- "checkpoint_iteration": 8749,
44
- "resumed_from": "highspeed-r6 iteration 6750",
45
- "continuation_iterations": 2000,
46
- "environment": {
47
- "MICRODUCK_RUNNING_TARGET_MAX_SPEED": 1.65,
48
- "MICRODUCK_RUNNING_SPEED_CAP": 1.8,
49
  "MICRODUCK_RUNNING_ACTION_RATE_WEIGHT": -0.1,
 
 
50
  "MICRODUCK_RUNNING_ENABLE_SYMMETRY": false,
51
- "MICRODUCK_RUNNING_ENABLE_HEADING_FEEDBACK": false
 
 
52
  },
 
 
 
 
 
53
  "export": "scripts/export.py; observation normalizer baked into policy.onnx",
54
- "source_commit": "c5fcc50219fef01ac9931d0079c583ccbb29b689",
55
  "continuation_checkpoint": {
56
  "path": "checkpoint.pt",
57
- "sha256": "ce7707c985d84affda1befec172a8c0a72fafaa4d3476a26bec11dde9199907f",
58
  "actor_exact_to_released_onnx": true,
59
  "original_full_ppo_state": true
60
  }
61
  },
62
  "eval": {
63
  "sim_proxy": "mjlab / MuJoCo Warp with BAM XL330 M6 actuator model",
64
- "command_speed_m_s": 1.8,
65
- "num_envs": 256,
66
- "duration_s": 8.0,
67
- "survival_fraction": 0.9921875,
68
- "mean_body_forward_speed_m_s": 1.6072514057159424,
69
- "mean_initial_heading_displacement_speed_m_s": 1.3276939392089844,
70
- "mean_absolute_heading_error_deg": 25.215665057096395,
71
- "mean_absolute_lateral_displacement_m": 3.8727223873138428,
72
- "flight_fraction": 0.6572428941726685,
73
- "known_limits": "Heading drift is substantial. At a 2.00 m/s extrapolated command, mean body-forward speed was 1.6452 m/s and survival fell to 0.9336. Never tested on hardware."
 
 
 
 
 
 
 
 
74
  },
75
  "sim2real": {
76
  "retained": [
77
  "BAM XL330 M6 voltage control, back-EMF, current limiting, battery 6.5-8.2 V, and load-dependent sag",
78
  "3-6 physics-step actuator delay, 0-1-step IMU delay, and one-control-step joint-velocity lag",
79
  "foot friction 0.7-1.3",
80
- "trunk mass/inertia +/-5%, trunk/head CoM +/-3 mm, armature +/-10%, BAM joint friction +/-10%",
 
81
  "encoder bias +/-0.015 rad, IMU misalignment up to 6 degrees, and actor observation noise"
82
  ],
83
  "relaxed": [
84
  "flat terrain only",
85
- "random push disturbances removed",
86
- "non-backlash robot model",
87
- "CoM/head-CoM and head/body pose-command widening curricula removed",
88
  "weaker posture, angular-motion, foot-slip, and action-rate regularization; head/body pose tracking disabled",
89
- "motor-gain randomization and randomized initial base tilt disabled in inherited base recipe"
90
  ],
91
  "hardware_validated": false
92
  },
 
 
 
 
 
93
  "media": {
94
  "preview": "media/preview.mp4",
95
  "run_into_mat": "media/run-into-mat.mp4",
96
- "run_into_mat_note": "Same policy checkpoint; obstacle, collision augmentation, camera treatment, motor cutoff, and sparks are scripted demo elements. The policy has no obstacle perception.",
 
97
  "audio": false
98
  },
99
- "source_artifact_sha256": "b4e285fb3671f52c28f671bd4733a4e11fa17c21f40d25f52eaf2614f9e2e02a",
100
  "artifacts": {
101
- "policy_onnx_sha256": "b4e285fb3671f52c28f671bd4733a4e11fa17c21f40d25f52eaf2614f9e2e02a"
 
 
102
  }
103
  }
 
1
  {
2
+ "schema_version": 5,
3
  "model_api": 1,
4
  "name": "microduck-running",
5
  "kind": "perpetual",
 
8
  "action_scale": 1.0,
9
  "entry_pose": "standing",
10
  "duration_s": null,
11
+ "status": "simulation-only-hardware-candidate",
12
+ "description": "Robustified iteration-12195 forward-running policy for the stock MicroDuck on flat ground. It is not hardware validated.",
13
  "command": {
14
  "layout": "twist(3), head_pose(4), body_pose(6)",
15
  "twist": [
16
+ "forward velocity command in m/s; curriculum trained through 2.2; evaluated at 2.2; not a hard speed limit",
17
  "lateral velocity; use 0 (training range was only -0.02 to 0.02 m/s)",
18
  "yaw rate; use 0 (training range was only -0.05 to 0.05 rad/s)"
19
  ],
20
  "head": "unused; zeros",
21
  "body": "unused; zeros",
22
+ "idle": [0, 0, 0],
 
 
 
 
23
  "exact_zero_training_fraction": 0.03
24
  },
25
  "robot": {
 
33
  "task_id": "Mjlab-Running-Flat-MicroDuck",
34
  "algorithm": "PPO (rsl_rl)",
35
  "repo": "Vottivott/microduck-playground",
36
+ "commit": "828d950134e29a8d04cbb51720a22c8729047fb7",
37
  "upstream_base": "pollen-robotics/microduck_rl@d424a0c899f6b33cbd3daeb279913134349c0b63",
38
+ "checkpoint_iteration": 12195,
39
+ "resumed_from": "iteration 11748",
40
+ "num_envs": 4096,
41
+ "seed": 42,
42
+ "common_environment": {
43
+ "MICRODUCK_RUNNING_TARGET_MAX_SPEED": 2.2,
44
+ "MICRODUCK_RUNNING_SPEED_CAP": 2.4,
45
  "MICRODUCK_RUNNING_ACTION_RATE_WEIGHT": -0.1,
46
+ "MICRODUCK_RUNNING_HIGH_SPEED_STAGE_INTERVAL": 750,
47
+ "MICRODUCK_RUNNING_FORWARD_PROGRESS_WEIGHT": 5.0,
48
  "MICRODUCK_RUNNING_ENABLE_SYMMETRY": false,
49
+ "MICRODUCK_RUNNING_ENABLE_HEADING_FEEDBACK": false,
50
+ "foot_friction_range": [0.7, 1.3],
51
+ "push_interval_s": [3.0, 6.0]
52
  },
53
+ "robustification_stages": [
54
+ {"updates": 100, "push_m_s": 0.03, "trunk_com_m": 0.003, "head_com_m": 0.003, "initial_tilt_deg": 1.0},
55
+ {"updates": 150, "push_m_s": 0.06, "trunk_com_m": 0.005, "head_com_m": 0.005, "initial_tilt_deg": 1.5},
56
+ {"updates": 200, "push_m_s": 0.1, "trunk_com_m": 0.008, "head_com_m": 0.006, "initial_tilt_deg": 2.0}
57
+ ],
58
  "export": "scripts/export.py; observation normalizer baked into policy.onnx",
 
59
  "continuation_checkpoint": {
60
  "path": "checkpoint.pt",
61
+ "sha256": "052f6df6683fdae83deb369b7f2c7d13e45f87ed2907adee6e23b1ebf9dfe973",
62
  "actor_exact_to_released_onnx": true,
63
  "original_full_ppo_state": true
64
  }
65
  },
66
  "eval": {
67
  "sim_proxy": "mjlab / MuJoCo Warp with BAM XL330 M6 actuator model",
68
+ "command_speed_m_s": 2.2,
69
+ "duration_s": 10.0,
70
+ "warmup_s": 1.0,
71
+ "results": {
72
+ "nominal_plain": {"num_envs": 512, "speed_m_s": 1.6510932445526123, "survival": 0.9921875},
73
+ "stress_plain": {"num_envs": 512, "speed_m_s": 1.6349653005599976, "survival": 0.98828125},
74
+ "nominal_backlash": {"num_envs": 256, "speed_m_s": 1.6362495422363281, "survival": 0.98828125},
75
+ "stress_backlash": {"num_envs": 256, "speed_m_s": 1.6121970415115356, "survival": 0.984375},
76
+ "high_grip_stress": {"num_envs": 512, "speed_m_s": 1.6424154043197632, "survival": 0.966796875}
77
+ },
78
+ "stress": {"push_m_s": 0.1, "trunk_com_m": 0.01, "head_com_m": 0.006, "initial_tilt_deg": 2.0},
79
+ "known_limits": "Heading and lateral drift remain substantial. Never tested on hardware."
80
+ },
81
+ "onnx_contract": {
82
+ "observation_normalizer_embedded": true,
83
+ "training_action_clipping": false,
84
+ "onnx_output_clip": false,
85
+ "checkpoint_parity_max_abs_error": 0.00000762939453125
86
  },
87
  "sim2real": {
88
  "retained": [
89
  "BAM XL330 M6 voltage control, back-EMF, current limiting, battery 6.5-8.2 V, and load-dependent sag",
90
  "3-6 physics-step actuator delay, 0-1-step IMU delay, and one-control-step joint-velocity lag",
91
  "foot friction 0.7-1.3",
92
+ "trunk mass/inertia +/-5%, trunk CoM +/-8 mm, head CoM +/-6 mm, armature +/-10%, and BAM joint friction +/-10% in the final training stage",
93
+ "planar velocity pushes up to +/-0.10 m/s and initial pitch/roll up to +/-2 degrees in the final training stage",
94
  "encoder bias +/-0.015 rad, IMU misalignment up to 6 degrees, and actor observation noise"
95
  ],
96
  "relaxed": [
97
  "flat terrain only",
98
+ "trained on the ordinary non-backlash robot model; backlash is cross-evaluation only",
99
+ "head/body pose-command widening curricula removed",
 
100
  "weaker posture, angular-motion, foot-slip, and action-rate regularization; head/body pose tracking disabled",
101
+ "motor-gain randomization remains disabled in the inherited recipe"
102
  ],
103
  "hardware_validated": false
104
  },
105
+ "versions": {
106
+ "default": {"iteration": 12195, "policy": "policy.onnx", "checkpoint": "checkpoint.pt", "preview": "media/preview.mp4"},
107
+ "speed_parent": {"iteration": 11748, "directory": "lineage/iteration-11748"},
108
+ "legacy_mat_policy": {"iteration": 8749, "directory": "legacy/iteration-8749"}
109
+ },
110
  "media": {
111
  "preview": "media/preview.mp4",
112
  "run_into_mat": "media/run-into-mat.mp4",
113
+ "run_into_mat_policy_iteration": 8749,
114
+ "run_into_mat_note": "The mat, collision augmentation, camera treatment, motor cutoff, and sparks are scripted demo elements. The policy has no obstacle perception.",
115
  "audio": false
116
  },
117
+ "source_artifact_sha256": "007707dd7779b2756ded67c58b2e9f94fe5071794a48c2b5a20d5f8d841efbeb",
118
  "artifacts": {
119
+ "policy_onnx_sha256": "007707dd7779b2756ded67c58b2e9f94fe5071794a48c2b5a20d5f8d841efbeb",
120
+ "checkpoint_pt_sha256": "052f6df6683fdae83deb369b7f2c7d13e45f87ed2907adee6e23b1ebf9dfe973",
121
+ "preview_mp4_sha256": "942f0802cc0c6795769bd99a9991f866fee682890ea9ea6d71077f7d4eb5492b"
122
  }
123
  }
media/preview.mp4 CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:69ce8b5f8855ac76d2413d90b176e770d22d22a72766dcc2dacf34ccbded58d6
3
- size 3133555
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:942f0802cc0c6795769bd99a9991f866fee682890ea9ea6d71077f7d4eb5492b
3
+ size 3487586
policy.onnx CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:b4e285fb3671f52c28f671bd4733a4e11fa17c21f40d25f52eaf2614f9e2e02a
3
- size 793819
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:007707dd7779b2756ded67c58b2e9f94fe5071794a48c2b5a20d5f8d841efbeb
3
+ size 793744