Game Development

Unity Ml Agent Ray Perception Sensor를 이용해 보자 본문

Unity/ML Agent( AI )

Unity Ml Agent Ray Perception Sensor를 이용해 보자

Dev Owen 2021. 7. 2. 02:28

유니티 ML Agent에 Ray Perception Sensor를 이용해 보자

현재 ML Agent에서 제공해주는 Ray Perception Sensor를 이용하여 인공지능을 학습시켜 보도록 하겠습니다.

 

[ 관련 자료 ]

ML Agent가 처음이신 분들은 저의 포스팅 중 기본 강의를 보고 오시기 바랍니다 [ 바로 가기 ]

해당 ML-Agent 버전은 2.1.0-exp-1을 사용하고 있습니다.


[  Sensor를 사용하자 ]

저희는 이떄까지 인공지능이 학습을 하기 위해 필요한 정보값을 넘겨주기 위해 아래와 같은 함수를 사용했습니다.

public override void CollectObservations(VectorSensor sensor) { }

위의 함수를 통하여 각각의 정보를 보내며 인공지능이 학습을 하는데 있어 필요한 정보들을 계속 보내주었습니다.

하지만 Sensor를 사용하면 인공지능이 직접 판단하며 정보를 가지게 됩니다. 

간단한 인공지능에 센서를 달아 직접 움직이게 해보도록 하겠습니다.

 

해당 컨퍼넌트를 추가 시켜줍니다. 그리고 Ray에 인식시킬 Tag를 넣어주시기만 하면 됩니다.

나머지는 스크립트에서 보도록 하겠습니다.

아래의 스크립트는 간단한 스크립트 입니다. 값으로 이동 시키고 가장 최단거리로 이동시킬 수 있게 움직일떄 마다 값을 Reward를 - 해줬습니다.

public override void OnActionReceived(ActionBuffers actions)
{
    Vector3 velocity = new Vector3( actions.ContinuousActions[0], 0, actions.ContinuousActions[1]);
    rb.AddForce( velocity, ForceMode.VelocityChange );

    SetReward(-1 / MaxStep);
}

그리고 적에게 부딧힐 경우 점수 1점을 주게하였습니다.

private void OnCollisionEnter(Collision other) 
{
    if ( other.gameObject.CompareTag("Enemy") ) 
    {
        SetReward( +1 );
        EndEpisode();
    }
}

아래는 전체 소스코드 입니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Actuators;
public class BlueAgnet : Agent
{
    [ SerializeField ] Rigidbody rb;
    [SerializeField] Transform target;

    public override void OnEpisodeBegin()
    {
        transform.localPosition = new Vector3(0, 1, 0);
        target.localPosition = new Vector3( Random.Range(-6, 6) , 1, Random.Range(-6, 6));

        rb.velocity = Vector3.zero;
    }


public override void OnActionReceived(ActionBuffers actions)
{
    Vector3 velocity = new Vector3( actions.ContinuousActions[0], 0, actions.ContinuousActions[1]);
    rb.AddForce( velocity, ForceMode.VelocityChange );

    SetReward(-1 / MaxStep);
}

private void OnCollisionEnter(Collision other) 
{
    if ( other.gameObject.CompareTag("Enemy") ) 
    {
        SetReward( +1 );
        EndEpisode();
    }
}
}

해당 스크립트를 넣어주고 학습을 한 결과 아래와 같은 결과물이 나오게 되었습니다.


결론

Sensor라는 컨퍼넌트에 대해서 알게 되었기에 이제 이것을 으용해서 새로운 인공지능을 한 번 만들어 봐야 할 거 같습니다. 간단한것은 Sensor로 어느정도 다 처리가 되기 떄문에 유용하게 사용할 수 있을꺼 같습니다.

Comments