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ą.
Pełny przebieg w jednym nagraniu
Dział zatytułowany „Pełny przebieg w jednym nagraniu”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.
Eksport z edytora
Dział zatytułowany „Eksport z edytora”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.

- Narysuj scenę (pasy, skrzyżowanie, pojazdy, ścieżka…).
- Otwórz menu → Export →
.zip (esmini). - Wpisz nazwę bazową, gdy pojawi się pytanie (domyślnie
drawtonomy-<data>). - Pobiera się
<nazwa>.zipzawierający<nazwa>.xodr,<nazwa>.xoscoraz 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.
Odtworzenie w esmini
Dział zatytułowany „Odtworzenie w esmini”unzip drawtonomy-2026-05-30.zipcd drawtonomy-2026-05-30esmini --osc drawtonomy-2026-05-30.xosc --window 60 60 1024 768
Pojazd jedzie wzdłuż pomarańczowej linii — ta linia jest
FollowTrajectoryAction wygenerowaną ze ścieżki narysowanej w edytorze.
Co jest konwertowane
Dział zatytułowany „Co jest konwertowane”Do OpenDRIVE (.xodr)
Dział zatytułowany „Do OpenDRIVE (.xodr)”| Kształt drawtonomy | Element OpenDRIVE | Uwagi |
|---|---|---|
| Lane | jeden <road> | 1 pas = 1 niezależna droga |
| Traffic light | <signal> na najbliższej drodze | tylko 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 geometriaarc,spiralanipoly3. - 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), wszystkietype="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/prevpasa (tylko pierwsze). - Brak niwelety i przechyłki —
elevationProfileilateralProfilesą emitowane puste (płaskie, poziome drogi). - Skala jest stała: 16,67 px/m; geograficzny punkt odniesienia to
0.
Do OpenSCENARIO (.xosc)
Dział zatytułowany „Do OpenSCENARIO (.xosc)”| Kształt drawtonomy | Element 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 twardyStopTriggerpo 60 s.
Jak odcisk ścieżki staje się ruchem pojazdu
Dział zatytułowany „Jak odcisk ścieżki staje się ruchem pojazdu”To jest sedno dynamicznego eksportu — warto znać szczegóły.

Ścieżka to linia łamana narysowana w edytorze, a odciski to widmo kopii pojazdu rozmieszczonych wzdłuż niej (ślad widoczny w edytorze). Przy eksporcie:
- 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. - Punkty kontrolne ścieżki stają się wierzchołkami trajektorii w metrach (ENU).
- Każdy wierzchołek otrzymuje znacznik
time, a wynik jest zapisywany jako<Trajectory>→<Polyline>z elementami<Vertex time="…">wewnątrz<FollowTrajectoryAction>.
Prędkość jest stała (to kluczowe ograniczenie)
Dział zatytułowany „Prędkość jest stała (to kluczowe ograniczenie)”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.
Dwa tryby taktowania
Dział zatytułowany „Dwa tryby taktowania”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.
Co edytować ↔ co zmienia się w .xosc
Dział zatytułowany „Co edytować ↔ co zmienia się w .xosc”| Akcja w edytorze | Efekt w eksporcie |
|---|---|
| Przesunięcie punktu kontrolnego ścieżki | Współrzędne wierzchołka trajektorii + łączny czas (długość się zmienia, prędkość zostaje 10 m/s) |
| Przeciągnięcie odcisku w trybie Variable | Znormalizowana pozycja odcisku → time jego wierzchołka → lokalna (efektywna) prędkość tego odcinka |
| Przełączenie Variable positioning | Przełą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 Anchor | Tylko przesunięcie rysowania odcisku — brak wpływu na wyeksportowaną trajektorię |
| Zmiana szablonu pojazdu | vehicleCategory, model 3D, wysokość obwiedni, preset osiągów |
| Zmiana rozmiaru pojazdu (w, h) | Wymiary BoundingBox i geometria osi |
| Obrót pojazdu | Początkowy kurs (tylko jeśli pojazd nie ma trajektorii) |
| Przesunięcie pojazdu | Pozycja 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.
Wartości zakodowane na stałe
Dział zatytułowany „Wartości zakodowane na stałe”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.
Eksport programistyczny
Dział zatytułowany „Eksport programistyczny”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.
Emitowane wersje
Dział zatytułowany „Emitowane wersje”| Format | Wersja |
|---|---|
| OpenDRIVE | 1.8 |
| OpenSCENARIO | 1.3 |
Zakres w skrócie
Dział zatytułowany „Zakres w skrócie”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.
Zobacz także
Dział zatytułowany „Zobacz także”- Architektura eksportera — co potok robi między migawką a plikiem.
- Dodawanie formatu docelowego — podłącz CARLA, SUMO, Unity lub cokolwiek innego.