パス連携¶
通常プレーでは PassPlan を出し手・受け手の共通契約として使います。受け手の現在位置ではなく、計画された受領点へ直進パスを送り、受け手はキック前からその地点へ先回りします。
処理の流れ¶
PassPlanMetricが各受け手の現在点・周辺点を交互に評価します。受け手の先着可否と敵の迎撃を同じキック初速・ボール減速で判定し、最低スコアを満たす計画を選びます。- 割当処理が出し手・受け手を一組として確保します。固定割当などで実現できない場合は、その周期のパス実行を拒否します。
Attackerはシュートを優先し、パスを選ぶ場合は計画の受領点・初速をそのまま使います。PassReceiverSessionは受領点へ移動し、キック後は実測ボール軌道に対してReceiveを実行します。- 飛行中は計画の受け手・受領点を保持します。停止・方向逸脱・相手のキック・タイムアウトなどで解除します。フリーキックとGKの排出は専用の判断経路です。
メッセージ契約¶
契約は PassPlan.msg が正本です。pass_target_id / pass_scores は比較用の旧評価として残しています。有効な計画がない場合、受け手セッションは従来の推薦を使いますが、出し手は旧評価でパスを代行しません。
迎撃評価は経路の離散サンプルによる近似です。計画の成立は実機での成功保証ではありません。
検証¶
「誰かに渡った」ではなく「予定した受け手が・予定した地点で受け取った」を確かめます。シナリオテスト PASS_PLAN_AS_PLANNED がキック時点の計画をラッチし、実際に蹴ったロボット・最初に触れた味方・接触点を計画と照合します。許容誤差はテスト側の定数です。
計画は /world_model に埋め込まれて配信されるだけで、採否の理由はどこにも出ません。テストは併走する記録プロセスで /world_model と /robot_select_results を購読し、共通ゲートの各条件と割当結果を時系列で残します。落ちた段はこの記録から特定します。
このテストと既存のパステストはシミュレータのばらつきが大きいため、CI マトリクスには入れていません。ローカルで複数試行し、成功率で判断してください。1 回の結果で可否を決めないでください。
判定に使う量は推定ではなく実測で出します。キック初速は EKF 推定のボール速度から取り(vision の位置差分は外れ値が大きく、実際には無いシュートを「撃った」と読み違えます)、転がり減速度は回帰で求めて試行ごとに出力します。計画側は設定の減速度を前提に初速を逆算するので、実測値と並べないと設定が効いているかが分かりません。
実測で分かっている制約:
- 支配的な失敗要因は受領点の誤差ではなく、キック時点で計画が生き残っているかです。スコアは 10Hz で大きく変動するため、生成側は保持中に閾値を緩めるヒステリシスを持ちます。
own_goal_penaltyは遮蔽を考慮しない純幾何のため、フィールドのほぼ全域で上限に張り付きます。結果としてゴール角ボーナスが無い受領点は成立しません。- キック初速を上げると飛行時間が縮み、敵の迎撃余地と受け手の到達余地が同時に縮みます。実測(パス距離 3.0m)では受け手の到達半径が 1.76m から 0.46m まで落ち、成立する受領点がほとんど無くなります。迎撃されにくさより候補の枯渇が先に効くため、初速は上げない方が良いです。
- 受け手と敵の到達余地は、同じ台形プロファイルで見積もっています。受け手側だけに先着マージンがあるぶん不利なので、両者の能力値は揃えておかないと、届く受領点まで「間に合わない」として捨てます。
- 計画がキック時点で失効していると、
Attackerはパスではなくクリアを蹴ります。ボールが自陣にある間はチップで前進し、相手ハーフに入ると FINAL_GUARD 分岐がゴール中央へ 6.0 m/s のストレートを撃ちます。どちらもボール軌道だけではパスと区別できないため、検証ではまずKICK分岐ログの分岐名を見てください。STANDARD_PASSが出ていなければ、受領点の誤差を論じる意味はありません。 - 受領点の選定は敵しか見ていませんでした。迎撃評価も遮蔽評価も敵専用なので、パス経路を横切る味方が先にボールへ触れて計画が空振りします。現在は受け手と同じ運動モデルで味方の先着も判定し、先着する味方がいる受領点は候補から落とします。
- 飛行状態(
STATE_BALL_IN_FLIGHT)の推定に依存しないでください。 ボールが飛んでいるかどうかの推定は現状安定しておらず、特に実機で安定しません。シミュレータで期待どおり動いても、それは実機での動作を意味しません。この状態を前提に組んだ判断は、実機では静かに無効化されます。現状AttackerSkillSessionの「出し手を止める」分岐がこの状態を条件にしているため、実機では効きません。新しい判断を足すときは、飛行状態ではなく、そのロボット自身が確実に知っている事実(自分が計画どおりキック指令を出したか等)を根拠にしてください。 - 物理定数は ER-Force の実測に揃えてあります(減速度 0.36 m/s²、キック初速は指令値の約 1.36 倍)。定数が散在していると yaml を直しても一部の経路が旧値で動くため、シナリオ検証では計画の初速・到達時間から到達速度を逆算し、設定が効いていることを毎回確かめてください。