Aller au contenu

Exporter vers OpenDRIVE / OpenSCENARIO / esmini

drawtonomy transforme une scène dessinée à la main en réseau routier ASAM OpenDRIVE (.xodr) accompagné d’un scénario OpenSCENARIO (.xosc), le tout regroupé dans une archive zip rejouable dans esmini.

La conversion est volontairement basique — elle couvre les quelques formes qui s’appliquent directement au modèle de données ASAM et laisse le reste de côté. Cette page documente précisément ce qui est converti, ce que fait concrètement le véhicule exporté, et ce qui est hors périmètre, afin que la sortie ne promette jamais plus qu’elle ne tient.

La vidéo ci-dessous est tournée en une seule prise : dessiner une intersection, tracer un chemin, générer les empreintes, exporter l’archive esmini, puis rejouer le .xosc exporté dans esmini.

En une prise : dessiner une intersection, tracer un chemin, générer les empreintes, exporter l'archive esmini, puis rejouer le .xosc dans esmini.

Il n’existe qu’un seul point d’entrée pour l’export ASAM. drawtonomy ne propose pas de menus .xodr / .xosc séparés — les deux fichiers sont produits ensemble et regroupés dans une seule archive.

Le sous-menu Export avec .zip (esmini) sélectionné

  1. Dessinez votre scène (voies de circulation, une intersection, des véhicules, un chemin…).
  2. Ouvrez le menu → Export → .zip (esmini).
  3. Saisissez un nom de base lorsqu’on vous le demande (par défaut drawtonomy-<date>).
  4. Une archive <nom>.zip se télécharge, contenant <nom>.xodr, <nom>.xosc et les ressources 3D esmini référencées par le scénario.

L’export porte sur la page entière — il n’existe pas de mode « sélection uniquement » pour la cible ASAM.

Fenêtre de terminal
unzip drawtonomy-2026-05-30.zip
cd drawtonomy-2026-05-30
esmini --osc drawtonomy-2026-05-30.xosc --window 60 60 1024 768

Un véhicule qui suit la trajectoire exportée dans esmini

Le véhicule suit la ligne orange — cette ligne est la FollowTrajectoryAction générée à partir du chemin que vous avez dessiné.

Forme drawtonomyÉlément OpenDRIVERemarques
Laneun <road>1 voie = 1 route indépendante
Traffic light<signal> sur la route la plus prochetypes véhicule / piéton uniquement
Crosswalk<object type="crosswalk">placé perpendiculairement à la route
Polygon (≥ 3 points)<object type="patch"> avec <outline>représente visuellement les intersections et zones

Tout le reste — véhicules, piétons, points isolés, linestrings libres, textes, images — n’est pas écrit dans le .xodr.

Détails sur la géométrie de chaque route :

  • Géométrie en segments droits uniquement. La ligne de référence est échantillonnée à partir des bordures gauche/droite de la voie et émise sous forme de segments <line>. Aucune géométrie arc, spiral ou poly3 n’est produite.
  • Gabarit de voie fixe. Chaque route obtient exactement une voie gauche (id=1), une voie centrale (id=0) et une voie droite (id=-1), toutes type="driving". Les routes multi-voies et les sections multiples ne sont pas représentées.
  • Marquages routiers codés en dur : ligne solid white 0.13 m.
  • Pas de jonctions. Chaque route porte junction="-1" et aucun élément <junction> n’est jamais généré. Les intersections sont représentées uniquement par le patch polygonal (visuel) et par les liens prédécesseur/successeur issus des connexions next / prev de la voie (première entrée uniquement).
  • Pas d’élévation / de déverselevationProfile et lateralProfile sont émis vides (routes planes et horizontales).
  • L’échelle est fixée à 16,67 px/m ; l’origine géographique est 0.
Forme drawtonomyÉlément OpenSCENARIO
Vehicleun <ScenarioObject> (<Vehicle> ou <Pedestrian>)
Empreinte de chemin (le véhicule de tête)une <FollowTrajectoryAction>

Un « piéton » est simplement une forme Vehicle dont le nom de gabarit correspond à un motif piéton/marche — il est émis en <Pedestrian> plutôt qu’en <Vehicle>. Les voies, passages piétons, feux de circulation et linestrings libres ne sont pas émis dans le .xosc.

Le scénario exporté est volontairement minimal :

  • Le seul comportement dynamique est la FollowTrajectoryAction — une polyligne horodatée. Il n’y a pas d’actions de vitesse, de changements de voie, de réponses aux feux, d’évitement de collision, ni aucune condition d’interaction.
  • Chaque entité en mouvement démarre à SimulationTime ≥ 0 et le scénario comporte un StopTrigger à 60 s codé en dur.

Comment une empreinte de chemin devient un mouvement de véhicule

Section intitulée « Comment une empreinte de chemin devient un mouvement de véhicule »

C’est le cœur de l’export dynamique — voici une explication précise.

Le panneau d'empreinte : positionnement variable, intervalle et ancre

Un chemin (path) est un linestring que vous tracez, et les empreintes (footprints) sont des copies fantômes d’un véhicule disposées le long de ce chemin (la traîne visible dans l’éditeur). Lors de l’export :

  1. Seule l’empreinte de tête (la première) devient un <ScenarioObject> en mouvement. Les fantômes suivants sont un aperçu côté canevas et sont ignorés — vous obtenez un seul véhicule qui parcourt l’intégralité du chemin, pas une file.
  2. Les points de contrôle du chemin deviennent les sommets de la trajectoire, en mètres (ENU monde).
  3. Chaque sommet reçoit un time, et le résultat est écrit sous la forme <Trajectory><Polyline> de <Vertex time="…"> dans une <FollowTrajectoryAction>.

La vitesse est fixe (c’est la limitation principale)

Section intitulée « La vitesse est fixe (c’est la limitation principale) »

La trajectoire est horodatée à une vitesse codée en dur de 10 m/s (≈ 36 km/h). drawtonomy ne dispose d’aucun champ de vitesse dans l’interface, et l’exporteur ne remplace jamais cette valeur par défaut. Dans esmini, l’entité affichera environ 36 km/h quel que soit ce que vous avez dessiné. Vous ne définissez pas une vitesse — vous façonnez le minutage via la disposition des empreintes, comme décrit ci-dessous.

L’activation ou non du bouton Variable positioning détermine comment le temps est distribué le long de la trajectoire :

  • Uniforme (bouton désactivé) — les empreintes sont espacées à intervalles d’arc égaux (Interval) et le temps est distance / 10 m/s. Le mouvement est à vitesse constante. Modifier l’Interval ne change que le nombre de sommets écrits (densité d’échantillonnage) ; la forme du chemin et la durée totale restent inchangées.
  • Variable (bouton activé) — chaque empreinte est fixée à une position le long du chemin, et la durée totale est divisée en tranches de temps égales entre les empreintes. Là où les empreintes sont regroupées, le véhicule avance lentement ; là où elles sont espacées, il avance vite. C’est le seul moyen de faire varier la vitesse effective le long du tracé.

Ce que vous modifiez ↔ ce qui change dans le .xosc

Section intitulée « Ce que vous modifiez ↔ ce qui change dans le .xosc »
Action dans l’éditeurEffet sur l’export
Déplacer un point de contrôle du cheminCoordonnées du sommet de trajectoire + durée totale (la longueur change, la vitesse reste à 10 m/s)
Faire glisser une empreinte en mode VariableLa position normalisée de cette empreinte → le time de son sommet → la vitesse (effective) locale de ce segment
Activer/désactiver Variable positioningBascule entre minutage à temps égaux et à vitesse constante
Changer l’Interval (mode uniforme)Nombre de sommets uniquement — forme et vitesse de la trajectoire inchangées
Changer l’AnchorDécalage d’affichage des empreintes uniquement — aucun effet sur la trajectoire exportée
Changer le gabarit de véhiculevehicleCategory, modèle 3D, hauteur du bounding-box, preset de performance
Redimensionner le véhicule (l, h)Dimensions du BoundingBox et géométrie des essieux
Faire pivoter le véhiculeCap initial (uniquement lorsque le véhicule n’a pas de trajectoire)
Déplacer le véhiculeWorldPosition initiale (alignée sur le début de la trajectoire si elle en possède une)

Pour répondre directement à la question fréquente : oui — déplacer une empreinte sur le chemin en mode Variable modifie le plan de vitesse exporté, car cela re-minute ce segment. Le faire en mode Uniform, ou changer l’Anchor, n’a aucun effet.

Par souci de transparence sur le périmètre, ces éléments proviennent de tables fixes ou de constantes, et non de paramètres que vous pouvez éditer : catégorie de véhicule / presets de performance, chemins des modèles 3D, hauteur des véhicules par catégorie, géométrie des essieux (dérivée de la taille), mode de suivi (position), le déclencheur d’arrêt à 60 s, et — surtout — la vitesse de trajectoire de 10 m/s.

L’exporteur est fourni dans @drawtonomy/sdk et fonctionne sans l’éditeur. Contrairement au menu, le SDK permet aussi d’émettre les deux fichiers séparément :

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// Groupé (identique au menu) :
const { blob, baseName } = exporter.buildEsminiZip(snapshot, {
baseName: 'my-scene',
})
// Ou chaque format individuellement :
const xodr = exporter.exportToOpenDrive(snapshot)
const xosc = exporter.exportToOpenScenario(snapshot, {
xodrFilename: 'my-scene.xodr',
})

Pour l’API complète et les points d’extension, voir la référence du SDK Exporteur.

FormatVersion
OpenDRIVE1.8
OpenSCENARIO1.3

Pris en charge : routes en segments droits issues des voies ; signaux, passages piétons et patches d’intersection comme objets OpenDRIVE ; un véhicule par chemin suivant une trajectoire horodatée ; une archive esmini opérationnelle et rejouable immédiatement.

Pas encore pris en charge : jonctions OpenDRIVE, géométrie courbe, routes multi-voies, élévation des routes ; actions de vitesse OpenSCENARIO, changements de voie, logique de feux de circulation, interaction multi-agents, ou tout contrôle de vitesse par véhicule.