DuckWing V89 — skating, braking and composed tricks

V89 is the recommended DuckWing roller-skating release for Pollen MicroDuck. It preserves the established driving policy and adds learned high-speed braking. This repository also includes the published 180°, 360° and 720° heading-feedback trick controller. All qualification results are from simulation; physical-robot validation and the 5 mph target remain open.

This is a mirror of microduck-lab at GitHub commit 8cd540bf. release-sync.json records the source commit and distributed file hashes. This release card describes published evidence, not the live status of private training jobs.

Files and compatibility

The root policy.onnx and the two bundled V89 exports have the same SHA-256: 09663852ae1db90fdcf321dedc4e39810eb65ffc6998df3cd8fc34d3231f84f7. Only private-path metadata was removed from the originally evaluated artifact; graph parameters and numerical outputs were preserved. See privacy-normalization.json.

Input is float32 [1,15616], not one 61-value frame. It contains 256 frames of 61 observations in term-major order, oldest to newest within each term. Term widths are 3,3,14,14,14,3,4,6. Repeat the initial frame across history at reset, append once per 50 Hz control tick, and preserve history through tricks. Reset history when the simulation resets. An existing single-frame consumer needs the adapter before loading V89.

Measured braking improvement

The V80 comparison below uses the frozen GitHub V80 benchmark, rather than substituting the separate historic HF V80 export. Held-out final seeds 89901–89916 were separate from checkpoint-selection seeds. V89 completed 16/16 healthy high-speed stops, compared with V80's 14/16. On the 14 paired episodes where both policies braked healthily:

High-speed braking metric V80 V89 Improvement
Mean stopping time 2.930 s 2.371 s 19.1% faster
Mean stopping path 1.812 m 1.493 m 17.6% shorter
Mean lateral drift 0.599 m 0.325 m 45.7% less
Worst lateral drift 1.179 m 0.787 m 33.2% less

Across all 16 V89 held-out episodes, mean stopping time was 2.406 s, path 1.529 m and lateral drift 0.327 m. These whole-cohort means differ from the paired comparison above. Race5 and manual-agility phase metrics matched V80 exactly on all 16 paired seeds; low-speed braking was unchanged. See metrics, full evaluation and the frozen contract.

Comparison with Pollen's official roller

Simulation metric V89 Pollen baseline
Verified top speed over 0.5 s 3.084 mph 1.283 mph
100-ft elapsed time 25.729 s 57.589 s
First-second acceleration 0.466 m/s² 0.323 m/s²
Maximum lateral drift 0.403 ft 1.247 ft
Maximum heading error 9.54° 11.06°

These are the frozen driving-reference measurements, verified unchanged in 16 paired V89 Race5 replays; they are not a new V89-versus-Pollen run or a new V89 speed record. The comparison uses recorded policy-specific line-hold settings. Matching Pollen braking measurements are unavailable. The sustained-speed row is omitted pending clarification: the preserved comparison JSON labels its field in m/s while GitHub's README presents its values as mph. See comparison data and provenance.

The official braking/driving evidence uses deterministic ARM64 CPU MuJoCo, 200 Hz physics, 50 Hz control, wheel frictionloss=0.003 and the motor torque limit equivalent to 1.75 A. Separate x86 replays are portability checks; architecture-dependent trajectories are not pooled with the official results.

180°, 360° and 720° tricks

These tricks are composed around unchanged V89 weights. The external controller adjusts forward/lateral/yaw commands using heading feedback; joint actions still come from V89.

Trick Fresh trials passed Time to rotation threshold Simulation replay
180° turn and rolling exit 16/16 0.86–1.16 s 180° video
360° turn and rolling exit 16/16 1.52–2.24 s 360° video
720° double spin and rolling exit 16/16 2.86–4.40 s 720° video

Each trick was tested in both directions from eight fresh initial joint-noise seeds in CPU MuJoCo under the same 200/50 Hz, 0.003 friction and 1.75 A contract. Trials idle for two seconds, approach for three seconds at forward command 0.30, then turn. Passing requires signed rotation within 15°, no body-ground contact, tilt below 45°, and two final seconds with heading error below 20°, mean absolute yaw rate below 0.5 rad/s and rolling speed above 0.15 m/s. Rotation-threshold time excludes the separately checked recovery period. See 180°/360° trials and 720° trials.

In an existing 50 Hz loop, import trick_controller.py, call TrickController.start(heading_radians, direction=1, degrees=720), and feed update(heading_radians, ordinary_13_commands) through the normal observation builder. Direction -1 reverses the turn. cancel() returns command ownership to the caller; inactive operation passes commands through. Preserve physics and observation history at trick boundaries. Heading-only completion is not a substitute for the full recovery checks. See integration notes.

The tests use simulator heading. Hardware heading estimation, physical execution and app-button integration remain unvalidated. Only nominal friction and small initial joint perturbations were tested. No qualified hop or front flip is included.

ONNX inference

After downloading this repository, install NumPy and an ONNX Runtime appropriate to your platform. The caller supplies the normal MicroDuck 61-value observation, including the previously applied action and current commands; the adapter supplies history, not the robot observation builder.

import sys
import onnxruntime as ort
sys.path.insert(0, "tools")
from evaluation_policy import ObservationHistory

session = ort.InferenceSession("policy.onnx")
history = ObservationHistory(256)
# Once per 50 Hz control tick, using your observation builder and clock:
packed = history.observe(frame_61, simulation_time)
action = session.run(None, {session.get_inputs()[0].name: packed[None]})[0]

Verify the distributed files with the root SHA256SUMS and the preserved release checksums before integration. Code, models and evidence use Apache-2.0. The releases are inference-only: optimizer/critic state is not included.

Racing, Ray and artifact storage

V90 Laguna adds a racing command controller over the same V89 base. It is a research bundle: fresh racing validation improved, but combined skate → trick → race → skate behavior passed only 10/48. V89 remains the general-purpose recommendation.

Ray compute schedules CPU/GPU jobs by resources and validated capabilities; the head is also eligible. Optional MinIO/S3 stores private artifacts by SHA-256 with verified downloads. These are execution/storage facilities, not policy-qualification evidence. Follow the privacy guide; operator credentials and private endpoints are excluded. The canonical GitHub repository contains the full reproducible workbench and research ledger.

When using compute/rayctl directly from an HF download, run chmod +x compute/rayctl first; the HF upload API preserves its bytes but may not retain Git executable mode.

Downloads last month
43
Video Preview
loading