이전 포스팅에서는 ML-Agents 설치 및 세팅을 진행하였고 이제 간단한 Move To Target 프로젝트를 제작해보겠습니다.
1. Agent 스크립트 만들기
프로젝트 안에 Agent용으로 사용할 임의의 스크립트 파일을 1개 생성합니다. (예 : MoveToTargetAgent)
그리고 해당 클래스의 상속 받는 클래스를 MonoBehaviour에서 Agent로 변경하고 목표로할 대상의 Transform 하나를 선언해줍니다.
실패와 성공을 표시해주는 바닥의 SpriteRenderer 도 하나 선언해줍니다.
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Sensors;
public class MoveToTargetAgent : Agent
{
[SerializeField] private Transform target;
[SerializeField] private SpriteRenderer backGroeund;
}
- OnActionReceived 함수 작성
우선 에이전트를 제어할 수 있는 OnActionReceived 함수를 오버라이드해줍니다.
우선 행동 정보(입력 정보)를 액션 정보로 저장해줘야 합니다. 실제 움직이는 것을 가정하여 ActionBuffers를 구현해줍니다.
제작하려는 프로젝트는 2D프로젝트로 X축, Y축으로 움직이기 때문에 2개를 지정해줍니다.
그리고 기본적으로 움직이는 함수를 작성해줍니다.
public override void OnActionReceived(ActionBuffers actions)
{
float moveX = actions.ContinuousActions[0]; // X축으로 움직이는 값
float moveY = actions.ContinuousActions[1]; // Y축으로 움직이는 값
float moveMentSpeed = 5f; // 이동 스피드
transform.localPosition += new Vector3(moveX, moveY) * Time.deltaTime * moveMentSpeed;
}
- Heuristic 함수 작성
Heuristic 함수는 사용자의 의사 결정 로직을 제공하거나 입력 또는 스크립트를 사용하여 에이전트의 수동제어하기 위한 함수 입니다.
위에서 제작한 OnActionReceived 함수에서 사용되는 것과 동일하게 작성하면 됩니다.
public override void Heuristic(in ActionBuffers actionsOut)
{
ActionSegment<float> continuousActions = actionsOut.ContinuousActions;
continuousActions[0] = Input.GetAxisRaw("Horizontal"); //Horizontal
continuousActions[1] = Input.GetAxisRaw("Vertical"); //Vertical
}
* 모방 학습을 수행하려면 Heuristic() 함수에서 에이전트의 수동 제어를 구현하여 모방 학습 알고리즘에 필요한 데모를 Demonstration Recorder를 통해 기록할 수 있도있지만 이번 포스팅에서는 해당 항목을 제외합니다.
- CollectObservations 함수 작성
CollectObservations 함수는 에이전트가 목표를 달성하는 데 도움이 되는 모든 환경 정보를 전달합니다.
예를 들어, 전투 중인 아군 또는 적과의 거리 또는 현재 사용 가능한 탄약 수준이 관찰 대상에 포함될 수 있습니다.
public override void CollectObservations(VectorSensor sensor)
{
sensor.AddObservation((Vector2)transform.localPosition); // 자기 자신 관찰
sensor.AddObservation((Vector2)target.localPosition); // 타겟 관찰
}
- OnEpisodeBegin 함수 작성
OnEpisodeBegin 함수는 각 에피소드가 시작할 때 마다 호출되는 함수로 초기화하는 정보를 담습니다.
타겟이 랜덤으로 나와야 하기 때문에 여기서 랜덤함수를 써서 매번 다른 곳에 출현하도록 합니다.
public override void OnEpisodeBegin()
{
transform.localPosition = new Vector3(Random.Range(-3.5f, 1.5f), Random.Range(-3.5f, 3.5f));
target.localPosition = new Vector3(Random.Range(1.5f, 3.5f), Random.Range(-3.5f, 3.5f));
}
- OnTriggerEnter2D 충돌 로직 작성
대상에게 다가갔을때는 보상을 주고 벽에 다가갔을때는 점수를 차감해서 Agent 에게 보상에 따라 학습할 수 있도록 합니다.
또한 해당 보상을 획득하면 에피소드를 끝내고 다시 시작할 수 있도록 합니다.
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.TryGetComponent(out Target target))
{
AddReward(10);
backGroeund.color = Color.green;
EndEpisode();
}
else if(collision.TryGetComponent(out Wall wall))
{
AddReward(-2f);
backGroeund.color = Color.red;
EndEpisode();
}
}
'AI > ML-Agents' 카테고리의 다른 글
[Unity] ML-Agents 간단 프로젝트 제작 #2 (0) | 2024.02.27 |
---|---|
[Unity] ML-Agents 설치 및 세팅 (0) | 2024.02.27 |