Skip to content

Latest commit

 

History

History
112 lines (87 loc) · 4.93 KB

README_JP.md

File metadata and controls

112 lines (87 loc) · 4.93 KB

TableTennisAI

バージョン: Unity2019.4.20f1

MLAgentsを使って、卓球をするAIを作ってみたプロジェクト

⚠️AI (期待されたモデル) は完成していません


目次


学習について

概要

卓球台を挟んだ2人のAgentで1グループとして構成しています。学習の方向性としては、攻撃を仕掛けるというよりも、より長くラリーが続くように学習させます。 以下の Observation, Action, Rewardの設定は、すべてAgentのスクリプトにXMLコメントとして明記されています。 それに加え、学習の改善履歴やID別の変更点が書かれています。(かなり長いので、障るなら削除して構いません。)

Observation(観測)

観測しているものは主に6つ 座標は絶対座標

  • 自分(ラケット)の座標 (Vector3型,XYZ3つの数値)

  • 球の座標 (Vector3型,XYZ3つの数値)

  • テーブルの座標 (Vector3型,XYZ3つの数値)

  • 反対側のバウンドエリアの座標 (Vector3型,XYZ3つの数値)

    • 卓球のルールとして、球を打って相手の陣地の机にバウンドさせる必要があるので、そのバウンドさせるエリアがどこにあるかを観測
  • 自分(ラケット)の角度 (Vector3型,XYZ3つの数値)

  • ボールの速度 (Vector3型,XYZ3つの数値)

観測の種類は6つ、Observationはfloat数値で測るので計18つ

Action(行動)

Agentが取れる行動のパターンは主に2つ

  • 移動する
    • Rigidbody.positionで移動
      自分が動ける範囲をmoveAreaで指定しており、その範囲を超えられないよう調整される
  • 角度を変える
    • Transform.Rotate(Vector axis, float angle) で角度変更。X,Y,Zの3軸

行動の種類は6つ、すべてfloat値

Reward(報酬)

正の報酬

条件 報酬値 補足
球がラケットに当たる 0.3 当たったことをほめる
球が相手の陣地でバウンドする 0.15 向こうまで届かせたことをほめる
時間経過(Frame毎) 1 / 最大ステップ(5000) なるべく長い間ラリーが続くようにする
球を打ってから相手の陣地につくまで(Frame毎) 球とその陣地との距離が近いほど大きい報酬 届かせるよう仕向ける

負の報酬

条件 報酬値 備考
地面に落ちる -0.5 エピソードを終了する
ネットに掛かる -0.4 エピソードを終了する
2Frame間で動いていない(Frame毎) -0.05 動くよう仕向ける
範囲外のところに移動(フレーム毎) -0.02 範囲外に出ないよう仕向ける

Episode終了条件

Episodeが終了する条件

  • 打てない状態で打ったとき(2回連続で打ったとき)

  • 自分の陣地で球をバウンドさせたとき

  • 球が落ちた時

  • 球がネットに掛かったとき

モデルについて

yamlファイル設定

学習のステップ数や処理方法などを記したTableTennis.yamlを見れば分かりますが、

  • 余裕を持たせてmaxstep: 1000000 にしてあります。

学習実行時のコマンド

学習を実行させる際は、

cd (リポジトリがあるパス)~~/TabletennisAI
  • mlagentsのパスを通したうえで、以下のコマンドで学習開始
mlagents-learn ./TableTennis.yaml --run-id=(自分で作成したID) --torch-device cuda

🚩 run-idは自分で作成し、実際に学習する本体があるMLAgentsのパスのconfig以下に、その名でファイルが生成されます。 (このプロジェクトにあるresultsは、そのファイルを引っ張ってきた)

❗ 各自でMLAgentsを実機に導入し、MLAgentsのパスを通しておかないと学習できません

ML-Agents導入方法については以前にこちらでツイートしたことがあるので、参考にしてください

🚩 --torch-device cuda は、GPUで学習するときに必要なものなので、なくても構いません