YouDuck.ai

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/DQ/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

revisionnull なら、そのリリースは CI ではなく誰かのノート PC でビルドされたものです。 妙な問題を追うとき役に立ちます。

更新系の語彙は robotctl update と同一なので、ロボットで覚えたコマンドがそのまま使えます。インストールは進捗を表示しながら数分かかり、完了時に接続が切れます。ロボットがデーモンを再起動し、btd は応答の約 5 秒後に再起動するためです。これは更新が正常に動いている証拠です。

関連