Skip to content
DevelopmentCommands checked against official source

MicroDuck Daemon Simulation: Run robotd Without a Robot

The official duck-sim launcher runs the real robotd control loop and robotctl against a MuJoCo body. Use its plain up mode for policy, IPC and client work; use the container boot mode for systemd and updater work. It does not simulate the motor bus, Bluetooth radio, camera ISP, NPU or hardware encoder.

Source-reviewed on September 23, 2026 at MicroDuck revision e9038949 and microduck_rl revision cb70b792. This site checked the documented commands and launcher source; it did not reproduce the full daemon simulation locally.

Choose the simulator that matches the question.

This is different from the browser experience. The browser simulator is the fastest way to try existing movements. The daemon simulator is for developing the robot software itself: the same robotd, 50 Hz control loop, policies, safety checks, IPC and robotctl drive a MuJoCo body. Official daemon simulation guide ↗

Which MicroDuck simulation route to use
RouteUse it forIt does not establish
Browser simulatorTrying controls and existing movements without installing a toolchain.Local daemon, updater or IPC behaviour.
duck-sim plain modePolicy, control-loop, IPC, console and client development.Motor-bus, Bluetooth, camera ISP, NPU or encoder-driver behaviour.
duck-sim bootsystemd units, provisioning, updater health gates and multi-duck work.Electrical or mechanical hardware validation.

Prepare two pinned checkouts.

Put both repositories under the same parent directory, or set DUCK_SIM_RL to the RL checkout. The launcher expects an RL virtual environment containing duck-body and ONNX Runtime. Building the Rust daemons also requires the toolchain declared by the robot repository.

Create the reviewed simulation pair
git clone https://github.com/pollen-robotics/microduck.git
git -C microduck checkout --detach e90389492bd4da42f60da343983e50cecd43b54b
git clone https://github.com/pollen-robotics/microduck_rl.git
git -C microduck_rl checkout --detach cb70b792312d559a4da09064d92009079671815f
cd microduck_rl
uv sync

The official launcher defaults to ~/Pollen/microduck_rl. If your folders are elsewhere, point it at the absolute RL path instead of moving an existing checkout. Official duck-sim launcher ↗

Start one simulated duck
cd /absolute/path/to/microduck
DUCK_SIM_RL=/absolute/path/to/microduck_rl scripts/duck-sim
scripts/duck-sim status
scripts/duck-sim drive
scripts/duck-sim ctl health
scripts/duck-sim realtime
scripts/duck-sim down

Read health before judging motion.

drive asks for a short forward walk. It is a smoke check, not a gait benchmark. Save status, ctl health, realtime, log and simlog together. A world running below real time changes the timing seen by the policy; the official guide recommends fewer ducks, fewer cameras, then a headless viewer when the loop cannot stay healthy.

Capture the first useful diagnostics
scripts/duck-sim status
scripts/duck-sim realtime
scripts/duck-sim ctl health --json
scripts/duck-sim log
scripts/duck-sim simlog

Use container mode only when it answers a container question.

scripts/duck-sim boot 2 starts two ducks with their daemons under real systemd containers and needs sudo, systemd-nspawn and mmdebstrap. It is valuable for updater, unit ownership and restart-order work. For a policy or IPC change, plain mode starts faster and removes unrelated setup.

Keep the hardware boundary in the report.

The simulated body can expose daemon and client failures. It cannot validate the Dynamixel bus, Bluetooth radio, camera ISP, NPU, hardware encoder, power delivery, printed parts or real floor contact. Label a passing result “daemon simulation at these revisions,” then make a separate hardware plan if the question crosses that boundary.

CONTINUE THE CONVERSATION

What would you like to understand next?

Keep the source, your environment and your observations together.