LoginSignup
0
0

More than 1 year has passed since last update.

AIテニスプレイヤーとVRで試合しよう(MlAgents)-3

Last updated at Posted at 2023-03-06

前回記事

の続きになります
目的
サンプルシーンのラケットに横移動,横振りを追加する

言葉の定義
(縦,横,上下) = (Y,Z,X)

追加点

機能
ラケットの横移動
ラケットの横振り

追加する観測値
ラケットのZ軸の位置,速度 + ラケットの傾き(y) = 3 
を追加する
→OnActionReceivedから変更
AgentのBehaviorParametersのVectorObservation SpaceSizeを9→12に変更

元の(サンプルシーン)のパラメータは9つ
(ラケット,ボール(2) の 位置,速度(2) が x,y (2) +ラケットの傾き(z) = 9)

追加する行動
ラケットの横振り(Z軸周り)
ラケットの横方向(Z方向)の移動
AgentのBehaviorParametersのVectorAction SpaceSizeを3→5に変更
プログラムはOnActionReceived内で変更

その他
球が側面の外に飛び出ることが予想されるので側面に壁を作成しHitWallが壁に当たったことを感知できるようにwallC,wallDを追加

制限
エリアを超えた球を追わないようにZ方向の制限
ラケットを振りすぎないように角度の制限 球に対して迎え撃つように角度を制限

プログラムの変更点

観測値の設定
横方向の観測値 をエリアの中心からの距離で設定

.cs
    sensor.AddObservation(m_InvertMult * (transform.position.z - myArea.transform.position.z));

横方向の速度

.cs
    sensor.AddObservation(m_InvertMult * m_AgentRb.velocity.z);

ラケットのx軸の回転

.cs
    sensor.AddObservation(m_InvertMult * gameObject.transform.rotation.x);

を CollectObservations()に追加

行動の設定

.cs
    var moveY = Mathf.Clamp(continuousActions[3], -1f, 1f) * m_InvertMult;
    m_AgentRb.velocity = new Vector3(moveY * 30f, m_AgentRb.velocity.y, 0f);

ラケットの回転の設定

.cs
    var rotate2 = Mathf.Clamp(continuousActions[4], -1f, 1f) * m_InvertMult;
    m_AgentRb.transform.rotation = Quaternion.Euler(0f, -180f, 55f * rotate2 + m_InvertMult * 90f);
.cs

学習法

追加学習か0から学習するか
実行法

結果

まとめ

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0