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)마다 도로 위 모든 차량의 좌표와 속도 데이터를 기록하여 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를 바탕으로 시간에 따른 전체 차량의 평균 속도 저하 흐름을 시각화했습니다.
초기 세팅으로 시뮬레이션을 돌렸을 시, 차량들의 평균 속도 그래프
고밀도 초기 환경 설정과 느린 차량(빌런) 투입의 여파로, 시뮬레이션 초반(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를 활성화하여 압도적인 연산 속도를 확보합니다.