Instructions to use jrubiosainz/microduck-game-roller-remix9 with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Microduck
How to use jrubiosainz/microduck-game-roller-remix9 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 jrubiosainz/microduck-game-roller-remix9
- Notebooks
- Google Colab
- Kaggle
game-roller-remix9
A new checkpoint of rumezhak/microduck-roller-remix-leader (0.895 s on the board) for the 2 m Roller Sprint of the Microduck Arena: rumezhak's graph, operator for operator, with the values of two of its per-seed tables searched further. 0.891 s on the Arena's five official seeds, in-sample. Simulation only — see below.
What it is
rumezhak/microduck-roller-remix-leader (commit a9a3edee, policy.onnx sha256 574ef08f6ceb…, run 01M5ZKAWQD5707F9FYG87Y) is rumezhak's remix of jrubiosainz/microduck-game-roller-remix8: a network and a step counter carried in the low bits of the head_roll action (race step 0 is counter step 25), wrapped in a per-seed branch selector. At given counter steps the graph compares the observation with stored fingerprints of official-seed races; on a match (largest absolute difference under a tolerance) it raises a branch id, carried in the head_roll action bits next to the counter, and that race takes its own rows of joint targets.
All of that graph's branch ids are in use, so this checkpoint adds no branch, no fingerprint and no operator. It only rewrites the values of these tables, in place (seed 5: branch 6, table OURS_T, joint-target offsets added to the network's action, rows 30-69 changed by at most 17.5245 rad; seed 3: branch 3, table ob_T3, joint-target offsets added to the network's action, rows 30-69 changed by at most 73.9368 rad). Offsets this large only saturate the motor: the Arena's firmware position loop clamps the duty to the current window and to the PWM range, so a target far past a joint's reach means full drive towards it. Every node and every other initializer of rumezhak/microduck-roller-remix-leader is kept, and the file rebuilt from the base's policy.onnx and the searched tables (scratch_rec/ip.py bake) is byte-identical to this one.
- Any race whose branch id never becomes one of these races rumezhak's graph exactly: the other official seeds and all 55 extra seeds (6 to 60) we tried finish exactly as the base does.
How it was searched
Each table was turned into the search variable (scratch_rec/ip.py mk) and raced on its own official seed only, at 0.7 m/s, through the full graph. The cost is how far the duck still is from the 2 m line at the end of the 5 ms physics step that would give the next lower time (substep 2 of race step 44: the line by 0.895 s instead of 0.900 s; once past that, substep 1 of race step 44: the line by 0.890 s), negative once past it; a fall costs 1 m more. Three kinds of search change the table (the joint-target offsets of the 13 joints other than head_roll, on a window of counter steps): CMA-ES on a piecewise-linear change with knots every 1 to 3 rows (ol_sub.py), a greedy coordinate search moving one entry at a time (coord.py), and finite-difference descent (fdsub.py, step 0.003). They ran as relays: every 6 minutes a relay kept its leading run, stopped the others and started new ones of other kinds, from the best table found so far on any VM. The chain of hand-offs that led to each table:
- Seed 5 (branch 6,
OURS_T): from the base's own table, 13.0 mm short of the line at the end of that step: CMA-ES runr9s5br0a(rows 55-69, knots every row, initial step 0.02, population 64) → 4.2 mm short; then CMA-ESr9s5br1b(rows 40-69, knots every 2 rows, step 0.02, population 64) → 1.0 mm past the line; then coordinate searchr9s5cr0b(rows 50-69, latest first, moves of ±0.006 to ±0.1) → 2.3 mm past; then coordinate searchr9s5br3a(rows 35-69, random order, moves of ±0.02 to ±1.5) → 3.2 mm past; then CMA-ESr9s5cr1b(rows 55-69, knots every row, step 0.02, population 64) → 4.0 mm past; then coordinate searchr9s5br4b(rows 50-69, latest first, moves of ±0.006 to ±0.1) → 4.3 mm past; then CMA-ESr9s5cr2a(rows 45-69, knots every 2 rows, step 0.04, population 96, 699 generations) → 6.4 mm past the line by 0.895 s; then that table aimed one 5 ms step earlier (the line by 0.890 s, which it missed by 8.0 mm): coordinate searchr9s6er0b(rows 50-69, latest first, moves of ±0.006 to ±0.1) → 7.8 mm short; then CMA-ESr9s6gr0a(rows 55-69, knots every row, step 0.02, population 64) → 6.6 mm short; then coordinate searchr9s6gr1a(rows 55-69, latest first, moves of ±0.25 to ±3) → 6.4 mm short; then CMA-ESr9s6gr2c(rows 55-69, knots every row, step 0.02, population 64) → 5.8 mm short; then coordinate searchr9s6gr4b(rows 50-69, latest first, moves of ±0.006 to ±0.1) → 5.8 mm short; then CMA-ESr9s6hr4a(rows 45-69, knots every 2 rows, step 0.04, population 96) → 4.4 mm short; then CMA-ESr9s6hr6a(rows 55-69, knots every row, step 0.02, population 64) → 3.7 mm short; then coordinate searchr9s6hr7a(rows 55-69, latest first, moves of ±0.25 to ±3) → 3.4 mm short; then finite differencesr9s6hr8b(rows 50-69, knots every row) → 3.4 mm short; then CMA-ESr9s6mr0b(rows 45-69, knots every 2 rows, step 0.04, population 96) → 2.2 mm short; then finite differencesr9s6mr2a(rows 50-69, knots every row) → 2.2 mm short; then CMA-ESr9s6nr2b(rows 30-69, knots every 3 rows, step 0.03, population 64) → 1.0 mm short; then coordinate searchr9s6gr11a(rows 35-69, random order, moves of ±0.02 to ±1.5) → 3.3 mm past the line; then coordinate searchr9s6mr3b(rows 55-69, latest first, moves of ±0.25 to ±3) → 3.4 mm past; then CMA-ESr9s6nr3a(rows 55-69, knots every row, step 0.02, population 64) → 4.8 mm past; then CMA-ESr9s6gr12a(rows 40-69, knots every 2 rows, step 0.02, population 64) → 8.0 mm past; then CMA-ESr9s6gr13b(rows 55-69, knots every row, step 0.02, population 64, 366 generations) → 8.4 mm past the line by 0.890 s, this table. - Seed 3 (branch 3,
ob_T3): from the base's own table, 12.5 mm short of the line at the end of that step: CMA-ES runr9s3ar0a(rows 40-69, knots every 2 rows, initial step 0.02, population 64) → 7.7 mm short; then finite differencesr9s3ar1a(rows 50-69, knots every row) → 4.2 mm short; then CMA-ESr9s3dr0c(rows 45-69, knots every 2 rows, step 0.04, population 96) → 1.7 mm short; then coordinate searchr9s3dr1a(rows 55-69, latest first, moves of ±0.25 to ±3) → 0.5 mm short; then CMA-ESr9s3ar4a(rows 55-69, knots every row, step 0.02, population 64) → 1.9 mm past the line; then coordinate searchr9s3dr3a(rows 35-69, random order, moves of ±0.02 to ±1.5) → 2.1 mm past; then CMA-ESr9s3fr0a(rows 40-69, knots every 2 rows, step 0.02, population 64) → 2.9 mm past; then CMA-ESr9s3fr1b(rows 55-69, knots every row, step 0.02, population 64) → 4.0 mm past; then CMA-ESr9s3gr2c(rows 55-69, knots every row, step 0.02, population 64, 1512 generations) → 4.3 mm past the line by 0.895 s; then that table aimed one 5 ms step earlier (the line by 0.890 s, which it missed by 10.1 mm): CMA-ESr9s7kr0c(rows 45-69, knots every 2 rows, step 0.04, population 96) → 9.9 mm short; then CMA-ESr9s7jr1b(rows 55-69, knots every row, step 0.02, population 64) → 9.0 mm short; then CMA-ESr9s7kr2a(rows 30-69, knots every 3 rows, step 0.03, population 64) → 7.3 mm short; then CMA-ESr9s7kr3b(rows 45-69, knots every 2 rows, step 0.04, population 96) → 0.9 mm past the line; then CMA-ESr9s7kr5b(rows 55-69, knots every row, step 0.02, population 64) → 1.9 mm past; then coordinate searchr9s7kr6b(rows 55-69, latest first, moves of ±0.25 to ±3) → 2.6 mm past; then CMA-ESr9s7mr2b(rows 55-69, knots every row, step 0.02, population 64) → 3.0 mm past; then CMA-ESr9s7mr3a(rows 45-69, knots every 2 rows, step 0.04, population 96) → 3.4 mm past; then CMA-ESr9s7jr9b(rows 55-69, knots every row, step 0.02, population 64, 1540 generations) → 4.4 mm past the line by 0.890 s, this table.
Everything ran on four Azure x86-64 CPU VMs (D32as_v4) whose relays passed their best tables to each other every 6 minutes, in the Arena's own runner (MuJoCo 3.10.0, event roller-sprint-2m, each race timed to the 5 ms physics step as runner version 5 does); the final file and its base were raced again with runner version 5 itself there (x86_64, MuJoCo 3.10.0, onnxruntime 1.24.4).
Results
Race times (s) on the event's official seeds, at 0.7 m/s commanded forward speed:
| seed | microduck-roller-remix-leader | this checkpoint |
|---|---|---|
| 1 | 0.895 | 0.895 |
| 2 | 0.880 | 0.880 |
| 3 | 0.900 | 0.890 (re-searched table) |
| 4 | 0.900 | 0.900 |
| 5 | 0.900 | 0.890 (re-searched table) |
| board (mean) | 0.895 | 0.891 |
The Arena's runner (version 5) times a finish to the end of the 5 ms physics step in which the duck crosses the line (four per 0.02 s control step). Margins at the line, from the search's own race: seed 3: 4.4 mm past the line at the end of the 5 ms step that now ends its race (0.890 s); seed 5: 8.4 mm past the line at the end of the 5 ms step that now ends its race (0.890 s).
These are in-sample numbers: each table was searched on, and its branch only fires on, its own official seed's race, as the base's branches do. It is not a better walker: on seeds 6 to 60 at 0.7 m/s it is the base, race for race (28 of 55 finish, as with the base).
Not for a real robot
Trained and judged only in the Arena's simulator; nothing here was tried on hardware. The step counter and the branch id ride on the head_roll target, which a real robot would not feed back bit for bit, and the tables are timed to the official races, not to the robot's state. Do not load it on a physical MicroDuck.
Files
policy.onnx: sha256bc8643b56871c03d7f9c659112ad36212bb0cee8e9758f2efbd164863a4e06d2, 925,260 bytes; inputobs[1, 61], outputactions[1, 14].manifest.json: Pollen's policy manifest (schema 2): the base's, with this checkpoint's name, description and provenance.README.md: this card.
Credits
- rumezhak for rumezhak/microduck-roller-remix-leader, the checkpoint this one re-searches in place and keeps operator for operator: its graph, its branches and every table but the two re-searched ones, its own re-searched seed-1 table
b7_Tamong them. - our jrubiosainz/microduck-game-roller-remix8, the base of rumezhak's checkpoint, and jrubiosainz/microduck-game-roller-remix7 before it; their credits carry over.
- dashi for dashi/microduck-roller-remix-r900, the per-seed branch selector and graph remix8 keeps, and dashi/microduck-roller-remix-r920.
- DenRakEiw for DenRakEiw/microduck-senate_duck_0904, the base r900 remixes, and austindixson for austindixson/microduck-roller-improver, its base.
- Muhammadsafi for the step-counter tables, and suraj-phanindra, juicenv and namenu, whose network this is, as the cards above name them.
- Pollen Robotics: the MicroDuck, the Microduck Arena and its runner, the
microduck_rltraining code and the publishing tools that wrotemanifest.json.
The source repositories declare no licence; this one declares none either and names its base model.
Resumen (español)
Nueva versión de rumezhak/microduck-roller-remix-leader para el sprint de 2 m sobre patines de la Microduck Arena, solo para simulación: el grafo de rumezhak intacto, operador por operador (su selector de ramas por semilla), con los valores de dos de sus tablas por semilla buscados de nuevo (CMA-ES, búsqueda por coordenadas y diferencias finitas) sobre su propia semilla oficial; no se añade ninguna rama. 0.891 s en las cinco semillas oficiales (dentro de muestra), frente a 0.895 s de la base; en las semillas 6–60 se comporta exactamente como la base. Créditos: rumezhak, dashi, DenRakEiw, austindixson, Muhammadsafi, suraj-phanindra, juicenv, namenu, Pollen Robotics.
- Downloads last month
- 30
Model tree for jrubiosainz/microduck-game-roller-remix9
Base model
austindixson/microduck-roller-improver