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 ciclo completo en vídeo
Sección titulada «El ciclo completo en vídeo»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.
Exportar desde el editor
Sección titulada «Exportar desde el editor»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.

- Dibuja tu escena (carriles, una intersección, vehículos, un trayecto…).
- Abre el menú → Export →
.zip (esmini). - Escribe un nombre base cuando se te pida (por defecto
drawtonomy-<fecha>). - Se descarga un
<nombre>.zipque contiene<nombre>.xodr,<nombre>.xoscy 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.
Reproducirlo
Sección titulada «Reproducirlo»unzip drawtonomy-2026-05-30.zipcd drawtonomy-2026-05-30esmini --osc drawtonomy-2026-05-30.xosc --window 60 60 1024 768
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.
Qué se convierte
Sección titulada «Qué se convierte»A OpenDRIVE (.xodr)
Sección titulada «A OpenDRIVE (.xodr)»| Forma drawtonomy | Elemento OpenDRIVE | Notas |
|---|---|---|
| Lane | un <road> | 1 carril = 1 carretera independiente |
| Traffic light | <signal> en la carretera más cercana | solo 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íaarc,spiralnipoly3. - Distribución de carriles fija. Cada carretera tiene exactamente un
carril izquierdo (
id=1), uno central (id=0) y uno derecho (id=-1), todos contype="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 conexionesnext/prevdel carril (solo la primera entrada). - Sin elevación ni superelevaciön:
elevationProfileylateralProfilese emiten vacíos (carreteras planas). - La escala es fija en 16,67 px/m; el origen geográfico es
0.
A OpenSCENARIO (.xosc)
Sección titulada «A OpenSCENARIO (.xosc)»| Forma drawtonomy | Elemento OpenSCENARIO |
|---|---|
| Vehicle | un <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 ≥ 0y el escenario tiene unStopTriggerfijo 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.

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:
- 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. - Los puntos de control del trayecto se convierten en los vértices de la trayectoria, en metros del mundo (ENU).
- 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.
Dos modos de temporización
Sección titulada «Dos modos de temporizació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.
Qué editas ↔ qué cambia en el .xosc
Sección titulada «Qué editas ↔ qué cambia en el .xosc»| Acción en el editor | Efecto en la exportación |
|---|---|
| Mover un punto de control del trayecto | Coordenadas 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 Variable | La posición normalizada de esa huella → el time de su vértice → la velocidad (efectiva) local de ese tramo |
| Activar/desactivar Variable positioning | Alterna 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 Anchor | Solo el desplazamiento de dibujo de la huella: sin efecto en la trayectoria exportada |
| Cambiar la plantilla del vehículo | vehicleCategory, 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ículo | Orientación inicial (solo cuando el vehículo no tiene trayectoria asignada) |
| Mover el vehículo | WorldPosition 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.
Valores fijados internamente
Sección titulada «Valores fijados internamente»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.
Exportación programática
Sección titulada «Exportación programática»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.
Versiones emitidas
Sección titulada «Versiones emitidas»| Formato | Versión |
|---|---|
| OpenDRIVE | 1.8 |
| OpenSCENARIO | 1.3 |
Resumen del alcance
Sección titulada «Resumen del alcance»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.
Véase también
Sección titulada «Véase también»- Arquitectura del exportador — qué hace el pipeline entre el snapshot y el archivo.
- Añadir un formato de destino — conecta CARLA, SUMO, Unity o cualquier otra cosa.