Przejdź do głównej zawartości

Eksport do OpenDRIVE / OpenSCENARIO / esmini

drawtonomy przekształca ręcznie narysowaną scenę w sieć dróg ASAM OpenDRIVE (.xodr) oraz scenariusz OpenSCENARIO (.xosc), spakowane razem w jeden plik zip, który można od razu odtworzyć w esmini.

Konwersja jest celowo podstawowa — obejmuje tylko te kształty, które jednoznacznie mapują się na model danych ASAM, a resztę pomija. Ta strona dokumentuje dokładnie co jest konwertowane, jak działa ruch wyeksportowanego pojazdu i co pozostaje poza zakresem, żeby wyniki nigdy nie obiecywały więcej niż dają.

Poniższe wideo to jedno ujęcie: narysowanie skrzyżowania, ścieżki i odcisków, eksport do zip, a na końcu odtworzenie pliku .xosc w esmini.

Jedno ujęcie: narysowanie skrzyżowania, ścieżki i odcisków, eksport do zip, odtworzenie .xosc w esmini.

Istnieje jeden punkt wejścia eksportu ASAM. drawtonomy nie oferuje oddzielnych pozycji menu dla .xodr i .xosc — oba pliki są generowane jednocześnie i pakowane do jednego zip.

Menu Export z wyróżnioną opcją .zip (esmini)

  1. Narysuj scenę (pasy, skrzyżowanie, pojazdy, ścieżka…).
  2. Otwórz menu → Export → .zip (esmini).
  3. Wpisz nazwę bazową, gdy pojawi się pytanie (domyślnie drawtonomy-<data>).
  4. Pobiera się <nazwa>.zip zawierający <nazwa>.xodr, <nazwa>.xosc oraz zasoby modeli 3D esmini, do których odwołuje się scenariusz.

Eksportowana jest cała bieżąca strona — nie ma trybu „tylko zaznaczenie” dla celu ASAM.

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

Pojazd jadący po wyeksportowanej trajektorii w esmini

Pojazd jedzie wzdłuż pomarańczowej linii — ta linia jest FollowTrajectoryAction wygenerowaną ze ścieżki narysowanej w edytorze.

Kształt drawtonomyElement OpenDRIVEUwagi
Lanejeden <road>1 pas = 1 niezależna droga
Traffic light<signal> na najbliższej drodzetylko typ pojazd / pieszy
Crosswalk<object type="crosswalk">umieszczony prostopadle do drogi
Polygon (≥3 punkty)<object type="patch"> z <outline>wypełnia wizualizację skrzyżowania / obszaru

Wszystko inne — pojazdy, piesi, samodzielne punkty, wolne linie łamane, tekst, obrazy — nie jest zapisywane do .xodr.

Szczegółowe zasady dotyczące geometrii drogi:

  • Wyłącznie odcinki prostoliniowe. Linia referencyjna drogi jest próbkowana z lewej i prawej krawędzi pasa i emitowana jako segmenty <line>. Nie jest generowana geometria arc, spiral ani poly3.
  • Stały układ pasów. Każda droga ma dokładnie jeden lewy pas (id=1), jeden środkowy (id=0) i jeden prawy (id=-1), wszystkie type="driving". Drogi wielopasmowe i wielosekcyjne nie są obsługiwane.
  • Oznakowanie drogi jest zakodowane na stałe jako linia solid white 0.13 m.
  • Brak skrzyżowań. Każda droga ma junction="-1", a element <junction> nie jest nigdy generowany. Skrzyżowania są oddane jedynie przez polygon patch (wizualizacja) oraz powiązania predecessor/successor wynikające z połączeń next / prev pasa (tylko pierwsze).
  • Brak niwelety i przechyłkielevationProfile i lateralProfile są emitowane puste (płaskie, poziome drogi).
  • Skala jest stała: 16,67 px/m; geograficzny punkt odniesienia to 0.
Kształt drawtonomyElement OpenSCENARIO
Vehicle<ScenarioObject> (<Vehicle> lub <Pedestrian>)
Odcisk ścieżki (pojazd prowadzący)<FollowTrajectoryAction>

„Pieszy” to po prostu kształt pojazdu, którego nazwa szablonu pasuje do wzorca pedestrian/walk — jest emitowany jako <Pedestrian> zamiast <Vehicle>. Pasy, zebry, sygnalizacja i wolne linie łamane nie trafiają do .xosc.

Wyeksportowany scenariusz jest celowo minimalistyczny:

  • Jedynym zachowaniem dynamicznym jest FollowTrajectoryAction — polilinia z datownikami. Brak akcji prędkości, zmian pasa, reakcji na sygnalizację, unikania kolizji ani żadnych warunków interakcji.
  • Każda ruchoma jednostka startuje od SimulationTime ≥ 0, a scenariusz ma twardy StopTrigger po 60 s.

To jest sedno dynamicznego eksportu — warto znać szczegóły.

Panel odcisków: Variable positioning, Interval i Anchor

Ścieżka to linia łamana narysowana w edytorze, a odciski to widmo kopii pojazdu rozmieszczonych wzdłuż niej (ślad widoczny w edytorze). Przy eksporcie:

  1. Tylko pierwszy odcisk (prowadzący) staje się ruchomym <ScenarioObject>. Pozostałe kopie to podgląd na tablicy — są pomijane. W symulacji jedzie jeden pojazd po całej ścieżce, nie kolumna.
  2. Punkty kontrolne ścieżki stają się wierzchołkami trajektorii w metrach (ENU).
  3. Każdy wierzchołek otrzymuje znacznik time, a wynik jest zapisywany jako <Trajectory><Polyline> z elementami <Vertex time="…"> wewnątrz <FollowTrajectoryAction>.

Trajektoria jest taktowana z zakodowaną na stałe wartością 10 m/s (≈ 36 km/h). drawtonomy nie ma pola prędkości nigdzie w interfejsie, a eksporter nigdy nie nadpisuje tej wartości domyślnej. W esmini jednostka będzie raportować ~36 km/h niezależnie od tego, co narysowano. Prędkości nie ustawia się — zamiast tego kształtuje się rozłożenie czasowe poprzez układ odcisków, co opisano poniżej.

Przełącznik „Variable positioning” decyduje o sposobie rozdziału czasu wzdłuż trajektorii:

  • Uniform (przełącznik wyłączony) — odciski leżą w równych odstępach długości łuku (Interval), a czas to odległość / 10 m/s. Ruch ma stałą prędkość. Zmiana Interval wpływa tylko na liczbę wierzchołków (gęstość próbkowania); kształt ścieżki i łączny czas się nie zmieniają.
  • Variable (przełącznik włączony) — każdy odcisk jest przypięty do konkretnego miejsca na ścieżce, a łączny czas jest dzielony na równe przedziały czasowe między odciskami. Tam gdzie odciski są blisko siebie, pojazd jedzie wolniej; tam gdzie są rozstawione szerzej — szybciej. To jedyny sposób na zróżnicowanie efektywnej prędkości wzdłuż trasy.
Akcja w edytorzeEfekt w eksporcie
Przesunięcie punktu kontrolnego ścieżkiWspółrzędne wierzchołka trajektorii + łączny czas (długość się zmienia, prędkość zostaje 10 m/s)
Przeciągnięcie odcisku w trybie VariableZnormalizowana pozycja odcisku → time jego wierzchołka → lokalna (efektywna) prędkość tego odcinka
Przełączenie Variable positioningPrzełącza między taktowaniem równoczasowym a równoodległościowym
Zmiana Interval (tryb uniform)Wyłącznie liczba wierzchołków — kształt trajektorii i prędkość bez zmian
Zmiana AnchorTylko przesunięcie rysowania odcisku — brak wpływu na wyeksportowaną trajektorię
Zmiana szablonu pojazduvehicleCategory, model 3D, wysokość obwiedni, preset osiągów
Zmiana rozmiaru pojazdu (w, h)Wymiary BoundingBox i geometria osi
Obrót pojazduPoczątkowy kurs (tylko jeśli pojazd nie ma trajektorii)
Przesunięcie pojazduPozycja inicjalna WorldPosition (przyciągana do początku trajektorii, jeśli istnieje)

Bezpośrednia odpowiedź na częste pytanie: tak — przesunięcie odcisku w połowie ścieżki w trybie Variable zmienia wyeksportowany plan prędkości, bo przetaktowuje ten odcinek. Przesunięcie w trybie Uniform albo zmiana Anchor nie mają tego efektu.

Dla zachowania przejrzystości co do zakresu — poniższe wartości pochodzą ze stałych map lub stałych liczbowych, a nie z niczego, co można edytować: kategoria / preset osiągów pojazdu, ścieżki modeli 3D, wysokość pojazdu według kategorii, geometria osi (obliczana z rozmiaru), tryb śledzenia (position), wyzwalacz zatrzymania po 60 s, a przede wszystkim — prędkość trajektorii 10 m/s.

Eksporter jest częścią @drawtonomy/sdk i działa bez edytora. W odróżnieniu od menu, SDK pozwala emitować oba pliki osobno:

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// Spakowane (identycznie jak z menu):
const { blob, baseName } = exporter.buildEsminiZip(snapshot, {
baseName: 'my-scene',
})
// Lub każdy format osobno:
const xodr = exporter.exportToOpenDrive(snapshot)
const xosc = exporter.exportToOpenScenario(snapshot, {
xodrFilename: 'my-scene.xodr',
})

Pełne API i punkty rozszerzenia znajdziesz w materiałach referencyjnych Exporter SDK.

FormatWersja
OpenDRIVE1.8
OpenSCENARIO1.3

Obsługiwane: prostoliniowe drogi z pasów; sygnalizacja, zebry i polygony skrzyżowań jako obiekty OpenDRIVE; jeden pojazd na ścieżkę jadący po taktowanej trajektorii; działający zip esmini gotowy do natychmiastowego odtworzenia.

Jeszcze nieobsługiwane: skrzyżowania OpenDRIVE, geometria zakrzywiona, drogi wielopasmowe, niweleta; akcje prędkości OpenSCENARIO, zmiany pasa, logika sygnalizacji, interakcja wielu agentów ani żadna kontrola prędkości per pojazd.