Python 기반 자율주행 시뮬레이션을 위한 OpenDRIVE 및 OpenSCENARIO 생성 라이브러리

자율주행 시나리오 생성을 위한 Python 도구: scenariogeneration 활용법

scenariogeneration은 자율주행 시스템 검증을 위한 오픈소스 파이썬 라이브러리로, OpenDRIVE(.xodr)와 OpenSCENARIO(.xosc) 형식의 XML 파일을 프로그래밍 방식으로 생성할 수 있도록 설계되었습니다. 이 도구는 도로 네트워크와 동적 주행 시나리오를 동시에 정의하고 상호 연결할 수 있어, 복잡한 자율주행 테스트 케이스 구축에 이상적인 솔루션입니다.

주요 구성 요소

  • pyodrx 기반 xodr 모듈: 도로 지오메트리, 차선, 중심선 마킹 등을 정의
  • pyoscx 기반 xosc 모듈: 차량 행동, 트리거, 이벤트 기반 시나리오 로직 구현
  • ScenarioGenerator 클래스: 통합된 시나리오 생성 인터페이스 제공

설치 및 기본 사용

PyPI를 통해 간단히 설치할 수 있습니다:

pip install scenariogeneration

아래 예제는 두 개의 독립된 직선 도로를 생성하는 코드입니다:

from scenariogeneration import ScenarioGenerator, xodr

class CustomRoadNetwork(ScenarioGenerator):
    def __init__(self):
        super().__init__()
    
    def road(self, **kwargs):
        # OpenDRIVE 객체 초기화
        drive = xodr.OpenDrive("main_road")

        # 첫 번째 도로 세그먼트 생성
        view = xodr.PlanView(0, 0, 0)
        view.add_geometry(xodr.Line(150))

        # 차선 설정
        center_marking = xodr.RoadMark(xodr.RoadMarkType.broken, 0.2)
        center_lane = xodr.Lane(a=2)
        center_lane.add_roadmark(center_marking)

        left_lane = xodr.Lane(a=3.2)
        left_lane.add_roadmark(center_marking)

        right_lane = xodr.Lane(a=3.2)
        right_lane.add_roadmark(center_marking)

        lane_section = xodr.LaneSection(0, center_lane)
        lane_section.add_left_lane(left_lane)
        lane_section.add_right_lane(right_lane)

        lanes = xodr.Lanes()
        lanes.add_lanesection(lane_section)

        road = xodr.Road(101, view, lanes)
        drive.add_road(road)

        return drive

핵심 기능

표준 호환성 보장

  • OpenDRIVE v1.7.1 기반 도로 데이터 생성 지원
  • OpenSCENARIO v1.3.1까지의 다이내믹 시나리오 요소 정의 가능
  • 교차로, 분기점, 신호체계 등 복잡한 인프라 표현 가능

파라미터 기반 대량 생성

시나리오는 단일 인스턴스가 아니라 다양한 변수 조합으로 확장 가능합니다. 예를 들어, 차량 밀도, 날씨 조건, 속도 패턴 등을 매개변수화하여 수백 가지 변형 시나리오를 자동 생성할 수 있습니다.

esmini과 연동한 시각화

생성된 시나리오는 esmini와 연동해 실시간으로 시각화할 수 있습니다:

from scenariogeneration import esmini

if __name__ == "__main__":
    scenario = CustomRoadNetwork()
    esmini(scenario, esminipath="/usr/local/esmini", index_to_run="first")

실제 적용 사례

자율주행 알고리즘 검증

  • 극한 상황(Edge Cases) 자동 생성 (예: 갑작스러운 차선 변경, 급정지 차량)
  • 다양한 교통 흐름 패턴 시뮬레이션
  • 센서 인풋에 대한 반응 테스트

고급 도로 설계

xodr 모듈을 활용하면 고속도로 진입로, 나들목, 원형 교차로 등의 정교한 도로 구조를 코드로 정의할 수 있으며, 곡선 연결 시 브레우스턴 스플라인(Bloss Curve)과 같은 부드러운 전이 곡선도 지원합니다.

동적 요소 제어

OpenSCENARIO 기반으로 다음과 같은 동적 행동을 정의할 수 있습니다:

  • 차량 가속/감속/정지
  • 차선 변경 및 추월
  • 신호등 상태 변화에 따른 반응
  • 다중 에이전트 간 협업 시나리오

고급 기술 특징

지오메트리 최적화

직선, 원호, 스피랄 곡선 등을 조합해 자연스러운 도로 경로를 생성하며, 접속 지점에서의 연속성(Curvature Continuity)을 자동으로 보장합니다.

정적 객체 배치

가로등, 표지판, 장애물 등 정적 오브젝트를 특정 좌표에 배치할 수 있고, 이는 시뮬레이션 환경의 현실감을 높이는 데 기여합니다.

개발 환경 및 유지보수

프로젝트는 다음의 디렉토리 구조로 구성되어 있으며, 재사용성과 테스트 용이성을 고려했습니다:

  • scenariogeneration/: 핵심 로직
  • examples/: 다양한 사용 패턴 예제
  • schemas/: XML 스키마 파일
  • tests/: 단위 테스트 및 통합 테스트

코드 품질은 black 포매터와 PEP8 규칙을 적용해 일관성을 유지하며, CI/CD 파이프라인을 통해 자동 검증됩니다.

결론

scenariogeneration은 자율주행 기술 개발에서 반복적이고 정밀한 시나리오 생성이 필요한 팀에게 강력한 생산성 도구입니다. 표준 기반의 출력, 높은 유연성, 그리고 시각화 도구와의 원활한 통합을 통해 연구 및 개발 프로세스를 가속화할 수 있습니다.

태그: scenariogeneration OpenSCENARIO OpenDRIVE 자율주행 시뮬레이션

6월 27일 19:02에 게시됨