Unity ML-Agents

박용민·2024년 10월 11일

ML-Agents

  1. 에이전트환경 내에서 행동을 취하고, 환경은 해당 행동에 따라 변화한 상태와 발생한 보상을 다시 에이전트에게 전달한다.
  2. 에이전트는 이 정보들을 통해 학습을 진행하고 다시 새로운 상태에 대한 행동을 결정한다.
  3. 환경은 다시 해당 행동에 대해 에이전트에게 상태와 보상을 전달한다.

ML-Agents 파이썬 패키지

pip install mlagents

3D BALL

Initialize 함수

public override void Initialize(){
	m_BallRb = ball.GetComponent<Rigidbody>();
    m_ResetParams = Academy.Instance.EnvironmentParameters;
    SetResetParameters();
}

CollectObservations 함수

  • 에이전트에게 전달할 벡터 관측의 요소를 결정하는 역할
  • 3DBall 환경에서 박스의 x,z축 회전량과 공과 판의 상대 거리의 (x,y,z) 좌표, 공의 속도의 x, y, z 방향 값 까치 총 8개의 값을 벡터 관측에 추가
public override void CollectObservations(VectorSensor sensor){

	if (useVecObs){
    	sensor.AddObservation(gameObject.transform.rotation.z);\
        sensor.AddObservation(gameObject.transform.rotation.x);
        sensor.AddObservation(ball.transform.position - gameObject.transform.position);
       	sensor.AddObservation(m_BallRb.velocity);
    }
}

OnactionReceived 함수

  • 알고리즘을 통해 결정된 행동에 따라 에이전트 제어, 보상 결정, 에피스드 종료 조건 설정 등을 담당하는 함수
  • 3DBall의 경우 행동 값에 따라 연속적인 값을 통해 박스를 2개의 축 방향으로 회전시키는 제어를 수행한다.
public override void OnActionReceived(ActionBuffers actionBuffers){
	var actionZ = 2f * Mathf.Clamp(actionBuffers.ContinuousActions[0], -1f, 1f);
    var actionX = 2f * Mathf.Clamp(actionBuffers.ContinuousActions[1], -1f, 1f);

    if ((gameObject.transform.rotation.z < 0.25f && actionZ > 0f) ||
    	(gameObject.transform.rotation.z > -0.25f && actionZ < 0f)){
            gameObject.transform.Rotate(new Vector3(0, 0, 1), actionZ);
        }

    if ((gameObject.transform.rotation.x < 0.25f && actionX > 0f) ||
        (gameObject.transform.rotation.x > -0.25f && actionX < 0f)){
            gameObject.transform.Rotate(new Vector3(1, 0, 0), actionX);
        }
        
    if ((ball.transform.position.y - gameObject.transform.position.y) < -2f ||
         Mathf.Abs(ball.transform.position.x - gameObject.transform.position.x) > 3f ||
         Mathf.Abs(ball.transform.position.z - gameObject.transform.position.z) > 3f) {
            SetReward(-1f);
            EndEpisode();
        }else{
            SetReward(0.1f);
     	}
}

OnEpisodeBegin 함수

  • 에피소드가 시작할 때마다 호출되는 함수로 환경의 상태를 초기화하도록 구성한다.
public override void OnEpisodeBegin(){
	gameObject.transform.rotation = new Quaternion(0f, 0f, 0f, 0f);
	gameObject.transform.Rotate(new Vector3(1, 0, 0), Random.Range(-10f, 10f));
	gameObject.transform.Rotate(new Vector3(0, 0, 1), Random.Range(-10f, 10f));
	m_BallRb.velocity = new Vector3(0f, 0f, 0f);
    ball.transform.position = new Vector3(Random.Range(-1.5f, 1.5f), 4f, Random.Range(-1.5f, 1.5f))
            + gameObject.transform.position;
        //Reset the parameters when the Agent is reset.
	SetResetParameters();
}

Heuristic 함수

  • Heuristic Only 모드에서 에이전트를 제어하는 방법을 결정한다.
public override void Heuristic(in ActionBuffers actionsOut){
	var continuousActionsOut = actionsOut.ContinuousActions;
	continuousActionsOut[0] = -Input.GetAxis("Horizontal");
	continuousActionsOut[1] = Input.GetAxis("Vertical");
}

mlagents-learn을 이용한 3DBall 학습

텐서보드에서 결과 확인

학습 모델로 유니티에서 실행

0개의 댓글