walk-slip

Walk on flat ground with +-1 deg of gear play in every servo, fine-tuned for slippery floors: walk-flat v2 plus 3,000 iterations (7,000 to 10,000) with foot friction randomised over 0.2-1.3 instead of the maker's 0.7-1.3 (our one-change fork Mjlab-Velocity-Flat-Backlash-Slip-MicroDuck), 4096 envs, 58 min on one RTX 5090. Trained in simulation only. In 20 s takes at foot friction 0.2 with a shove every 0.5-1 s it stayed on its feet in 8 of 15 takes against 1 of 15 for walk-flat v2; at normal friction with shoves 9 of 15 against 8 of 15, no difference. Not yet tested on a real Microduck.

A perpetual policy for the microduck (61-D observation, 14 actions, 50 Hz). Runs until told otherwise — a gait for the walk slot.

Run it on a robot

sudo robotctl policy load walk witcheer/microduck-walk-slip

The observation normalizer is baked into policy.onnx; feed raw observations. manifest.json follows schema 2 of the microduck policy manifest (docs/policy-manifest.md in the daemon repo).

Training

  • repo: pollen-robotics/microduck_rl
  • branch: develop
  • commit: 53b8971b6
  • exported from a checkout with uncommitted changes

Results in simulation (v1, 2026-10-13)

What changed: one parameter. Pollen's Mjlab-Velocity-Flat-Backlash-MicroDuck randomises the foot friction at startup over 0.7 to 1.3. Our fork Mjlab-Velocity-Flat-Backlash-Slip-MicroDuck widens that to 0.2 to 1.3. The foot collision geoms carry priority=1, so MuJoCo uses the foot value for every foot contact and a low value models a slippery floor. Rewards, terminations, pushes, the gear-play robot and the curricula are the maker's. The fork is a separate task file registered by one import line in tasks/__init__.py; nothing else in the task changes.

Training: warm start from walk-flat v2 (model_7000), 3,000 more iterations (7,000 to 10,000), 4096 envs, 58 min on one RTX 5090 (about 1.15 s per iteration), one uncut block. Mean reward over 100-iteration windows: 100.4 at 8,000, 104.6 at 9,000, 102.4 at 10,000 (flat from 9,000); fell_over 0.656, 0.518, 0.645 over the same windows.

Proof takes with headless_play in the slip task, walk-slip against walk-flat v2 under identical settings, 20 s each, standing start, samples every 0.1 s. The friction override was checked in the play env first (foot geoms read 0.200 at the slippery setting, 1.000 at normal). A take counts as held when it has no tilt fall and no mid-episode reset (the task's fell_over termination fires at 70 degrees of tilt).

  • Foot friction 0.2 with play pushes every 0.5 to 1 s: 8 of 15 held against 1 of 15 for walk-flat v2 (one-sided Fisher exact p = 0.0071).
  • Foot friction 0.2, no pushes: 12 of 13 against 8 of 13 (p = 0.080, a lean, not a result on its own).
  • Foot friction 1.0 with pushes: 9 of 15 against 8 of 15 (two-sided p = 1.0, no difference).
  • Both slippery conditions pooled: 20 of 28 against 9 of 28 (p = 0.0035).
  • In the held slippery push takes the trunk stayed between 85 and 136 mm.

The gain is in the push condition on a slippery floor. A first set of 5 takes per case read as no gain (3 of 5 against 4 of 5 at normal grip); the 10-take extension reversed that call, so both sets are pooled above.

Not tested: one simulator only, 20 s episodes, a flat floor (no slopes or steps), friction values between the two forced settings, and no real robot. Not yet tested on a real Microduck.

Clip and run log: the microduck-skill-tree dataset carries the reward curve, the queue item, the fork file and every take log. Sibling policies: witcheer/microduck-*.

Simulation only.

Downloads last month
21
Video Preview
loading

Collection including witcheer/microduck-walk-slip