📌 프로젝트 개요

프로젝트명

Deep Q-Network 기반 2D 레이싱 자율주행 시뮬레이터

핵심 목표

  • 강화학습(DQN)을 활용한 자율주행 에이전트 학습
  • 시뮬레이션 환경에서 충돌 회피 및 최적 경로 탐색
  • 다양한 맵 환경에서의 일반화 성능 검증

기술 스택

Python
PyTorch
Pygame
DQN
DDQN
Dueling DQN
Visdom
OpenCV

작성자: 조 윤범

🎯 프로젝트 동기 및 목표

개발 배경

  • 교육 목적: 국민대학교 학생들을 위한 DQN 강화학습 실습 과제 개발
  • 실전 학습 환경 제공: 이론만으로는 부족한 강화학습을 직접 구현하며 배울 수 있는 플랫폼 필요
  • 접근성 높은 환경: 실제 RC카 하드웨어 없이도 시뮬레이션으로 자율주행 학습 가능
  • 단계적 학습 지원: 기본 DQN부터 고급 알고리즘까지 점진적 난이도 설계

프로젝트 목표

1. 교육용 강화학습 플랫폼 구축

학생들이 직접 수정하고 실험할 수 있는 환경

2. 완성된 베이스라인 제공

동작하는 기본 코드로 학습 곡선 단축

3. 다양한 실험 지원

보상 함수, 하이퍼파라미터, 알고리즘 변경 가능

4. 실시간 피드백

Visdom 시각화로 학습 과정 직관적 이해

5. 확장 가능한 구조

학생들이 새로운 맵, 센서, 알고리즘 추가 가능

🏗️ 시스템 아키텍처

전체 구조

graph TD A[main.py
학습 메인 루프] --> B[xycarRL.py
래퍼 클래스] B --> C[game.py
시뮬레이터] B --> D[model.py
DQN 모델] C --> E[물리엔진
LiDAR센서] D --> F[신경망
최적화] B --> G[하이퍼파라미터 관리
에피소드 제어
상태 전처리]

주요 모듈

game.py

게임 환경, 물리 시뮬레이션, 센서

model.py

신경망 구조, 학습 알고리즘

xycarRL.py

강화학습 인터페이스

visual.py

실시간 학습 모니터링

🚗 환경 구현 (game.py)

시뮬레이션 환경 특징

1. 차량 물리 모델

  • 입력: 조향각(steering), 선속도(linear velocity)
  • 출력: 위치(x, y), 방향(yaw angle)
  • 물리 계산: 각속도 = (선속도 / 차량길이) × tan(조향각)
  • 기반: 키네마틱 바이시클 모델

2. LiDAR 센서 시뮬레이션

  • 센서 개수: 5개 (기본값, 설정 가능)
  • 탐지 범위: -90° ~ +90° (전방 180도)
  • 출력: 각 방향별 장애물까지의 거리
  • 구현 방식: Ray casting 알고리즘

3. 맵 구조

  • 지원 맵: snake, square, competition
  • 구성 요소: 벽(OBS), 골(GOAL), 워프존(WARP)
  • 충돌 감지: 차량의 20개 포인트로 정밀 충돌 체크

🎮 행동 공간 및 상태 공간

행동 공간 (Action Space)

7가지 이산 행동:

액션 ID 조향 속도 설명
0 좌회전 증가 후진 후진하며 좌회전
1 직진 후진 직진 후진
2 우회전 증가 후진 후진하며 우회전
3 좌회전 증가 전진 전진하며 좌회전
4 직진 전진 직진 전진
5 우회전 증가 전진 전진하며 우회전
6 정지 정지 완전 정지

상태 공간 (State Space)

선택 가능한 상태 요소:

  • 센서 데이터: 5개 LiDAR 거리 값 (정규화: -1 ~ 1)
  • 차량 방향: Yaw angle (선택적)
  • 조향각: 현재 steering 값 (선택적)

기본 설정: 센서(5) + 조향각(1) = 6차원 상태 벡터

🧠 DQN 알고리즘 구현

신경망 구조 (model.py)

기본 DQN

graph LR A[Input Layer
(6)] --> B[Hidden Layer 1
(1024) + ReLU] B --> C[Hidden Layer 2
(1024) + ReLU] C --> D[Output Layer
(7)]

Dueling DQN

graph LR A[Input Layer
(6)] --> B[Hidden Layers
(1024 × 2)] B --> C[Value Stream
→ V(s)] B --> D[Advantage Stream
→ A(s,a)] C --> E[Q(s,a)= V(s) +
[A(s,a) - mean(A(s,a))]] D --> E

학습 기법

  • Experience Replay: 버퍼 크기 1,000,000
  • Target Network: 15 에피소드마다 업데이트
  • ε-greedy: 0.6 → 0.01로 감소

📊 하이퍼파라미터 설정

학습 파라미터

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.6
  • 최종 ε: 0.01
  • 감소 속도: 0.01 per 100 episodes
graph LR A[초기 ε: 0.6] --> B[점진적 감소] B --> C[최종 ε: 0.01]

🎁 보상 함수 설계

보상 체계 (my_reward.py)

게임 중 보상 (reward_in_game)

# 후진 (액션 0~2): -1.0점
# 전진 (액션 3~5): +0.5점
# 정지 (액션 6): -0.5점

설계 의도:

  • 전진 행동 장려
  • 불필요한 후진 및 정지 억제
  • 지속적인 주행 유도

에피소드 종료 보상 (reward_end_game)

# 종료 시: +1.0점

추가 개선 가능 방향

  • 생존 시간 비례 보상
  • 목표 도달 시 추가 보상
  • 부드러운 조향 보너스

📈 학습 모니터링 시스템

Visdom 기반 실시간 시각화 (visual.py)

4가지 모니터링 그래프

1. Reward Value

  • X축: Episode
  • Y축: Total Reward
  • 에피소드별 누적 보상 추적

2. Death Position

  • 산점도 (Scatter plot)
  • 차량이 충돌한 위치 시각화
  • 취약 구간 분석 가능

3. Learning Curve

  • 에피소드당 평균 보상
  • 학습 수렴 여부 확인

4. Loss Graph

  • TD-error 손실 값 추이
  • 신경망 학습 안정성 확인
graph TD A[학습 데이터] --> B[Visdom 서버] B --> C[보상 그래프] B --> D[충돌 위치 그래프] B --> E[학습 곡선] B --> F[손실 그래프]

🎬 결과 분석 기능

학습 결과 저장 및 재생

모델 저장 (자동)

  • 최고 점수 갱신 시 자동 저장
  • 경로: ./save/main_model_XXXXXX.pth
  • 형식: PyTorch state_dict

비디오 생성 (자동)

  • 최고 점수 에피소드를 AVI 동영상으로 저장
  • 경로: ./video/{episode}.avi
  • 차량 궤적, 에피소드 정보 표시

학습된 모델 시각화 (viewer.py)

# 저장된 모델 불러오기
view_epi = 33900
xycar.load_model(view_epi)

# Pygame으로 실시간 시각화
# LiDAR 센서 ray 표시
# 차량 움직임 확인

🔧 주요 구현 기술

1. Experience Replay 버퍼

class ReplayBuffer:
    # 순환 버퍼 (deque) 구조
    # 랜덤 샘플링으로 상관관계 제거
    # (s, a, r, s', done) 튜플 저장

2. Target Network

# 15 에피소드마다 메인 → 타겟 복사
if episode % 15 == 0:
    q_target.load_state_dict(q.state_dict())

3. 상태 정규화

# 센서 거리를 -1 ~ 1로 정규화
normalized = 2 * (distance - min) / (max - min) - 1

4. Loss 함수

  • DQN/DDQN: Smooth L1 Loss (Huber Loss)
  • Dueling DQN: MSE Loss

💡 알고리즘 비교

3가지 DQN 변형 구현

1. DQN (Deep Q-Network)

  • 기본 Q-learning + 신경망
  • Q(s,a) 직접 예측
graph TD A[State] --> B[Neural Network] B --> C[Q-values]

2. DDQN (Double DQN)

  • 액션 선택과 평가 분리
  • 과대평가(overestimation) 문제 해결
# 메인 네트워크로 액션 선택
action = q(s').argmax()
# 타겟 네트워크로 Q값 평가
Q_value = q_target(s')[action]

3. Dueling DQN

  • Value와 Advantage 분리 학습
  • 더 안정적인 학습 가능
Q(s,a) = V(s) + [A(s,a) - mean(A)]
graph TD A[State] --> B[Shared Layers] B --> C[Value Stream] B --> D[Advantage Stream] C --> E[Q(s,a)] D --> E

🚀 핵심 성과 및 특징

기술적 성과

1. 완전한 강화학습 파이프라인 구축

환경 → 에이전트 → 학습 → 평가 전 과정 구현

2. 효율적인 센서 시뮬레이션

Ray casting 기반 LiDAR 구현
충돌 감지 20포인트 정밀 체크

3. 모듈화된 코드 구조

환경, 모델, 학습 로직 분리
재사용 가능한 컴포넌트 설계

4. 실시간 모니터링 시스템

Visdom 4개 그래프 동시 추적
비디오 자동 생성

5. 확장 가능한 설계

맵 추가 용이 (map 모듈)
센서 개수/종류 조절 가능
보상 함수 커스터마이징

🎓 학습 내용 및 인사이트

강화학습 이해 심화

배운 점

  1. Exploration vs Exploitation 트레이드오프
    • ε-greedy 전략의 중요성
    • 초기 탐험이 성능에 미치는 영향
  2. 보상 설계의 중요성
    • Sparse reward 문제
    • 행동 유도를 위한 Reward shaping
  3. 학습 안정화 기법
    • Experience Replay의 효과
    • Target Network의 필요성
  4. 신경망 아키텍처 선택
    • Hidden layer 크기와 성능 관계
    • Dueling 구조의 장점

🔍 개선 가능 방향

향후 발전 방향

알고리즘 개선

  • Rainbow DQN: 여러 기법 통합
  • Prioritized Experience Replay: 중요한 경험 우선 학습
  • Noisy Networks: 파라미터 공간 탐험
  • Multi-step Learning: n-step returns

환경 확장

  • 3D 시뮬레이션: Carla, LGSVL 연동
  • 다양한 센서: 카메라, GPS, IMU 추가
  • 동적 장애물: 움직이는 물체 추가
  • 날씨/조명 변화: 일반화 성능 향상

실제 적용

  • Sim-to-Real Transfer: 실제 RC카 연동
  • ROS 통합: 로봇 운영체제 연계
  • 멀티 에이전트: 여러 차량 동시 학습
graph TD A[현재 시스템] --> B[알고리즘 개선] A --> C[환경 확장] A --> D[실제 적용] B --> E[고급 강화학습 기법] C --> F[더 복잡한 시뮬레이션] D --> G[실제 자율주행 시스템]

📝 프로젝트 회고

성공 요인

  • 체계적인 설계: 모듈화된 코드 구조
  • 단계적 개발: 환경 → 알고리즘 → 시각화 순차 구현
  • 지속적인 테스트: 각 모듈별 검증

어려웠던 점

  • 보상 함수 튜닝: 적절한 인센티브 설계의 어려움
  • 학습 불안정성: 초기 수렴 실패 경험
  • 하이퍼파라미터 탐색: 최적값 찾기 위한 반복 실험

얻은 역량

  • 강화학습 실전 경험: 이론을 실제 코드로 구현
  • PyTorch 숙련도: 신경망 설계 및 학습 파이프라인
  • 문제 해결 능력: 디버깅 및 성능 개선 경험

🎯 결론

프로젝트 요약

본 프로젝트는 DQN 기반 자율주행 RC카 시뮬레이터로, 강화학습의 전체 파이프라인을 직접 구현하여 실전 경험을 쌓은 프로젝트입니다.

핵심 가치

1. 완성도 높은 구현

학습-평가-시각화 전 과정

2. 확장 가능한 구조

모듈화된 설계

3. 실용적 결과

실제 동작하는 자율주행 에이전트

향후 활용

  • 실제 로봇 프로젝트의 시뮬레이션 기반
  • 강화학습 교육 자료
  • 알고리즘 실험 플랫폼

📚 기술 스택 상세

개발 환경

  • OS: Linux / Windows
  • Python: 3.x
  • CUDA: GPU 가속 (선택적)

주요 라이브러리

torch==1.x          # 딥러닝 프레임워크
pygame==2.x         # 2D 게임 엔진
numpy               # 수치 연산
opencv-python       # 비디오 저장
visdom              # 시각화 서버

코드 통계

  • 총 라인 수: ~2,000 lines
  • 주요 클래스: 10개
  • 함수: 50개 이상
graph TD A[Python 3.x] --> B[PyTorch] A --> C[Pygame] A --> D[NumPy] A --> E[OpenCV] A --> F[Visdom] B --> G[DQN/DDQN/Dueling DQN] C --> H[시뮬레이션 환경] D --> I[수치 연산] E --> J[비디오 생성] F --> K[실시간 모니터링]

🙏 Thank You

연락처

GitHub: https://github.com/kurt01124
Email: kurtz01124@gmail.com
연락처: 010-3704-7333
1 / 19