← Blog시나리오 DSL (OpenSCENARIO)· 1/4

OpenSCENARIO란 — 자동차 표준을 로봇 시뮬에 빌려 쓰기

왜 시나리오를 코드가 아니라 선언형 언어(DSL)로 적는지, ASAM OpenSCENARIO에서 무엇을 빌리고 무엇은 안 빌리는지, 그리고 언어는 차용하되 도메인 액션은 자체 구축한 imSim의 3계층 설계.

약 3분
OpenSCENARIODSLscenariopy_treesASAM

OpenSCENARIO란

로봇 시뮬레이션에서 "이런 상황을 만들어 테스트해라"를 어떻게 표현할까요? imSim은 시나리오를 코드 스크립트가 아니라 선언적 도메인 언어(DSL) 로 적습니다. 그 언어로 고른 게 자동차 업계 표준인 ASAM OpenSCENARIO 입니다 — 단, 흥미로운 방식으로 빌려 씁니다.

이 글은 OSC 시리즈의 입구라, 왜 코드 대신 언어인지부터 시작해 무엇을 빌리고 무엇은 안 빌리는지, 그 위에 imSim이 어떻게 도메인을 올렸는지까지 짚습니다.

왜 코드가 아니라 선언형 언어(DSL)인가

가장 먼저 드는 의문 — "그냥 파이썬으로 짜면 안 되나?" 됩니다. 하지만 시나리오를 명령형 코드로 적으면 문제가 생깁니다.

명령형 코드 (파이썬)선언형 DSL (OpenSCENARIO)
적는 것어떻게 한 단계씩무엇을 (상황 그 자체)
누가 쓰나로봇 엔지니어도메인 전문가도 가능
재현성코드 전체를 알아야파일 한 장 = 시나리오
검수·감사어려움사람이 읽고 리뷰
도구 호환제각각표준 파서·검증 생태계

핵심은 — "어떻게"가 아니라 "무엇을" 적는다는 것입니다. 데이터를 다룰 때 for-loop 대신 SQL을 쓰는 것과 같은 발상입니다. 상황을 선언하면, 그걸 실행하는 방법은 엔진이 책임집니다.

💡 선언형이라야 "납품"이 된다 — 시나리오가 사람이 읽는 텍스트 한 장이면, 고객·엔지니어가 그 언어만으로 같은 테스트를 재현·검수할 수 있습니다. 코드에 묻혀 있으면 우리만 돌릴 수 있는 일회성이 됩니다.

언어는 빌리고, 도메인은 직접 짓는다

그렇다면 그 언어를 새로 만들까요? 아닙니다 — 이미 있는 표준을 빌립니다. OpenSCENARIO는 원래 자율주행차 검증용입니다(차선 변경, 차간 거리, 추월 같은 액션). 그 자동차 액션들은 로봇·무인체계엔 안 맞습니다. 그래서 imSim은 OpenSCENARIO의 언어 문법과 타입 시스템만 가져오고, 실제 동작 액션은 전부 자체 개발했습니다.

도식 렌더링 중…
  • ASAM 층scenario/serial/parallel/wait/emit 같은 문법과 time/length/speed/angle 같은 SI 단위 타입. 이건 그대로 씁니다.
  • 실행 엔진 층 — 시나리오를 Behavior Tree로 컴파일해 tick하는 엔진(py_trees 기반).
  • 도메인 액션 층로봇 스폰, 센서 노이즈 주입, 교전 규칙 전환 등. ASAM의 자동차 액션은 하나도 안 쓰고 전부 우리가 만든 것(커스텀 액션 만들기).

무엇을 빌리고, 무엇은 안 빌리나

이 "차용"의 경계를 분명히 하는 게 설계의 핵심입니다.

도식 렌더링 중…

💡 "표준 호환 + 도메인 자유"를 동시에 — 표준 언어를 빌리면 도구·파서·검증 생태계와 호환되고(바퀴를 다시 안 만듦), 도메인 액션을 자체 구축하면 로봇·국방 같은 분야의 자유도를 얻습니다. 둘 다 가져가는 게 이 설계의 묘입니다.

시나리오 = 코드 (Scenario-as-Code)

이 DSL의 결과물은 시나리오 로직이 한 파일에 선언적으로 담긴다는 것입니다. 편성·동작·검증·판정이 사람이 읽을 수 있는 텍스트로 적힙니다.

scenario patrol_demo:
    do serial:
        spawn_robots(count: 3, area: zone_a)
        parallel:
            patrol(path: route_a, speed: 1.5mps)
            inject_obstacle(at: 10.0s)
        assert(collisions == 0)
        emit verdict(PASS)

위 텍스트만 있으면 누구든 같은 시나리오를 똑같이 재현합니다 — 어떤 로봇 3대를, 어디에, 어떤 경로로, 무엇을 검증할지가 다 보입니다.

⚠️ 시나리오 로직이 코드 스크립트로 새면 안 된다 — 절반은 DSL, 절반은 별도 파이썬 헬퍼에 흩어지면 "데모 한 번"용이 됩니다. 의도가 도메인 언어에 self-contained로 담겨야 납품 가능한 구조입니다(self-containment 철학).

한 줄 정리

📌 시나리오는 어떻게(코드)가 아니라 무엇을(선언형 DSL)로 적어야 재현·검수·납품이 된다. imSim은 ASAM OpenSCENARIO의 언어·SI 타입만 차용(자동차 액션은 안 씀)하고, 그 위에 로봇·군사 도메인 액션을 자체 구축한 3계층 DSL을 쓴다 — "표준 호환 + 도메인 자유"를 동시에.