バージョン: Unity2019.4.20f1
MLAgentsを使って、卓球をするAIを作ってみたプロジェクト
目次
卓球台を挟んだ2人のAgentで1グループとして構成しています。学習の方向性としては、攻撃を仕掛けるというよりも、より長くラリーが続くように学習させます。 以下の Observation, Action, Rewardの設定は、すべてAgentのスクリプトにXMLコメントとして明記されています。 それに加え、学習の改善履歴やID別の変更点が書かれています。(かなり長いので、障るなら削除して構いません。)
観測しているものは主に6つ 座標は絶対座標
-
自分(ラケット)の座標 (Vector3型,XYZ3つの数値)
-
球の座標 (Vector3型,XYZ3つの数値)
-
テーブルの座標 (Vector3型,XYZ3つの数値)
-
反対側のバウンドエリアの座標 (Vector3型,XYZ3つの数値)
- 卓球のルールとして、球を打って相手の陣地の机にバウンドさせる必要があるので、そのバウンドさせるエリアがどこにあるかを観測
-
自分(ラケット)の角度 (Vector3型,XYZ3つの数値)
-
ボールの速度 (Vector3型,XYZ3つの数値)
観測の種類は6つ、Observationはfloat数値で測るので計18つ
Agentが取れる行動のパターンは主に2つ
- 移動する
Rigidbody.position
で移動
自分が動ける範囲をmoveArea
で指定しており、その範囲を超えられないよう調整される
- 角度を変える
Transform.Rotate(Vector axis, float angle)
で角度変更。X,Y,Zの3軸
行動の種類は6つ、すべてfloat値
条件 | 報酬値 | 補足 |
---|---|---|
球がラケットに当たる | 0.3 | 当たったことをほめる |
球が相手の陣地でバウンドする | 0.15 | 向こうまで届かせたことをほめる |
時間経過(Frame毎) | 1 / 最大ステップ(5000) | なるべく長い間ラリーが続くようにする |
球を打ってから相手の陣地につくまで(Frame毎) | 球とその陣地との距離が近いほど大きい報酬 | 届かせるよう仕向ける |
条件 | 報酬値 | 備考 |
---|---|---|
地面に落ちる | -0.5 | エピソードを終了する |
ネットに掛かる | -0.4 | エピソードを終了する |
2Frame間で動いていない(Frame毎) | -0.05 | 動くよう仕向ける |
範囲外のところに移動(フレーム毎) | -0.02 | 範囲外に出ないよう仕向ける |
Episodeが終了する条件
-
打てない状態で打ったとき(2回連続で打ったとき)
-
自分の陣地で球をバウンドさせたとき
-
球が落ちた時
-
球がネットに掛かったとき
学習のステップ数や処理方法などを記したTableTennis.yaml
を見れば分かりますが、
- 余裕を持たせて
maxstep: 1000000
にしてあります。
学習を実行させる際は、
cd
でTableTennis.yaml
があるパスに以下のコマンドで移動。
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で学習するときに必要なものなので、なくても構いません