콘텐츠로 이동

OpenDRIVE / OpenSCENARIO / esmini 내보내기

drawtonomy에서 직접 그린 장면을 ASAM OpenDRIVE(.xodr) 도로망 파일과 OpenSCENARIO(.xosc) 시나리오 파일로 변환할 수 있습니다. 두 파일은 하나의 zip으로 묶여 esmini에서 즉시 재생됩니다.

변환 범위는 의도적으로 기본적인 수준에 맞춰져 있습니다. ASAM 데이터 모델과 깔끔하게 대응되는 몇 가지 셰이프만 처리하고, 나머지는 제외합니다. 이 페이지에서는 정확히 무엇이 변환되는지, 내보낸 차량이 어떻게 움직이는지, 그리고 현재 범위 밖에 있는 것은 무엇인지 명확히 설명합니다.

아래 영상은 단일 테이크입니다. 교차로를 그리고, 경로를 그리고, 풋프린트를 생성한 뒤, esmini zip을 내보내고 .xosc를 esmini에서 재생합니다.

단일 테이크: 교차로와 경로를 그리고, 풋프린트를 생성하고, esmini zip을 내보낸 뒤 .xosc를 esmini에서 재생합니다.

ASAM 내보내기 진입점은 하나입니다. drawtonomy는 .xodr / .xosc 메뉴 항목을 따로 제공하지 않으며, 두 파일은 항상 함께 생성되어 하나의 zip에 담깁니다.

.zip (esmini)가 강조된 Export 서브메뉴

  1. 장면을 그립니다(차선, 교차로, 차량, 경로 등).
  2. 메뉴 → **Export → .zip (esmini)**를 선택합니다.
  3. 프롬프트에서 기본 이름을 입력합니다(기본값: drawtonomy-<날짜>).
  4. <name>.zip이 다운로드되며, 그 안에 <name>.xodr, <name>.xosc, 그리고 시나리오가 참조하는 esmini 3D 모델 에셋이 포함됩니다.

현재 페이지 전체가 내보내집니다. ASAM 내보내기는 “선택 영역만” 모드를 지원하지 않습니다.

Terminal window
unzip drawtonomy-2026-05-30.zip
cd drawtonomy-2026-05-30
esmini --osc drawtonomy-2026-05-30.xosc --window 60 60 1024 768

esmini에서 내보낸 궤적을 따라 주행하는 차량

차량은 주황색 선을 따라 주행합니다. 이 선이 바로 그린 경로에서 생성된 FollowTrajectoryAction입니다.

drawtonomy 셰이프OpenDRIVE 요소비고
Lane<road> 하나차선 1개 = 독립 도로 1개
Traffic light가장 가까운 도로의 <signal>vehicle / pedestrian 유형만
Crosswalk<object type="crosswalk">도로에 수직으로 배치
Polygon (점 3개 이상)<outline>이 포함된 <object type="patch">교차로·영역 시각화

차량, 보행자, 독립 점, 자유 선형(linestring), 텍스트, 이미지는 .xodr에 기록되지 않습니다.

도로별 상세 사양:

  • 기하 형상은 직선만 지원합니다. 도로 기준선은 차선의 왼쪽/오른쪽 경계에서 샘플링되어 <line> 세그먼트로 출력됩니다. arc, spiral, poly3는 생성되지 않습니다.
  • 고정 차선 구성. 모든 도로는 좌측 차선(id=1), 중앙 차선(id=0), 우측 차선(id=-1) 각각 하나씩, 모두 type="driving"으로 설정됩니다. 다차선 도로 및 복수 차선 구간은 표현되지 않습니다.
  • 도로 표시solid white 0.13 m 선으로 고정됩니다.
  • 교차로(junction) 없음. 모든 도로는 junction="-1"이며, <junction> 요소는 생성되지 않습니다. 교차로는 polygon 패치(시각적 표현)와 차선의 next / prev 연결(첫 번째 항목만)에서 파생된 predecessor/successor 링크로만 표현됩니다.
  • 고도·횡단 경사 없음. elevationProfilelateralProfile은 빈 상태로 출력됩니다(평탄한 평면 도로).
  • 스케일은 16.67 px/m으로 고정되며, 지리 원점은 0입니다.
drawtonomy 셰이프OpenSCENARIO 요소
Vehicle<ScenarioObject>(<Vehicle> 또는 <Pedestrian>)
경로 풋프린트 (선두 차량)<FollowTrajectoryAction>

템플릿 이름이 pedestrian/walk 패턴과 일치하는 차량 셰이프는 <Pedestrian>으로 출력됩니다. 차선, 횡단보도, 신호등, 자유 선형은 .xosc에 포함되지 않습니다.

내보낸 시나리오는 의도적으로 최소한의 내용만 담습니다.

  • 동적 동작은 FollowTrajectoryAction 하나뿐입니다. 타임스탬프가 포함된 폴리라인으로, 속도 제어, 차선 변경, 신호 응답, 충돌 회피, 상호작용 조건은 없습니다.
  • 각 이동 객체는 SimulationTime ≥ 0에서 시작하며, 시나리오는 **60초에 StopTrigger**로 종료됩니다.

경로 풋프린트가 차량 움직임이 되는 방법

섹션 제목: “경로 풋프린트가 차량 움직임이 되는 방법”

동적 내보내기의 핵심 부분이므로 정확하게 설명합니다.

풋프린트 패널: Variable positioning, Interval, Anchor 설명

**경로(path)**는 직접 그리는 선형이고, **풋프린트(footprint)**는 그 경로를 따라 배치된 차량 복사본(에디터에서 보이는 궤적)입니다. 내보낼 때의 동작:

  1. 선두 풋프린트(첫 번째)만 이동하는 <ScenarioObject>가 됩니다. 뒤따르는 복사본은 캔버스 미리보기이며 제외됩니다. 대기열이 아닌 하나의 차량이 경로 전체를 주행합니다.
  2. 경로의 제어점이 세계 좌표(ENU, 미터) 기준 궤적 꼭짓점이 됩니다.
  3. 각 꼭짓점에 time이 부여되어 <FollowTrajectoryAction> 안의 <Trajectory><Polyline><Vertex time="…"> 형태로 기록됩니다.

속도는 고정값입니다(핵심 제약 사항)

섹션 제목: “속도는 고정값입니다(핵심 제약 사항)”

궤적 속도는 **하드코딩된 10 m/s(≈ 36 km/h)**입니다. drawtonomy UI에는 속도 입력 필드가 없으며, 내보내기 시 기본값을 재정의하지 않습니다. esmini에서 재생하면 그린 내용과 무관하게 약 36 km/h가 표시됩니다. 속도를 직접 설정하는 대신, 아래에서 설명하는 풋프린트 배치로 타이밍을 조절합니다.

경로의 “Variable positioning” 토글 상태에 따라 궤적을 따라 시간이 배분되는 방식이 달라집니다.

  • 균일 모드(토글 OFF) — 풋프린트가 동일한 호 길이 Interval 간격으로 배치되고, 시간은 거리 / 10 m/s로 계산됩니다. 등속 움직임입니다. Interval을 변경하면 꼭짓점 수(샘플 밀도)만 바뀌고, 경로 형태와 총 소요 시간은 변하지 않습니다.
  • 가변 모드(토글 ON) — 각 풋프린트가 경로 위 특정 위치에 고정되며, 총 소요 시간이 풋프린트 사이에 동일한 시간 간격으로 나뉩니다. 풋프린트가 가깝게 모여 있으면 차량이 천천히, 멀리 떨어져 있으면 빠르게 이동합니다. 경로 구간별 유효 속도를 조절하는 유일한 방법입니다.

에디터 조작 ↔ .xosc 변화 대응표

섹션 제목: “에디터 조작 ↔ .xosc 변화 대응표”
에디터 조작내보내기에 미치는 영향
경로 제어점 이동궤적 꼭짓점 좌표 + 총 소요 시간(길이 변경, 속도 10 m/s 유지)
가변 모드에서 풋프린트 드래그해당 풋프린트의 정규화된 위치 → 꼭짓점 time → 해당 구간 유효 속도
Variable positioning 토글 전환등시간 / 등속도 타이밍 방식 전환
Interval 변경(균일 모드)꼭짓점 수만 변경 — 궤적 형태와 속도는 유지
Anchor 변경풋프린트 그리기 오프셋만 변경 — 내보낸 궤적에 영향 없음
차량 템플릿 변경vehicleCategory, 3D 모델, 바운딩박스 높이, 성능 프리셋
차량 크기(w, h) 조절BoundingBox 치수와 차축 기하
차량 회전초기 방향(궤적이 없는 차량에만 적용)
차량 이동Init WorldPosition(궤적이 있으면 시작점에 스냅)

자주 묻는 질문에 직접 답하자면, 가변 모드에서 경로 중간에 풋프린트를 이동하면 해당 구간의 타이밍이 재조정되어 내보낸 속도 계획이 바뀝니다. 균일 모드에서 이동하거나 Anchor를 변경하는 경우에는 영향이 없습니다.

범위를 솔직하게 밝히기 위해, 아래 항목은 고정 맵이나 상수에서 가져오며 에디터에서 편집할 수 없습니다. 차량 카테고리/성능 프리셋, 3D 모델 경로, 카테고리별 차량 높이, 차축 기하(크기에서 산출), 추종 모드(position), 60초 정지 트리거, 그리고 가장 중요한 10 m/s 궤적 속도가 이에 해당합니다.

내보내기 도구는 @drawtonomy/sdk에 포함되어 에디터 없이도 실행됩니다. 메뉴와 달리 SDK에서는 두 파일을 개별적으로 출력할 수도 있습니다.

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// 번들 내보내기(메뉴와 동일):
const { blob, baseName } = exporter.buildEsminiZip(snapshot, {
baseName: 'my-scene',
})
// 개별 형식으로 내보내기:
const xodr = exporter.exportToOpenDrive(snapshot)
const xosc = exporter.exportToOpenScenario(snapshot, {
xodrFilename: 'my-scene.xodr',
})

전체 API와 확장 지점은 Exporter SDK 레퍼런스를 참고하세요.

형식버전
OpenDRIVE1.8
OpenSCENARIO1.3

지원: 차선에서 변환한 직선 도로, OpenDRIVE 객체로서의 신호·횡단보도·교차로 패치, 경로를 따라 타임드 궤적으로 이동하는 차량 하나, 즉시 재생 가능한 esmini zip.

미지원: OpenDRIVE 교차로(junction), 곡선 기하, 다차선 도로, 도로 고도; OpenSCENARIO 속도 제어, 차선 변경, 신호 로직, 다중 에이전트 상호작용, 차량별 속도 설정.