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을 쓴다 — "표준 호환 + 도메인 자유"를 동시에.
