A Tiny biped duck robot 🦆 https://pollen-robotics.com/microduck
  • Rust 84.5%
  • Shell 8.2%
  • HTML 2.8%
  • Python 2.2%
  • C 1.1%
  • Other 1.1%
Find a file
Pierre Rouanet 54e0789635
Merge pull request #526 from pollen-robotics/auto-rollback-opt-in
updaterd: automatic rollback is off unless asked for
2026-11-04 17:34:51 +01:00
.cargo board-test: exercise the binaries that ship, not an example that doesn't (#27) 2026-08-05 09:43:25 +02:00
.github/workflows robotctl configure --allow-dev-daemon: a dev board in one command 2026-11-03 14:50:22 +01:00
btd updater: anonymous usage telemetry to PostHog, with an opt-out 2026-10-30 10:12:01 +01:00
configd configd: back the pad reconnect sweep off, and say why classic is paged 2026-10-30 09:05:02 +01:00
deploy updaterd: automatic rollback is off unless asked for 2026-11-04 12:38:25 +01:00
docs The update log says STUCK for a release left live, not "refused" 2026-11-04 16:00:42 +01:00
duck-ble btd: advertise an extended twin so a Linux laptop can connect 2026-10-01 12:30:07 +02:00
duck-control robotd: a servo unplugged mid-run is degraded, as at boot 2026-11-04 11:30:24 +01:00
duck-detect uyvy: the camera's pixels move out of duck-detect, which nothing else can link 2026-09-15 12:46:39 +02:00
duck-ether duck-ether: be a bad radio, and the chorale bug appears 2026-09-01 14:20:58 +02:00
duck-ipc-proto The update log says STUCK for a release left live, not "refused" 2026-11-04 16:00:42 +01:00
duckctl The update log says STUCK for a release left live, not "refused" 2026-11-04 16:00:42 +01:00
hooks The duck detector comes from the Hub, the way the policies do 2026-09-10 16:43:50 +02:00
kinematics apply clippy optimizations 2026-09-28 09:54:57 -03:00
mediad updater: anonymous usage telemetry to PostHog, with an opt-out 2026-10-30 10:12:01 +01:00
netpadd Keep the owner's config and sign-in across OS updates 2026-10-28 15:44:02 +01:00
nfc nfc: drive the beta board's ST25R100, on both antennas 2026-10-06 16:16:13 +02:00
odometry odometry: ALPHA16 is the default anchor set 2026-09-13 14:53:40 +02:00
pad-imu cargo fmt 2026-09-09 17:20:30 +02:00
pad-map udp-pad: the duck opens its mouth and the laptop makes the sound 2026-10-19 16:09:27 +02:00
padd Adopt old edits on the first write too, and trim the layer helpers 2026-10-29 10:15:51 +01:00
pet-detect The petting classifier ran a hundred FFTs a second through silence 2026-09-02 15:38:02 +02:00
robotctl The update log says STUCK for a release left live, not "refused" 2026-11-04 16:00:42 +01:00
robotd Merge branch 'main' into auto-rollback-opt-in 2026-11-04 12:53:54 +01:00
robotd-params updaterd: automatic rollback is off unless asked for 2026-11-04 12:38:25 +01:00
scripts updaterd: automatic rollback is off unless asked for 2026-11-04 12:38:25 +01:00
sounds Read a beta's SoC serial from the kernel, not U-Boot 2026-10-15 17:42:16 +02:00
spaces build(deps-dev): bump vite in /spaces/policy-playground/web 2026-10-29 11:34:32 +00:00
test-support updaterd: automatic rollback is off unless asked for 2026-11-04 12:38:25 +01:00
tof vetbook: count new surface seen, not every frame's sweep 2026-10-14 09:57:41 +02:00
updater The update log says STUCK for a release left live, not "refused" 2026-11-04 16:00:42 +01:00
uyvy uyvy: the camera's pixels move out of duck-detect, which nothing else can link 2026-09-15 12:46:39 +02:00
xtask updaterd: automatic rollback is off unless asked for 2026-11-04 12:38:25 +01:00
.gitignore A venv beside the Space, so uv run app.py is the command it looked like 2026-09-08 18:20:55 +02:00
AGENTS.md docs: WebRTC is the default transport, and a FAQ that says so 2026-09-14 13:24:44 +02:00
Cargo.lock Prepare release 0.18.5 2026-11-04 16:00:37 +01:00
Cargo.toml Prepare release 0.18.5 2026-11-04 16:00:37 +01:00
CLAUDE.md docs: WebRTC is the default transport, and a FAQ that says so 2026-09-14 13:24:44 +02:00
CONTRIBUTING.md Merge nfc-pad-pairing into beta-nfc 2026-10-06 16:00:06 +02:00
LICENSE Create LICENSE 2026-08-26 13:34:00 +02:00
README.md padd: remap the gamepad so each part of the pad has one job 2026-10-01 17:15:54 +02:00

microduck

Microduck

A tiny biped robot that moves using reinforcement learning policies.

Get yours here · Cheat sheet · Training the policies · How it works · Contributing

CI


This repo is the duck's brain. About 25 cm and 800 g of robot, run by a handful of daemons on a Rockchip RK3566: a 50 Hz control loop driving fifteen servos from neural policies, the radios and the camera, and the update machinery that gets new software onto a robot without bricking it.

Everything you need to run a Microduck is here. If you want one, get yours here.

The policies it runs are trained next door, in microduck_rl — MuJoCo and PPO, the sim2real recipe, and the export to ONNX that this repo loads.

It does things

It walks. Pick up a gamepad and drive. It rolls. Put wheels on, ask for roller mode, and it loads the other brain.
It picks things up. Beak to the floor, one button. It gets back up. Knock it over and it stands itself up.

It also sits, kicks a ball, rolls forward on command, and quacks in a voice that is its own.

Where to find things

You have a duck

Cheat sheet Every robotctl command: drive, configure, voice, chorale, theremin, wifi, updates, logs. Start here.
Gamepad The full button mapping, and pairing a pad — once per pad, plus what to do when it will not bond.
duckctl The robot from a laptop over Bluetooth, with no network and no ssh.
Updates Install, roll back, pin. Every update is verified, health-gated and reversible.

You are building on it

microduck_rl Where the policies come from: MuJoCo, PPO, domain randomisation, and the ONNX export this repo loads.
How it works The whole system on one page — the daemons, the bus, how an update reaches a robot — then a page per part.
Set up a dev board From a blank board to a robot that takes branch builds.
Dev cheat sheet Branch builds, release candidates, driving from a laptop, and the restart traps after an update.
Push your branch Build on your machine, install over ssh, about a minute.
The simulated duck No robot on the desk? scripts/duck-sim runs the real daemons against a body in MuJoCo — one duck in a window, or four as machines you log into.
CONTRIBUTING.md Building, testing, layout, conventions, releasing.
Docs index Everything, including the design pages and the open problems.

Under the hood

Rust, no framework, one workspace. robotd owns the control loop and the motor bus; updaterd installs signed releases and rolls them back when a robot comes up unhealthy; configd owns wifi and identity; btd is the Bluetooth path a phone uses; padd reads the gamepad; mediad streams the camera over WebRTC; tofd serves the depth sensor. They talk over one JSON-RPC contract on Unix sockets, and every client — the app, the console, the gamepad, your script — sends exactly the same calls.

The interesting decisions are written down: docs/design/ is why things are the way they are, and docs/project/ is what has gone wrong and what would close it.

A note on ducks

No duck was harmed in the making of this robot. Several were consulted.