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

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

원래 자동차(차선 변경·차간 거리) 표준인 ASAM OpenSCENARIO의 언어 문법과 타입 시스템만 차용하고, 로봇·군사 도메인 액션은 직접 구축한 imSim의 시나리오 DSL 설계.

약 2분
OpenSCENARIODSLscenariopy_treesASAM

OpenSCENARIO란

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

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

OpenSCENARIO는 원래 자율주행차 검증용입니다(차선 변경, 차간 거리, 추월 같은 액션). 그 도메인 액션들은 로봇·무인체계엔 안 맞습니다. 그래서 imSim은 OpenSCENARIO의 언어 문법과 타입 시스템만 가져오고, 실제 동작 액션은 전부 자체 개발했습니다.

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

💡 왜 이렇게? 표준 언어를 차용하면 도구·파서·검증 생태계와 호환되고, 도메인 액션을 자체 구축하면 로봇·국방 같은 분야의 자유도를 얻습니다 — "표준 호환 + 도메인 자유"를 동시에 가져가는 설계입니다.

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

이 DSL의 핵심 가치는 시나리오 로직이 한 파일에 선언적으로 담긴다는 점입니다. 편성·동작·검증·판정이 사람이 읽을 수 있는 텍스트로 적히고, end-user는 이 언어만으로 같은 결과를 재현할 수 있습니다.

scenario:
  do serial:
    spawn 로봇들
    parallel: 순찰 / 장애물 등장
    assert 충돌 == 0
    set_verdict(...)

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

한 줄 정리

📌 imSim은 ASAM OpenSCENARIO의 언어·타입만 차용하고 로봇·군사 도메인 액션은 직접 만든 3계층 DSL을 쓴다. 시나리오는 사람이 읽는 선언형 텍스트(scenario-as-code)로, 의도가 한 파일에 self-contained로 담긴다.