duckctl — ネットワークも ssh も無しでロボットに届く
最終更新
duckctl は手元の PC で動き、Bluetooth LE 経由でロボットと話します。スマホアプリの代わりであり、一度も wifi に繋がったことのないロボットに届く唯一の手段です。
これは鶏と卵の問題を解きます。新しいロボットは wifi に繋ぐ必要があるのに、wifi の設定には普通そのロボットに到達する必要があります。duckctl wifi connect は無線経由で、それ自体はネットワークを必要としません。
ロボット上では使わないでください。 リリースの何もこれに依存していません。ロボット側のツールは
robotctlです。
名前が意図的に Bluetooth を含まない点にも理由があります。mediad がロボットに別のメソッド群へ届く第 2 のトランスポートを提供するため、ツールは「いま使っている無線」ではなく「何と話すか」で名付けられています。
入手
cargo run -q -p duckctl -- --name <robot-name> info
# あるいは一度インストールする(ブランチに追従しないスナップショットになる代償あり)
cargo install --path duckctl
以前このツールは自身を
btctlとしてインストールしていました。which btctlで見つかるなら、それはインストール当時のビルドであり、二度と更新されません。cargo uninstall btd --bin btctlで削除してください。
ロボットを探す
duckctl scan
ロボットだけを列挙し、電波範囲内のその他の機器は数を数えるだけで列挙しません。各ロボットは自分の IPv4 アドレスをアドバタイズするので、ssh 先のアドレスもここで得られます。接続は行わず、PIN も不要です。
no address はネットワークに繋がっていないことを意味します。
アドレスだけ欲しいとき
ssh radxa@$(duckctl ip)
ip はアドレスだけを出力します。アドバタイズを読むだけなので接続せず、PIN も不要で、約 1 秒で返ります。答えが古びることもありません。btd は 5 秒ごとにアドレスを読み直します。
この PC とボンド済みのロボットは、そのサービスのアドバタイズを止めることがあります。その場合 ip は接続して net.status を尋ねます。遅く、PIN が要り、しかし必ず答えます。どちらだったかは --verbose が教えます。
名前
改名していないロボットは duck- にシリアル由来の 4 文字を付けた名前です。macOS は 1 台を 2 つの名前で表示します(radxa-zero3 [duck-c51b])が、どちらの半分も --name に使えます。
2 台が同じ名前に応答するのは、ブートローダーがシリアルを空にするボードで起きます。その場合ホスト名から命名されるため、同じイメージから焼いたボードはすべて同名になります。robotctl system set-name ducky で改名してください。
常に同じロボットを相手にする
export DUCK_ROBOT=duck-c51b
export DUCK_PIN=418299
duckctl info
1 コマンドだけ別のロボットに向けるなら --name が優先されます。DUCK_ROBOT= duckctl scan で一時的に既定を無視できます。
改名は
DUCK_ROBOTに追従しません。 ツールは注意してくれますが、変数は手で直す必要があります。さもないと以降のコマンドは応答しない名前を探し続けます。
ウェブコンソール
duckctl open
ロボットを見つけ、ブラウザで http://<address>:8080/ を開きます。インストールするものも、起動するサービスもありません。 mediad がページを内蔵しているので、そのデーモンが動いていればコンソールがあります。
画面にあるもの: カメラ映像とリンクのビットレート・フレームレート・ロス・往復遅延、2 つの仮想スティックと W/A/S/D・Q/E による走行、映像上のドラッグで注視点を指定、enable / init / relax / stop / shutdown、スキルと音声バンクのメニュー、2 Hz の状態ストリームと robot.health。
stopはページが送っている意図をゼロにするだけです。非常停止ではありません。 このシステムにはブラウザからサーボの電源を切る手段が存在せず、ボタンが目立たない見た目なのはそのためです。
関わるポートは 2 つで、入力するのは片方だけです。ページ自身が 8443 のシグナリングサーバーへ接続します。ページは開くのにシグナリングポートが応答しないと言われた場合、ロボットは正常で、あなたと 8443 の間に何かがあります。多くはファイアウォールです。
カメラと走行操作は WebRTC のみなので、ネットワークアドレスを持たないロボットにコンソールはありません。先に無線経由でネットワークへ参加させてください。
wifi 設定(自分側にネットワークが無くても)
duckctl --name <robot> wifi status
duckctl --name <robot> wifi scan
duckctl --name <robot> wifi connect <ssid> --psk <passphrase>
duckctl --name <robot> wifi forget <ssid>
wifi scan はロボットがその場で電波をスキャンします(前回結果の再表示ではない)ので数秒かかります。
wifi connect には心構えが要る挙動が 2 つあります。新しいネットワークへの参加は現在の接続を切るため、wifi 経由の ssh セッションは落ちます——これはコマンドが正常に動いている証拠です。そして最大 45 秒かかることがあります。
net.connect は設計上 WebRTC 経由を禁止されています。ネットワーク設定は無線経由でも可能でなければならないからです。
状態・バージョン・更新
duckctl --name <robot> info # 名前、シリアル、稼働時間
duckctl --name <robot> health # 制御ループは健全か
duckctl --name <robot> version # API バージョン、リリース、git revision
duckctl --name <robot> update apply
revision が null なら、そのリリースは CI ではなく誰かのノート PC でビルドされたものです。 妙な問題を追うとき役に立ちます。
更新系の語彙は robotctl update と同一なので、ロボットで覚えたコマンドがそのまま使えます。インストールは進捗を表示しながら数分かかり、完了時に接続が切れます。ロボットがデーモンを再起動し、btd は応答の約 5 秒後に再起動するためです。これは更新が正常に動いている証拠です。