Skip to main content

1. 커스텀 고속도로 환경 구축 및 정체 시각화

본격적인 PPO 에이전트 학습에 앞서, 우리가 설정한 가설(5%의 에이전트 투입)을 검증하기 위한 '비교군' 역할을 할 베이스라인(Baseline) 환경 을 구축했습니다. 에이전트 개입 없이 100% 사람 운전자 모델(IDM+MOBIL)들만 존재하는 환경을 구성하여, 차량 밀집도 증가 시 자연스럽게 발생하는 유령 정체(Phantom Jam) 현상을 구현했습니다.

1-1. 환경 파라미터 튜닝 및 궤적 시각화

highway-v0 환경의 기본 설정을 덮어씌워 우리 프로젝트에 맞는 2차선 고속도로를 세팅했습니다. 특히 차량 밀도(vehicles_density)를 높여 병목 현상을 유도했으며, 시각적으로 정체 파동(Shockwave)을 명확히 확인하기 위해 show_trajectories=True 옵션을 활성화했습니다. 이를 통해 차량이 급감속할 때 궤적이 붉은색으로 뭉치며 뒤로 밀려나는 현상을 렌더링 창을 통해 직관적으로 확인할 수 있었습니다.

1-2. 에이전트 0대 버그 우회 (Swap Trick)

highway-env 라이브러리 특성상 controlled_vehicles를 0으로 설정하면 내부 초기화 로직에서 NoneType 에러가 발생하는 고질적인 문제가 있었습니다. 이를 해결하기 위해, 초기 환경 생성 시에는 에이전트를 1대 투입하고, 생성 직후 해당 에이전트를 삭제한 뒤 완벽히 동일한 물리 상태를 가진 NPC 객체(IDMVehicle)로 바꿔치기하는 Swap Trick 기법을 적용하여 순수 100% NPC 환경을 성공적으로 구현했습니다.

1-3. 베이스라인 데이터(CSV) 추출

시뮬레이션 루프가 돌아가는 동안 매 스텝(simulation_frequency=15)마다 도로 위 모든 차량의 x,yx, y 좌표와 속도 데이터를 기록하여 baseline_log.csv 파일로 추출하는 로깅 파이프라인을 구축했습니다. 이 데이터는 향후 에이전트를 투입했을 때 정체가 얼마나 해소되었는지 정량적으로 증명하는 핵심 지표로 활용될 예정입니다.

1-4. 트러블슈팅: 유령 정체 인위적 유발 (빌런 차량 투입)

초기 테스트 결과, 100% 인간 운전자 모델(IDM+MOBIL)로만 구성된 2차선 환경에서는 차량들이 완벽한 군집 주행(Platooning)을 하며 정체가 발생하지 않는 현상을 발견했습니다. 시뮬레이터 내 NPC들이 모두 100% 동일한 반응 속도와 목표 속도, 안전거리 기준을 가지고 있었기 때문입니다.

이를 현실적인 고속도로 병목 현상으로 발전시키기 위해, 시뮬레이션 시작 직후 선두 차량 중 1대의 목표 속도를 15m/s(약 54km/h)로 대폭 낮추는 '느린 차량(빌런) 트리거' 코드를 도입했습니다.

속도 편차가 발생하자, 뒤따르던 고속 차량들이 빌런을 피하기 위해 차선을 변경(MOBIL)했고, 이로 인해 옆 차선의 차량들이 연쇄적으로 급브레이크(IDM)를 밟으며 뒤쪽으로 감속 파동이 전달되는 완벽한 유령 정체 현상을 구현해 냈습니다.

1-5. 데이터 기반 정체 파동(Shockwave) 분석

추출된 baseline_log.csv를 바탕으로 시간에 따른 전체 차량의 평균 속도 저하 흐름을 시각화했습니다.

image

초기 세팅으로 시뮬레이션을 돌렸을 시, 차량들의 평균 속도 그래프

고밀도 초기 환경 설정과 느린 차량(빌런) 투입의 여파로, 시뮬레이션 초반(Step 0~10) 전체 차량의 평균 속도가 단숨에 반토막 나는 거대한 충격파(Shockwave) 양상을 데이터로 명확히 확인했습니다.

이후 대열을 정비하며 서서히 속도를 회복하지만, 이 초기 급감속 구간의 깊이(Minimum Speed)를 방어하고 전체 교통 흐름의 변동성을 평탄화(Smoothing)하는 것이 향후 투입될 5% RL 에이전트의 핵심 해결 과제가 될 것입니다.


2. 로컬-Colab 이원화 학습 파이프라인 구축

PPO 알고리즘의 무한 루프 학습이 로컬 PC(노트북)의 하드웨어 리소스에 주는 부담을 최소화하기 위해, '로컬 디버깅 - Colab 무한 학습' 이라는 이원화 파이프라인을 설계했습니다.

2-1. Headless 서버의 한계와 Xvfb 가상 디스플레이

Colab과 같은 클라우드 서버는 모니터가 없는 Headless 환경이므로, render_mode="rgb_array"로 설정하더라도 화면 렌더링 과정에서 에러가 발생합니다. 이를 우회하기 위해 우분투(Ubuntu) 환경에 xvfb를 설치하고 pyvirtualdisplay 라이브러리를 활용해 소프트웨어적인 가상 모니터 를 구동하는 세팅을 완료했습니다.

2-2. 파이프라인 운영 전략 및 최적화

  • 코드 개발 및 시각적 디버깅 (로컬 환경): render_mode="human"을 사용하여 즉각적으로 Pygame 창을 띄우고 차량의 움직임과 코드 로직을 검증합니다.
  • 시각화 테스트 및 비디오 녹화 (Colab CPU 모드): Colab의 GPU 할당량을 아끼기 위해, 렌더링 및 RecordVideo 래퍼를 활용한 영상 추출 작업은 CPU 런타임에서 수행합니다. 프레임 연산은 전적으로 CPU의 몫이기 때문에 GPU 낭비를 막을 수 있습니다.
  • 본격적인 모델 학습 (Colab GPU 모드): 병렬 환경 세팅 및 수백만 스텝의 가중치 업데이트 시에만 T4 GPU를 활성화하여 압도적인 연산 속도를 확보합니다.