Ir al contenido

Exportar a OpenDRIVE / OpenSCENARIO / esmini

drawtonomy convierte una escena dibujada a mano en una red de carriles ASAM OpenDRIVE (.xodr) y un escenario OpenSCENARIO (.xosc), empaquetados en un único zip que puedes reproducir directamente en esmini.

La conversión es deliberadamente básica: cubre las formas que tienen una correspondencia directa con el modelo de datos ASAM y omite todo lo demás. Esta página documenta con precisión qué se convierte, qué hace el vehículo exportado y qué queda fuera del alcance, para que la salida nunca prometa más de lo que ofrece.

El vídeo es una toma sin cortes: dibuja una intersección, dibuja un trayecto, genera las huellas, exporta el zip de esmini y reproduce el .xosc exportado en esmini.

Una toma: dibuja una intersección, dibuja un trayecto, genera las huellas, exporta el zip de esmini y reproduce el .xosc en esmini.

Hay un único punto de exportación ASAM. drawtonomy no ofrece elementos de menú separados para .xodr y .xosc: ambos archivos se generan juntos y se empaquetan en un solo zip.

El submenú Export con .zip (esmini) destacado

  1. Dibuja tu escena (carriles, una intersección, vehículos, un trayecto…).
  2. Abre el menú → Export → .zip (esmini).
  3. Escribe un nombre base cuando se te pida (por defecto drawtonomy-<fecha>).
  4. Se descarga un <nombre>.zip que contiene <nombre>.xodr, <nombre>.xosc y los modelos 3D de esmini que el escenario referencia.

Se exporta toda la página actual: no existe un modo «solo selección» para el destino ASAM.

Ventana 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 vehículo siguiendo la trayectoria exportada en esmini

El vehículo circula a lo largo de la línea naranja: esa línea es la FollowTrajectoryAction generada a partir del trayecto que dibujaste.

Forma drawtonomyElemento OpenDRIVENotas
Laneun <road>1 carril = 1 carretera independiente
Traffic light<signal> en la carretera más cercanasolo tipo vehículo / peatón
Crosswalk<object type="crosswalk">colocado perpendicular a la carretera
Polygon (≥3 puntos)<object type="patch"> con <outline>rellena intersecciones/áreas visualmente

Todo lo demás —vehículos, peatones, puntos sueltos, linestrings libres, texto, imágenes— no se escribe en el .xodr.

Cómo se genera cada carretera:

  • Geometría de líneas rectas únicamente. La línea de referencia de la carretera se muestrea a partir de los bordes izquierdo y derecho del carril y se emite como segmentos <line>. No se genera geometría arc, spiral ni poly3.
  • Distribución de carriles fija. Cada carretera tiene exactamente un carril izquierdo (id=1), uno central (id=0) y uno derecho (id=-1), todos con type="driving". No se representan carreteras multicarril ni múltiples secciones de carril.
  • Marcas viales fijadas a una línea solid white 0.13 m.
  • Sin cruces. Cada carretera lleva junction="-1" y no se genera ningún elemento <junction>. Las intersecciones se representan solo mediante el parche poligonal (visual) y mediante los enlaces predecesor/sucesor derivados de las conexiones next / prev del carril (solo la primera entrada).
  • Sin elevación ni superelevaciön: elevationProfile y lateralProfile se emiten vacíos (carreteras planas).
  • La escala es fija en 16,67 px/m; el origen geográfico es 0.
Forma drawtonomyElemento OpenSCENARIO
Vehicleun <ScenarioObject> (<Vehicle> o <Pedestrian>)
Huella de trayecto (el vehículo cabeza)una <FollowTrajectoryAction>

Un «peatón» es simplemente una forma de vehículo cuyo nombre de plantilla coincide con un patrón de peatón/caminante: se emite como <Pedestrian> en lugar de <Vehicle>. Los carriles, pasos de peatones, semáforos y linestrings libres no se emiten en el .xosc.

El escenario exportado es deliberadamente mínimo:

  • El único comportamiento dinámico es FollowTrajectoryAction: una polilínea con marcas de tiempo. No hay acciones de velocidad, cambios de carril, respuestas a semáforos, evasión de colisiones ni condiciones de interacción.
  • Cada entidad en movimiento arranca en SimulationTime ≥ 0 y el escenario tiene un StopTrigger fijo a los 60 s.

Cómo una huella de trayecto se convierte en movimiento del vehículo

Sección titulada «Cómo una huella de trayecto se convierte en movimiento del vehículo»

Este es el núcleo de la exportación dinámica, así que conviene ser precisos.

El panel de huellas: posicionamiento variable, intervalo y anclaje explicados

Un trayecto es una linestring que dibujas, y las huellas son copias fantasma de un vehículo distribuidas a lo largo de él (el rastro que ves en el editor). Al exportar:

  1. Solo la huella delantera (la primera) se convierte en un <ScenarioObject> en movimiento. Las huellas traseras son una previsualización del lienzo y se descartan: obtienes un vehículo que recorre todo el trayecto, no una cola.
  2. Los puntos de control del trayecto se convierten en los vértices de la trayectoria, en metros del mundo (ENU).
  3. Cada vértice recibe un time, y el resultado se escribe como <Trajectory><Polyline> de <Vertex time="…"> dentro de una <FollowTrajectoryAction>.

La velocidad es fija (esta es la limitación clave)

Sección titulada «La velocidad es fija (esta es la limitación clave)»

La trayectoria se temporiza a 10 m/s fijos (≈ 36 km/h). drawtonomy no tiene campo de velocidad en ningún lugar de la interfaz, y el exportador nunca modifica el valor predeterminado. En esmini verás que la entidad informa ~36 km/h independientemente de lo que hayas dibujado. No puedes establecer una velocidad; lo que sí puedes controlar es el tiempo distribuido a través de la disposición de las huellas, como se explica a continuación.

El interruptor «Variable positioning» del trayecto determina cómo se distribuye el tiempo a lo largo de la trayectoria:

  • Uniforme (interruptor OFF) — las huellas están a distancias de arco iguales (Interval) y el tiempo es distancia / 10 m/s. El movimiento es a velocidad constante. Cambiar el Interval solo modifica cuántos vértices se escriben (densidad de muestras); la forma del trayecto y la duración total no cambian.
  • Variable (interruptor ON) — cada huella está anclada a una posición a lo largo del trayecto, y la duración total se divide en intervalos de tiempo iguales entre huellas. Donde las huellas están juntas, el vehículo avanza despacio; donde están separadas, avanza rápido. Esta es la única forma de variar la velocidad efectiva a lo largo del recorrido.
Acción en el editorEfecto en la exportación
Mover un punto de control del trayectoCoordenadas del vértice de la trayectoria + duración total (cambia la longitud, la velocidad se mantiene en 10 m/s)
Arrastrar una huella en modo VariableLa posición normalizada de esa huella → el time de su vértice → la velocidad (efectiva) local de ese tramo
Activar/desactivar Variable positioningAlterna entre temporización de tiempo igual y velocidad constante
Cambiar Interval (modo uniforme)Solo el número de vértices: la forma de la trayectoria y la velocidad no cambian
Cambiar AnchorSolo el desplazamiento de dibujo de la huella: sin efecto en la trayectoria exportada
Cambiar la plantilla del vehículovehicleCategory, modelo 3D, altura del bounding box, preset de rendimiento
Redimensionar el vehículo (w, h)Dimensiones del BoundingBox y geometría de ejes
Rotar el vehículoOrientación inicial (solo cuando el vehículo no tiene trayectoria asignada)
Mover el vehículoWorldPosition inicial (anclada al inicio de la trayectoria si tiene una)

Para responder directamente a la pregunta más frecuente: sí —mover una huella a lo largo del trayecto en modo Variable cambia el plan de velocidad exportado, porque retemporizamos ese segmento. Moverla en modo Uniforme, o cambiar el Anchor, no tiene ningún efecto.

Para ser honestos sobre el alcance, estos valores provienen de mapas o constantes fijos, no de nada que puedas editar: categoría/presets de rendimiento del vehículo, rutas de modelos 3D, altura del vehículo por categoría, geometría de ejes (derivada del tamaño), modo de seguimiento (position), el disparador de parada a los 60 s y, lo más importante, la velocidad de trayectoria de 10 m/s.

El exportador se incluye en @drawtonomy/sdk y funciona sin el editor. A diferencia del menú, el SDK también permite emitir los dos archivos por separado:

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// Empaquetado (igual que el menú):
const { blob, baseName } = exporter.buildEsminiZip(snapshot, {
baseName: 'my-scene',
})
// O cada formato por separado:
const xodr = exporter.exportToOpenDrive(snapshot)
const xosc = exporter.exportToOpenScenario(snapshot, {
xodrFilename: 'my-scene.xodr',
})

Para la API completa y los puntos de extensión, consulta la referencia del SDK Exporter.

FormatoVersión
OpenDRIVE1.8
OpenSCENARIO1.3

Compatible: carreteras de línea recta a partir de carriles; señales, pasos de peatones y parches de intersección como objetos OpenDRIVE; un vehículo por trayecto siguiendo una trayectoria temporizada; un zip de esmini listo para reproducir de inmediato.

Aún no compatible: cruces OpenDRIVE, geometría curva, carreteras multicarril, elevación de carreteras; acciones de velocidad OpenSCENARIO, cambios de carril, lógica de semáforos, interacción multiagente, ni control de velocidad por vehículo.