반응형
▶️ 문제 상황
현재 졸업프로젝트에서 강화학습을 이용한 자동 주차 시뮬레이션을 구현하려고 한다. 시뮬레이션 환경은 Unity로, 강화학습 모델은 Python(Pytorch)을 이용해 구현할 예정이다.
내가 이번 주차에 맡은 역할은 Unity로 주차장 시뮬레이션 환경을 개발하는 것이다. 우리는 강화학습의 매 에피소드 마다 새로운 주차 환경을 제공함으로써, 다양한 환경에서 자동차가 주차를 학습할 수 있도록 해야 한다.
그렇기 때문에 매 에피소드 마다 주차 환경을 변경해주는 환경을 구현하고자 한다. 우리는 3가지 주차 방식(평행 주차, 전방/후방 주차)에 따라 어느 방식이 가장 효율적인지 확인해야 하기 때문에, 모든 주차 방식을 시행할 수 있는 환경을 만들고자 한다.
▶️ 구현 방법
먼저 아래와 같이 시뮬레이션 환경을 만들어주었다.
다음은 실행 버튼을 누를 때마다 각 주차 공간에 자동차가 자동으로 위치하는 것을 구현하기 위해 아래와 같이 코드를 작성해주었다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ParkingManager : MonoBehaviour
{
public Vector3[] parkingSpacesPositions; // 주차 공간 위치
public GameObject[] carPrefabs; // 차량 프리팹 할당
public int parallelParkingCount; // 평행 주차 공간 개수
void Start()
{
ResetParkingLot();
}
void ResetParkingLot()
{
int firstEmptySpace = Random.Range(0, parallelParkingCount);
int secondEmptySpace = Random.Range(parallelParkingCount, parkingSpacesPositions.Length);
while (firstEmptySpace == secondEmptySpace)
{
secondEmptySpace = Random.Range(0, parkingSpacesPositions.Length);
}
for (int i = 0; i < parkingSpacesPositions.Length; i++)
{
if (i == firstEmptySpace || i == secondEmptySpace)
{
continue;
}
Quaternion rotation = Quaternion.identity;
// 평행 주차 공간에 차량 배치 시 90도 또는 270도 회전
if (i < parallelParkingCount)
{
float angle = Random.Range(0, 2) * 180 + 90; // 90도 또는 270도
rotation = Quaternion.Euler(0, angle, 0);
}
Instantiate(carPrefabs[Random.Range(0, carPrefabs.Length)], parkingSpacesPositions[i], rotation);
}
}
}
이후 위에 작성한 스크립트를 Hierarchy의 주차장 환경의 최상단 GameObject에 추가해준다.
그 다음, 각 주차장의 위치, 자동차 Prefab, 평행 주차장의 개수 등을 입력해주면 끝이다.
▶️ 실행 결과
시작 버튼을 클릭할 때마다, 평행 주차 공간에 빈 자리 1개, 수직 주차 공간에 빈 자리 1개가 생성되는 것을 확인할 수 있다.
반응형
'강화학습' 카테고리의 다른 글
[강화학습] 탐험(exploration)과 이용(exploitation) (0) | 2024.03.31 |
---|---|
[강화학습] 강화학습의 기초 용어 (0) | 2024.03.31 |