콘텐츠로 이동

AI 시나리오 생성 — 설명하면 검증된 시나리오가 나온다

시나리오를 직접 작성하려면 모든 액터마다 도로, 차선, 트리거, 동역학을 일일이 지정해야 합니다. AI 생성 기능을 쓰면 원하는 기동을 문장으로 설명하기만 하면 되고, 생성된 초안은 캔버스에 반영되기 전에 시뮬레이터에서 실제로 실행되어 검증됩니다. 실행은 자신의 API 키를 사용해 브라우저에서 직접 이루어집니다.

가장 빠른 경로입니다. 차선 하나를 그리고, 차량 두 대를 놓은 뒤, 무슨 일이 일어나야 하는지 말하면 됩니다.

Vehicle2 cuts in front of Vehicle1.

빈 캔버스에서 컷인 실행까지: 차선을 직접 그리고, 차량 두 대를 배치하고, 문장 하나를 입력하면 생성된 시나리오가 검증·적용·재생됩니다 — 이어서 고스트 트레일로 되감아 살펴보고 이벤트를 손으로 수정한 뒤 다시 실행합니다.

딱 다섯 단계뿐입니다.

  1. Lane 도구로 차선을 그린 다음, 햄버거 메뉴에서 Scenario 모드로 전환합니다.
  2. Add actor로 차선 위에 차량 두 대를 배치합니다.
  3. AI 패널을 엽니다(LOGIC 카드의 AI 버튼). 원하는 상황을 입력합니다. 캔버스 위 액터를 클릭하면 이름이 자동으로 삽입됩니다.
  4. Generate를 누릅니다. 검증을 통과한 결과는 일반적인 phase와 event 형태로 캔버스에 그대로 반영됩니다 — ▶를 눌러 재생해 보세요.
  5. 손으로 다듬습니다. 생성된 이벤트는 자유롭게 편집할 수 있습니다. 영상에서는 고스트 트레일을 켠 채로 재생을 다시 보고, 타임라인을 컷인이 일어나는 순간으로 되감은 뒤, 에디터에서 이벤트 하나를 수정하고 다시 재생합니다.

결과물은 특별 취급되지 않습니다. 타임라인을 탐색하고, 속도나 트리거를 바꾸고, 실패 조건을 추가하거나, .xosc로 내보내는 것 모두 직접 작성한 시나리오와 완전히 동일하게 다룰 수 있습니다. 다시 생성하는 대신 대화를 이어갈 수도 있습니다. 말로 다듬기를 참고하세요.

같은 과정을 가져온 OpenDRIVE 네트워크 위에서도 할 수 있습니다. 여기서는 CARLA Town05 지도에, 더 긴 요청을 던져봅니다: 끼어들었다가 다시 들어와 감속하는 추월 상황입니다.

Vehicle2 comes up behind the Ego in the same lane, moves to the left lane, overtakes the Ego, and cuts back into the Ego’s lane soon after passing, leaving only a small gap. Immediately after cutting in, Vehicle2 brakes to 20 km/h. The Ego follows and keeps a safe distance.

CARLA Town05 지도에서 한 번에: 도로 네트워크를 가져오고, 차량 두 대를 배치하고, 추월 상황을 설명하면 생성된 시나리오가 4단계 게이트를 모두 통과하고 PASS 판정으로 재생됩니다.
  1. 액터 배치와 요청 입력은 사용자의 몫입니다. 차량을 놓은 위치는 고정된 결정으로 취급되며, 모델은 이를 옮기지 말라는 지시를 받습니다.
  2. 모델이 스토리보드로 응답합니다. phase, event, action, trigger로 구성되며, 원시 XML이 아니라 drawtonomy 내부 형식으로 표현됩니다.
  3. 4단계 게이트가 답변을 검사합니다 (아래 참고). 게이트를 통과하지 못하면 어떤 필드가 어떻게 잘못됐고 어떻게 고쳐야 하는지 구체적인 오류 목록으로 정리되어 모델에게 다시 전달되며, 최대 세 번까지 재시도합니다.
  4. 통과한 초안만 캔버스에 반영됩니다. 일반적인 phase와 event 형태로 적용되며, 명시적으로 요청하지 않는 한 실행 검증을 거치지 않은 결과가 적용되는 일은 없습니다.

생성 후 결과 패널: 초록색 게이트 점 4개, 타임라인에 표시된 생성된 phase, 그리고 refine 입력창

게이트표시 이름검사 내용
1Syntax응답이 파싱 가능하고 스토리보드 스키마와 일치하는지 — 필수 필드, 알려진 action/trigger 타입인지 확인합니다.
2Logic차선 ID가 지도에 실제로 존재하는지, 주행 방향이 맞는지, 트리거가 발동 가능한지, 기동이 실제 도로 형상과 맞는지 확인합니다.
3Runesmini로 WebAssembly 컴파일하여 브라우저에서 시나리오를 실제로 실행합니다. 한 번도 발동하지 않는 이벤트, 멈춰버리는 액터, 충돌, 도로 이탈은 모두 여기서 걸러집니다.
4Meaning기록된 궤적을 요청 내용과 비교해 측정합니다. 실행 자체는 문제없더라도 컷인이 차선을 넘지 않았다면 여기서 실패합니다.

Gate 4는 언어 모델의 재확인이 아니라 기록된 궤적에 대한 기하학적 검사입니다. 컷인을 요청했다면 실제로 끼어드는 동작이 있어야 합니다.

게이트와는 별도로 의미 검토(semantic review) 단계가 생성된 스토리보드를 입력한 문장과 대조하여 우려 사항을 제기할 수 있습니다. 이 경우 자동 적용이 멈추고 판단은 사용자에게 넘어갑니다(Apply with concerns). 이 우려 사항은 참고용일 뿐이며, 실제 통과 기준은 어디까지나 게이트입니다.

게이트가 문제를 잡아내면 스스로 고칩니다

섹션 제목: “게이트가 문제를 잡아내면 스스로 고칩니다”
  • 어떤 필드가 무엇이 잘못됐고 어떻게 고쳐야 하는지가 그대로 모델에게 전달되고, 모델은 다시 시도합니다. 대부분의 요청은 첫 번째나 두 번째 시도에서 통과합니다.
  • 진행 과정은 직접 확인할 수 있습니다. 패널에는 시도 횟수와 현재 단계가 *“Asking the AI…”*부터 *“Checking it matches your request…”*까지 표시되며, Details에서 게이트별 전체 과정을 볼 수 있습니다.
  • 사용자의 손길이 더 필요한 요청이라면 Try again 버튼이 나타나고, 초안은 타임라인에 계속 표시되며, 검증을 거치지 않고 적용된 시나리오는 명확히 표시되어 검증된 시나리오와 절대 혼동되지 않습니다.

생성 성공 후 결과 패널: 적용된 시나리오와 의미 검토 결과 문구

생성은 추측이 아니라 가져온 지도를 근거로 이루어집니다.

  • 도로와 차선 — 도로 ID, 차선 ID와 타입, 주행 방향, 어떤 차선이 인접한지, 운전자 시점에서 어느 쪽이 좌/우 차선인지.
  • 직접 배치한 위치 — 각 차량의 도로, 차선, 그 위의 위치가 고정된 값으로 기록됩니다.
  • 이 도로에서 가능한 범위 — 각 액터 앞에 남은 도로 길이를 바탕으로 어떤 속도와 시나리오 길이가 실제로 가능한지 계산합니다. 요청한 속도가 도로에 맞지 않으면, 조용히 값을 바꾸는 대신 Fitted to the road 항목에 그 사실이 표시됩니다.

차량은 주행 차선뿐 아니라 램프 차선(진입로, 진출로, 온램프, 오프램프, 연결 램프)에도 배치할 수 있고, 보행자는 인도, 횡단보도, 갓길에 배치할 수 있습니다. 손으로 액터를 놓을 때 적용되는 규칙과 AI가 제안할 때 적용되는 규칙이 동일하므로, 직접 그릴 수 있는 위치와 AI가 제안하는 위치가 항상 일치합니다.

AI 패널에 입력된 프롬프트, 그 위에 칩 형태로 나열된 배치된 액터들

Ego 차량은 어디까지나 테스트 대상입니다

섹션 제목: “Ego 차량은 어디까지나 테스트 대상입니다”

drawtonomy는 ego를 대본대로 움직이는 또 하나의 액터가 아니라, 테스트 대상 그 자체로 취급합니다. 위 데모에서 생성된 스토리보드 어디에도 ego에게 감속하라는 지시는 없습니다 — 요청 문장에는 그저 *“The Ego follows and keeps a safe distance.”*라고만 되어 있습니다. 화면에 보이는 감속은 빨간 차의 컷인과 감속에 반응한 기준 크루즈 컨트롤러의 결과입니다.

속도
빨간 차 (대본대로 동작)60 km/h → 20 km/h, 차선에 안착한 지 0.7초 후부터
Ego (대본 없음)40 km/h → 21 km/h, 10 m 간격을 유지하며 추종

이것이 쓸모 있는 테스트의 구조입니다: 자극은 대본으로 고정하고, 측정 대상은 그에 대한 반응입니다. 이 반응을 pass/fail로 판정하는 방법은 종료 및 실패 조건을 참고하세요.

컷인이 일어나는 순간: 빨간 차가 ego의 차선에 들어와 감속을 시작한다

시나리오가 적용된 뒤에는 같은 입력창이 refine(수정) 입력창으로 바뀝니다. 처음부터 다시 생성하는 대신 바꾸고 싶은 부분만 설명하면 됩니다. 수정 내용은 타겟팅된 편집으로 적용됩니다 — 속도, 트리거 임계값, 이벤트 추가/삭제, 시나리오 종료 시각 등만 바뀌고, 이미 손으로 편집해 둔 부분은 그대로 유지됩니다.

단순한 숫자 지시는 모델 호출 없이 바로 처리됩니다. *“Set Vehicle2 to 40 km/h”*처럼 액터 하나, 숫자 하나, 단위 하나로 구성된 문장이면 drawtonomy가 직접 해석해서 반영하고, 패널에는 AI 호출이 필요 없었다는 안내가 표시됩니다. 모호한 요청만 모델로 전달됩니다.

현재 생성기가 표현할 수 있는 범위와, 그 범위를 벗어난 요청에서는 어떻게 동작하는지 정리했습니다.

  • 폭넓은 기동 어휘 — 속도 변화, 차선 변경, 횡방향 오프셋, 텔레포트, 거리 유지, 궤적 추종을 지원하며, 트리거는 시뮬레이션 시간, 상대 거리, 시간 간격(headway), 속도, 다른 이벤트의 상태를 기준으로 걸 수 있습니다. 생성된 결과는 모두 일반적인 phase와 event로 반영되므로, 이 어휘 범위 밖의 내용은 일반적인 수동 편집으로 처리하면 됩니다.
  • 보이지 않는 시도들 — 요청은 첫 시도에 풀릴 수도 있고, 게이트가 매번 오류를 교정해 가며 최대 세 번까지 걸릴 수도 있습니다. 캔버스에 반영되는 것은 통과한 시도뿐입니다.
  • 도로 길이에 맞춘 실행 시간 — 시나리오 길이는 기동, 속도, 남은 도로 길이로부터 계산되므로, 실행은 항상 실제로 존재하는 도로 위에서 끝납니다. 더 길게 하고 싶다면 refine 입력창에 요청하면 타겟팅된 편집으로 반영됩니다.
  • 기동에 필요한 여유 공간 — 추월에는 도로 공간이 필요합니다. 액터에게 약 30 m 이상의 여유를 주면 솔버가 다룰 수 있는 여지가 생깁니다.

생성 기능은 사용자 자신의 API 키를 사용하므로, 요청은 사용자 본인의 계정과 쿼터로 실행됩니다. 키는 브라우저에 저장되어 선택한 제공사로 바로 전송될 뿐, drawtonomy 서버나 파일, 로그에는 절대 전달되지 않습니다.

시나리오 에디터에서 AI 패널을 열고 하단의 API key를 클릭합니다.

AI 패널의 API 키 행: Anthropic으로 설정된 제공사 드롭다운, 키 입력란, Clear 버튼

  1. 제공사를 선택합니다 — Anthropic(기본값), OpenAI (ChatGPT), Gemini 중 하나입니다.
  2. 키를 붙여넣고 Save를 누릅니다. 이후 입력란에는 Replace key가 표시되고, 키를 다시 지울 수 있는 Clear 버튼이 나타납니다.
  3. 키는 제공사별로 각각 기억되므로, 다른 제공사로 전환해도 기존에 저장한 키는 사라지지 않습니다.

Anthropic Console에서 발급합니다(Settings → API keys → Create Key). API 크레딧이 있는 Anthropic 계정이 필요하며, Claude 구독 플랜과 API 이용은 별개입니다.

패널은 실패를 조용히 넘기지 않고 원인을 알려줍니다.

표시되는 내용해야 할 일
키가 거부됨키가 유효하고 API 접근 권한이 있는지, 그리고 (위 항목처럼) 단일 워크스페이스로 범위가 지정되어 있는지 확인하세요.
API가 이 키의 요청을 제한 중잠시 기다렸다가 Try again을 누르세요.
API가 일시적으로 사용 불가제공사 측 장애입니다. 잠시 후 다시 시도하세요.
  • 첫 시나리오 만들기 — 같은 스토리보드를 직접 손으로 작성해 봅니다.
  • Phase와 Event — 생성된 구조가 캔버스에 올라간 뒤 무엇을 의미하는지 설명합니다.
  • 재생 — 결과 실행, 카메라 추적, PASS/FAIL 배지에 대한 내용입니다.
  • AI로 장면 생성하기 — 설명을 시나리오가 아니라 그림으로 바꿔주는 별도의 확장 기능입니다.