Microduck Electric Slide Controller
Latest simple-v3 controller and full simulation for 25 Pollen Robotics Microducks performing the morphology-specific 16-count Electric Slide in a 5×5 formation. The earlier canonical 18-count literal-v2 remains included for comparison and reuse.
Simple-v3 choreography
| Counts | Motion |
|---|---|
| 1–4 | Right, left follows, right, left tap + head bob |
| 5–8 | Left, right follows, left, right tap + head bob |
| 9–12 | Back right, back left, back right, left tap |
| 13–16 | Rock forward, rock back, left forward, right scuff + left pivot |
The official 14-actuator model has neck/head joints but no jaw actuator. The requested beak snap is therefore expressed as a sharp counter-motion of neck pitch and head pitch on counts 4 and 8.
Final simple-v3 25-duck physics gate
| Gate | Result |
|---|---|
| Root-pose writes after reset | 0 |
| Fallen ducks | 0 |
| Inter-duck contacts | 0 |
| Minimum foot liftoffs per duck | 93 |
| Maximum fully airborne fraction | 0.0 |
| Minimum pairwise separation | 1.314 m |
| Minimum trunk height | 0.103 m |
| Mean physical yaw over four pivots | 6.099 rad (349.44°; 87.36°/pivot) |
Download the simple-v3 1600×720 split-screen MP4. The left camera follows the center pink duck from its front; the right camera keeps the full 5×5 flock in frame. The recording is silent because commercial “Candy” audio is not redistributed.
Measured center-duck QC
A second validation layer now tracks the center pink duck's actual body path, heading, body pitch, joint extrema, and foot/floor contacts at 50 Hz. Across the four wall repetitions, 11 counts PASS, 2 are PARTIAL, and 3 FAIL.
The remaining defects are concentrated in the early lateral phrase: counts 3, 5, and 6 fail; count 2 is partial; and count 4 preserves the beak-snap head bob but not a repeatable left-foot tap. These results are published explicitly so future training work can target the failed counts instead of optimizing only the full-show stability score.
See qc/simple_v3/ for the 64-event CSV, 16-count summary, JSON, Markdown
report, and both full-resolution images. The enhanced physics report contains
the underlying 1,730-sample trace, and
code/training/make_center_duck_step_qc.py regenerates every QC artifact.
Simple-v3 files
code/simple_choreography.py: exact 16-count contract and joint/body targets.code/physics_show.py: physics controller, front/wide renderer, and strict diagnostics.code/training/export_simple_reference.py: reproducible 50 Hz reference export.code/training/make_simple_contact_sheet.py: labeled visual QA generation.simple_reference_v3/: choreography CSV, 1,730-frame JSONL, and schema.validation/electric_slide_25_ducks_simple_v3_split_front.physics.json: final gate report.video/: final split-screen render, 16-count contact sheet, and examples.
Literal-v2 background
The first release used supported forward arcs because Pollen's published walking policy did not respond to lateral/reverse velocity commands. That passed generic physics checks but did not read as the Electric Slide. Literal-v2 replaces those arcs with an explicit 18-count, swing-foot/stance-foot retarget.
Controller architecture
- The official 61D→14D Microduck walking policy runs continuously at 50 Hz for balance and physical turning.
literal_choreography.pysupplies count-conditioned body commands and small 14-joint placement biases for side, inward-rear, back, forward, touch/stomp, and scuff phases.- A closed-loop yaw command holds the current wall; count 18 performs the left turn and the next wall settles its final few degrees.
- The resulting joint targets are clipped to official joint limits and applied through MuJoCo position actuators at a 200 Hz physics step.
The free root is reset once and is never written during the dance. All travel, turning, foot strikes, and liftoffs result from actuator forces and contacts.
Microduck cannot cross one leg past the other within its hip-roll limits, so “cross behind” is mapped to the closest feasible inward-and-rear placement.
Official-policy capability audit
Before literal-v2, fixed-command tests were run against the published walking policy for five seconds:
| Requested gait | Net displacement | Foot liftoffs |
|---|---|---|
| Right strafe | 0.0049 m | 0 |
| Left strafe | 0.0037 m | 0 |
| Reverse | 0.0011 m | 0 |
This is why a dedicated foot-placement layer is required. The official yaw command remains useful and performs the quarter-turn with physical steps.
Final 25-duck physics gate
The final scene uses a 5×5, 1.5 m-spaced formation, light sky, checkerboard floor, front-follow close camera on the center pink duck, and a full-formation camera.
| Gate | Result |
|---|---|
| Root-pose writes after reset | 0 |
| Fallen ducks | 0 |
| Inter-duck contacts | 0 |
| Minimum foot liftoffs per duck | 142 |
| Maximum fully airborne fraction | 0.0 |
| Minimum pairwise separation | 1.223 m |
| Minimum trunk height | 0.100 m |
| Mean net displacement | 0.145 m |
Download the final 1600×720 split-screen MP4. The recording is silent; copyrighted “Candy” audio is not bundled.
Files
code/literal_choreography.py: exact count map and joint/body targets.code/physics_show.py: multi-robot controller, renderer, and strict contact diagnostics.code/training/export_literal_reference.py: 50 Hz target export.code/training/make_literal_contact_sheet.py: labeled example generation.code/training/probe_kinematics.py: finite-difference foot/joint mapping.literal_reference/: 18-count CSV and 1,946-frame JSONL joint target release.validation/electric_slide_25_ducks_literal_split_front.physics.json: final full gate report.video/: final video, labeled sheet, and five example images.command_policy/andexperiments/: the earlier human-expression training runs and rejected direct-action clone, retained so others can compare and improve the work.
Reproduction
Retrieve Pollen's official low-level policies from pollen-robotics/microduck-simulator, then run from the companion code tree:
uv run python electric_slide/physics_show.py `
--literal `
--scene electric_slide/generated/literal_25_ducks.xml `
--grid 5 --spacing 1.5 `
--duration 38.91891892 --warmup 1.5 `
--view split --width 1600 --height 720 --fps 30 `
--render electric_slide/generated/electric_slide_25_ducks_literal_split_front.mp4 `
--diagnostics electric_slide/generated/electric_slide_25_ducks_literal_split_front.physics.json `
--strict
uv run python electric_slide/training/export_literal_reference.py `
electric_slide/generated/literal_reference_v2
For simple-v3, use:
uv run python electric_slide/physics_show.py `
--simple --grid 5 --spacing 1.5 `
--view split --width 1600 --height 720 --fps 30 `
--render electric_slide/generated/electric_slide_25_ducks_simple_v3_split_front.mp4 `
--diagnostics electric_slide/generated/electric_slide_25_ducks_simple_v3_split_front.physics.json `
--strict
uv run python electric_slide/training/export_simple_reference.py `
electric_slide/generated/simple_reference_v3
Safety and limitations
- Simulation validation is not real-robot certification. Test one robot first, with a clear floor, remote stop, current/temperature limits, and spotters.
- The 14D biases are open-loop dance references layered onto a feedback balance policy; robust real-hardware deployment still merits domain randomization and one-duck fine-tuning.
- The final turns average slightly under 90 degrees at the exact last video frame because the conservative controller finishes each turn as the next wall begins.
- Commercial music and tutorial frames are not included.
- Review upstream Microduck code/model licenses before redistribution or commercial deployment.
Annotations and joint references are published at Histochemichael/microduck-electric-slide-motion.



