Skip to content

概要

  • 本ドキュメントは Crane におけるパスの上位決定・受け手予約・受取準備・スイッチ抑制の仕組みを説明します。
  • 目的: キック中に受け手が別スキルへ移行して取りこぼす事象を低減し、安定したパス連携を実現すること。

全体像

  • 上位層でパス先ロボットを決定し、WorldModel の GameAnalysis に載せて配信。
  • Attacker は配信されたパス先に基づいてキックを実施。
  • 受け手側は PassReceiverPlanner が予約(指名)し、Receive スキルを割り当てて受け準備。
  • 頻繁なパス先フリップを抑制するため、上位層の選定にヒステリシスを導入。

関係コンポーネント

  • crane_world_model_publisher:
    • GameAnalysis.pass_scores 算出に加え、pass_target_id を選定・配信。
    • 連続切替え抑制(ヒステリシス)を実装。
  • crane_session_controller:
    • GameAnalysis.pass_target_idPlannerContext["AttackerSkill"]["pass_receiver"] に反映。
    • pass_receive セッションで受け手ロボットに Receive スキルを割当(予約)。
  • crane_robot_skills::Attacker:
    • pass_target_id を優先してパス先・キックターゲットを決定。
  • PassReceiverPlanner:
    • 受け手ロボットに Receive を割当。キック中は能動受取、キック前はその場停止しつつボールを注視。

メッセージ拡張

  • crane_msgs/msg/analysis/GameAnalysis.msg に以下を追加:
    • int32 pass_target_id (-1 の場合は未選択)
  • 既存の FloatWithID[] pass_scores は維持(降順、先頭が最良)。

選定とスイッチ抑制(上位レイヤ)

  • 実装: crane_world_model_publisher 内で pass_scores をもとに pass_target_id を選定。
  • 抑制パラメータ(ROS 2 パラメータ):
    • pass_target.min_hold_duration_sec 既定 1.5
    • pass_target.min_improvement_margin 既定 0.2
  • 振る舞い:
    • 直近に選ばれたターゲットは一定時間ホールド。
    • ホールド中により高いスコアが出ても「改善幅」がしきい値未満なら切り替えない。

パス評価の基準点(動くボール対応)

  • パス評価時に使用するボール基準点は次の通り:
    • ボール停止時: 現在のボール位置。
    • ボール移動時: 予測停止位置(getPredictedPosition(getStopTime()))。
  • これにより、移動中のボールでも一貫したパス線(基準点→受け手)評価が可能になり、誤評価を低減します。

Attacker の動作

  • AttackerState::KICKFORCED_PASSgame_analysis.pass_target_id >= 0 を優先。
  • パス先が自分自身またはキーパーの場合はフォールバック(従来ロジック)。

受け手予約と受取準備

  • SessionControllerGameAnalysis.pass_target_idPlannerContext に格納。
  • PassReceiverPlanner が該当 ID を予約し、Receive スキルを割り当てて実行。
    • ボールが十分動いている、または ongoing_kick.is_kicker_friend が真のときは能動受け取り(Receive::update() 実行)。
    • キック前は整列動作を行わず、その場で停止しボールを注視。

セッション設定(例)

  • session/crane_session_controller/config/play_situation/INPLAY.yaml などで pass_receive を追加。
    • 推奨順序: attacker_skill の直後に pass_receive を置く。
  • 例(INPLAY 抜粋):
    • - name: attacker_skill- name: pass_receive → その他

Receive スキル主要パラメータ

  • policy: closest(既定), min_slack, max_slack
  • enable_active_receive: true(既定)
  • enable_redirect: false(既定)、redirect_target, redirect_kick_power
  • robot_acc_for_prediction: 2.5(既定)
  • robot_max_vel_for_prediction: 5.0(既定)
  • enable_software_bumper: true(既定)、software_bumper_start_time

WorldModelPublisher パラメータ

  • pass_target.min_hold_duration_sec: ターゲットの最低保持時間(秒)
  • pass_target.min_improvement_margin: 早期切替のための最小改善幅

動作確認手順(抜粋)

  • ビルド(ワークスペースルートで実行)
    • colcon build --symlink-install --packages-select crane_msgs crane_world_model_publisher crane_robot_skills crane_session_controller
  • 起動(例)
    • ros2 launch crane_bringup crane.launch.py sim:=true
  • 可視化・デバッグ
    • 受け手整列点やスコアは可視化トピックに反映(Session/WorldModel の可視化レイヤ参照)。
    • ongoing_kick, pass_scores, pass_target_id/world_model を購読して確認。

チューニング指針

  • スイッチ抑制が強すぎる場合: pass_target.min_hold_duration_sec を短く、または min_improvement_margin を小さく。
  • 受け取り遅延がある場合: Receiverobot_acc_for_prediction, robot_max_vel_for_prediction を上げる。

既知の注意点

  • 受け手が物理的に不達な位置にいる場合は Receive 側が closest へフォールバック。
  • pass_target_id が未選択(-1)の場合、Attacker はパス分岐に入らず、PassReceiverPlanner はロボットを取得しません(受け手予約なし)。

変更ファイル一覧(実装反映)

  • crane_msgs/msg/analysis/GameAnalysis.msg: pass_target_id の追加
  • crane_world_model_publisher: pass_target_id の選定とスイッチ抑制
  • crane_robot_skills/src/attacker.cpp: 上位決定の優先適用
  • session/.../pass_receiver_planner.hpp: 受取準備ロジックの最適化
  • session/.../play_situation/*.yaml: pass_receive の追加