Deep Q-Network 기반 2D 레이싱 자율주행 시뮬레이터
작성자: 조 윤범
학생들이 직접 수정하고 실험할 수 있는 환경
동작하는 기본 코드로 학습 곡선 단축
보상 함수, 하이퍼파라미터, 알고리즘 변경 가능
Visdom 시각화로 학습 과정 직관적 이해
학생들이 새로운 맵, 센서, 알고리즘 추가 가능
게임 환경, 물리 시뮬레이션, 센서
신경망 구조, 학습 알고리즘
강화학습 인터페이스
실시간 학습 모니터링
7가지 이산 행동:
| 액션 ID | 조향 | 속도 | 설명 |
|---|---|---|---|
| 0 | 좌회전 증가 | 후진 | 후진하며 좌회전 |
| 1 | 직진 | 후진 | 직진 후진 |
| 2 | 우회전 증가 | 후진 | 후진하며 우회전 |
| 3 | 좌회전 증가 | 전진 | 전진하며 좌회전 |
| 4 | 직진 | 전진 | 직진 전진 |
| 5 | 우회전 증가 | 전진 | 전진하며 우회전 |
| 6 | 정지 | 정지 | 완전 정지 |
선택 가능한 상태 요소:
기본 설정: 센서(5) + 조향각(1) = 6차원 상태 벡터
hyper_param = {
"sensor_num": 5, # LiDAR 센서 개수
"learning_rate": 0.0025, # 학습률
"discount_factor": 0.98, # 할인율 (γ)
"batch_size": 512, # 배치 크기
"min_history": 512, # 학습 시작 최소 경험
"buffer_limit": 1000000, # Replay 버퍼 크기
"update_cycle": 15, # Target 네트워크 업데이트 주기
"hidden_size": [1024, 1024], # 은닉층 크기
"max_episode": 99999999 # 최대 에피소드
}
# 후진 (액션 0~2): -1.0점
# 전진 (액션 3~5): +0.5점
# 정지 (액션 6): -0.5점
설계 의도:
# 종료 시: +1.0점
./save/main_model_XXXXXX.pth./video/{episode}.avi# 저장된 모델 불러오기
view_epi = 33900
xycar.load_model(view_epi)
# Pygame으로 실시간 시각화
# LiDAR 센서 ray 표시
# 차량 움직임 확인
class ReplayBuffer:
# 순환 버퍼 (deque) 구조
# 랜덤 샘플링으로 상관관계 제거
# (s, a, r, s', done) 튜플 저장
# 15 에피소드마다 메인 → 타겟 복사
if episode % 15 == 0:
q_target.load_state_dict(q.state_dict())
# 센서 거리를 -1 ~ 1로 정규화
normalized = 2 * (distance - min) / (max - min) - 1
# 메인 네트워크로 액션 선택
action = q(s').argmax()
# 타겟 네트워크로 Q값 평가
Q_value = q_target(s')[action]
Q(s,a) = V(s) + [A(s,a) - mean(A)]
환경 → 에이전트 → 학습 → 평가 전 과정 구현
Ray casting 기반 LiDAR 구현
충돌 감지 20포인트 정밀 체크
환경, 모델, 학습 로직 분리
재사용 가능한 컴포넌트 설계
Visdom 4개 그래프 동시 추적
비디오 자동 생성
맵 추가 용이 (map 모듈)
센서 개수/종류 조절 가능
보상 함수 커스터마이징
본 프로젝트는 DQN 기반 자율주행 RC카 시뮬레이터로, 강화학습의 전체 파이프라인을 직접 구현하여 실전 경험을 쌓은 프로젝트입니다.
학습-평가-시각화 전 과정
모듈화된 설계
실제 동작하는 자율주행 에이전트
torch==1.x # 딥러닝 프레임워크
pygame==2.x # 2D 게임 엔진
numpy # 수치 연산
opencv-python # 비디오 저장
visdom # 시각화 서버