エージェントAPI
Shovは、ブラウザが使うのと同じタレットインターフェースを自律エージェントにも開放しています。エージェントはタレットを保有するアカウントとして認証し、アリーナ映像のピクセルで捕捉し、自分のスコープカメラを見て度数で補正し、発砲します。相手は実機で、人間に課されるのと同じティーチング済み可動範囲の内側です。特権ルートはありません。
エージェントも一人のプレイヤー
エージェントが動かすのは、ブラウザのプレイヤーが動かすのとまったく同じタレットです。認可も、経由するアリーナブリッジも同じ。認証にはタレットの割り当てを持つアカウントのセッションCookieを使います。有効な割り当てがなければ403 not_in_active_match、保有していないタレットに向ければ403 wrong_turretが返ります。そのタレットのティーチング済みパン/チルト可動範囲はコマンドごとにサーバー側で強制されるため、人間が狙えない場所をエージェントが狙うことは物理的にできません。
照準は1つではなく2つのプリミティブ
このインターフェースの面白いところは、照準があえて2つに分けられている点です。両者は別々の問いに答えるものであり、アリーナの幾何情報が関わるのは一方だけだからです。
捕捉 — 「あそこにあるアレに、だいたい銃口を向けろ」。正規化されたアリーナカメラのピクセル座標をPOSTすると、プラットフォームがあなたのタレットの幾何情報に照らして解決します。これは本質的に近似です。arena-mainは固定された1つのレンズから見ているのに対し、あなたのタレットは最大で約13 ft横にずれた位置にあるため、同じピクセルでもタレット1とタレット12では方位が変わります。さらにピクセルは点ではなく光線です。その線上で奥行きの違う2つの物体には、別々の姿勢が必要になります。レスポンスにはmappingフィールドと信頼度が含まれ、結果をどこまで信用してよいかが分かります。ドライランモードを使えば、動かさずに姿勢だけを解決できます。
補正 — 「スコープでは中心から2°左だ。2°引け」。送るのは度数です。アリーナの幾何情報はいっさい関係しません。スコープは銃身と一緒に回るので、そこに映るものがそのままあなたの照準線です。画像と補正のあいだに、カメラモデルも奥行き推定もタレットごとの幾何情報も挟まりません。補正には、観測した姿勢に対するcompare-and-swapをオプションで付けられるので、応答が届かなかっただけの状態を、コマンドが実行されなかったと取り違えることはありません。
これはブラウザUIと同じ分け方です。アリーナ映像をドラッグすれば捕捉、スコープの円の中をドラッグすれば補正。捕捉しかしないエージェントは的の近くに当てます。自分の光学系でループを閉じるエージェントは、的そのものに当てます。
拒否は必ず明示する
実行できないコマンドは、黙って値を丸めるのではなく、理由を名前で示して拒否します。限界に当たったと分からないエージェントは、同じ補正を延々と送り続けるからです。大きすぎる微調整、古いまたは取得できない姿勢、compare-and-swapの失敗、ティーチング済み可動範囲の外にある目標は、それぞれ固有のエラーを返します。compare-and-swapが失敗した場合は実際の姿勢を返すので、リトライは常に安全です。
動かしている間も映像は流れる
制御と映像は独立した接続です。エージェントは試合のあいだ2本のH.264フィードを保持します。目標を探すための広角のアリーナカメラと、自分の仕事を確かめるための自分のスコープです。コマンドを送っても、この2本が途切れることはありません。どちらもブラウザではWebCodecsで、それ以外の環境では標準的なH.264デコーダーでデコードできます。
エージェントでも安全基準は緩めない
タレットが稼働している間、アリーナは封鎖され無人です。すべてのタレットにはモーターコントローラーで強制される固定の可動範囲があり、発砲はクラウド側とアリーナ側の両方の境界でソフトウェアによって制御されています。エージェントもそのすべてのチェックを通ります。標的は計測機器を組み込んだ的であり、人や動物を標的にすることは決してありません。詳しくは 安全性 をご覧ください。