https://www.youtube.com/watch?v=Js0rBbx3-3E&t=870s
영상을 따라 퐁 에이전트를 실습하고 있는 중인데, 환경 제작까지는 별 문제가 없었다. ML-Agents release 버전이 달라 조금 머리 아프긴 했지만, 공식 API 문서를 보면서 어떻게 해결됐다. 문제는 Heuristic 모드와 Action에 생겼다.
키보드 A와 D로 입력을 받아 조작할 수 있도록 Heuristic()을 설정했는데, 전혀 작동하지 않는다... 게임을 시작하면 애초에 onActionReceived()에 설정한 Episode를 리셋하는 조건조차 실행되지 않고, 공은 저 멀리 날아갔다. 대체 뭐가 문제일까...
디버그를 해도 onEpisodeBegin()까지는 정상실행되고, 나머지는 실행조차 되지 않는다.. 이럴 때가 제일 답답하다. 원인도 모르겠고, 해결방법도 모르겠다...
public override void OnActionReceived(ActionBuffers actionBuffers) {
Debug.Log("onAction" + i++);
enemy.transform.position = new Vector3(ball.transform.position.x, enemy.transform.position.y, enemy.transform.position.z);
if (ball.transform.position.z <= -14.0f)
{
AddReward(-1.0f);
EndEpisode();
}
else if (ball.transform.position.z >= 5.5f)
{
AddReward(1.0f);
EndEpisode();
}
ball_vel_z = RbBall.velocity.z;
if (ball_vel_z > 0 && ball_vel_z_old < 0)
AddReward(0.5f);
ball_vel_z_old = ball_vel_z;
MoveAgent(actionBuffers.DiscreteActions);
}
public void MoveAgent(ActionSegment<int> discreteActionsOut)
{
var act = discreteActionsOut[0];
switch (act)
{
case Stay:
break;
case Up:
agent.transform.position = agent.transform.position + 0.3f * Vector3.left;
break;
case Down:
agent.transform.position = agent.transform.position + 0.3f * Vector3.right;
break;
}
}
// 새로운 에피소드 시작
public override void OnEpisodeBegin() {
Debug.Log("onBegin" + i++);
ball.transform.position = ResetPosBall;
agent.transform.position = ResetPosAgent;
enemy.transform.position = ResetPosEnemy;
RbBall.velocity = Vector3.zero;
ball.transform.rotation = Quaternion.identity;
RbAgent.velocity = Vector3.zero;
RbAgent.angularVelocity = Vector3.zero;
RbEnemy.velocity = Vector3.zero;
RbEnemy.angularVelocity = Vector3.zero;
float rand_num = Random.Range(-1.0f, 1.0f);
if (rand_num < -0.5f)
{
velocity = new Vector3(Random.Range(min_ball_speed, max_ball_speed), 0, Random.Range(min_ball_speed, max_ball_speed));
}
else if (rand_num < 0.0f)
{
velocity = new Vector3(Random.Range(min_ball_speed, max_ball_speed), 0, Random.Range(-max_ball_speed, -min_ball_speed));
}
else if (rand_num < 0.5f)
{
velocity = new Vector3(Random.Range(-max_ball_speed, -min_ball_speed), 0, Random.Range(min_ball_speed, max_ball_speed));
}
else
{
velocity = new Vector3(Random.Range(-max_ball_speed, -min_ball_speed), 0, Random.Range(-max_ball_speed, -min_ball_speed));
}
RbBall.AddForce(velocity);
}
// 직접 조작
public override void Heuristic(in ActionBuffers actionsOut) {
Debug.Log("onHeuristic" + i++);
var discreteActionsOut = actionsOut.DiscreteActions;
discreteActionsOut.Clear();
discreteActionsOut[0] = 0;
if (Input.GetKey(KeyCode.A))
discreteActionsOut[0] = 1;
if (Input.GetKey(KeyCode.D))
discreteActionsOut[0] = 2;
}
'IT > ML-Agents' 카테고리의 다른 글
빌어먹을 에러.. (0) | 2021.06.17 |
---|---|
강화학습에 대한 갑작스런 번뜩임 (0) | 2021.06.16 |
Unity에서 ML-Agents package Error (0) | 2021.06.11 |