YouDuck.ai

robotctl reference

Last updated

robotctl runs on the robot. This page groups its commands; each has a page of its own with the output explained and the misreading it invites.

A page per command

This page groups them. Each command has its own page with the output explained and the misreading it invites:

Group Commands
Diagnosis version · health · monitor
Configuration configure
Joint power robot init · robot relax
Gamepad pad status · pad pair · pad forget
Voice quack · chorale
Network net status · net scan · net connect · net forget
Identity and power system info · system pin · system set-name · system set-pin · system reboot
Updates status · check · apply · rollback · log · show · watch · select · pin · reset-to-golden

Privilege

  • Read-only commands need none.
  • Anything that changes the robot needs sudo, or membership of configd’s --allow-user / --allow-group, or updater.toml’s allow_uids / allow_gids.

Diagnosis

robotctl version    # running vs installed, per daemon
robotctl health     # hardware and software in one report, non-zero when unhealthy
robotctl monitor    # requested vs applied, with the reason when they differ

version is first when anything is wrong. A daemon serving old code after an update looks exactly like the fix you just shipped not working.

health exits non-zero when the robot is unhealthy or unreachable, so it gates a script directly. A hot motor or a pinned component is reported but does not affect the exit code — information, not a verdict.

Configuration

sudo robotctl configure

An interactive editor over /etc/robot/robotd.toml with three properties worth trusting: it cannot disagree with the daemon (same crate, same schema, key list pinned by a test), it cannot eat your file (only changed keys are written; reverting removes a key rather than pinning a default), and it cannot write a file robotd refuses to start on (validated through the daemon’s own loader, written atomically).

Your own policy

[policy]
walk = "/home/radxa/my_walking.onnx"
sudo systemctl restart robotd

Your paths survive updates. A release replaces the binaries and policies it ships, not the file that points elsewhere.

Joint power

sudo robotctl robot init          # power up, ramp to home over ~2 s
sudo robotctl robot relax --yes   # cut power; the robot collapses

init moves every joint — have the robot on its stand.

Three ways to stop, which are not interchangeable: relax cuts power and the robot falls; pressing Start again stops the policy and it keeps standing; robot.stop zeroes velocity and it keeps standing.

Gamepad

robotctl pad status
sudo robotctl pad pair
sudo robotctl pad forget 78:86:2E:BB:13:28

See Pair a gamepad and Gamepad controls.

Voice

robotctl quack
robotctl chorale

Each robot’s voice bank comes from its SoC serial, so the one that answers is the one you are SSH’d into. A robot with no voice says so, which is why silence always means the wrong duck.

chorale is off by default and invisible when off — a duck that has not opted in puts nothing on the air.

Network, identity, power

robotctl net status / scan
sudo robotctl net connect <ssid> --psk <passphrase>
robotctl system info / pin
sudo robotctl system set-name <name>
sudo robotctl system reboot

Updates

robotctl update status / check / log / show / watch
sudo robotctl update apply daemon
sudo robotctl update rollback daemon
sudo robotctl update select daemon 0.1.4
sudo robotctl update pin daemon 0.1.4
sudo robotctl update reset-to-golden daemon

Every update is signature-verified, health-gated and reversible.

On a dev board, apply daemon without --ref is usually a downgrade. Its meaning is “install what the stable channel offers”, not “install the newest thing”.

Logs

journalctl -u configd -b --no-pager | tail -40
journalctl -b -u robotd -u updaterd -u btd -u configd   # when updaterd will not start
journalctl -b -u robot-boot-check                        # did the robot roll back on its own
robotctl update log