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 ofconfigd’s--allow-user/--allow-group, orupdater.toml’sallow_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 daemonwithout--refis 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