Pular para o conteúdo

Exportar para OpenDRIVE / OpenSCENARIO / esmini

O drawtonomy transforma uma cena desenhada à mão numa rede viária ASAM OpenDRIVE (.xodr) e num cenário OpenSCENARIO (.xosc), empacotados num único zip que pode reproduzir diretamente no esmini.

A conversão é deliberadamente básica — abrange as formas que mapeiam de forma limpa para o modelo de dados ASAM e exclui tudo o resto. Esta página documenta exatamente o que é convertido, o que o veículo exportado faz de facto e o que fica fora de âmbito, para que o resultado nunca prometa mais do que oferece.

O vídeo abaixo foi gravado numa única tomada: desenhar uma interseção, desenhar um percurso, gerar as pegadas, exportar o zip esmini e reproduzir o .xosc exportado no esmini.

Uma tomada: desenhar uma interseção, desenhar um percurso, gerar as pegadas, exportar o zip esmini e reproduzir o .xosc no esmini.

Existe um único ponto de exportação ASAM. O drawtonomy não expõe itens de menu separados para .xodr / .xosc — ambos os arquivos são produzidos em conjunto e compactados num único zip.

O submenu Export com .zip (esmini) em destaque

  1. Desenhe a sua cena (faixas, uma interseção, veículos, um percurso…).
  2. Abra o menu → Export → .zip (esmini).
  3. Introduza um nome base quando solicitado (por padrão: drawtonomy-<data>).
  4. Um <nome>.zip é baixado, contendo <nome>.xodr, <nome>.xosc e os recursos de modelos 3D do esmini referenciados pelo cenário.

A página atual completa é exportada — não existe modo de «só a seleção» para o destino ASAM.

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

Um veículo a seguir a trajetória exportada no esmini

O veículo percorre a linha laranja — essa linha é a FollowTrajectoryAction gerada a partir do percurso que desenhou.

Forma drawtonomyElemento OpenDRIVENotas
Laneum <road>1 faixa = 1 estrada independente
Traffic light<signal> na estrada mais próximaapenas tipo veículo / peão
Crosswalk<object type="crosswalk">colocado perpendicularmente à estrada
Polygon (≥3 pontos)<object type="patch"> com <outline>representa visualmente interseções e áreas

Tudo o resto — veículos, peões, pontos soltos, linestrings livres, texto, imagens — não é escrito no .xodr.

Detalhes sobre cada estrada:

  • A geometria é apenas linhas retas. A linha de referência da estrada é amostrada a partir dos bordos esquerdo/direito da faixa e emitida como segmentos <line>. Não é produzida geometria arc, spiral ou poly3.
  • Configuração de faixas fixa. Cada estrada tem exatamente uma faixa à esquerda (id=1), uma central (id=0) e uma à direita (id=-1), todas com type="driving". Estradas com múltiplas faixas e secções de faixas múltiplas não são representadas.
  • Marcações codificadas para uma linha solid white 0.13 m.
  • Sem junções. Cada estrada tem junction="-1" e nunca é gerado um elemento <junction>. As interseções são representadas apenas pelo polígono (visual) e pelas ligações predecessor/successor derivadas das conexões next / prev da faixa (apenas a primeira entrada).
  • Sem perfil de elevação / superelevaçãoelevationProfile e lateralProfile são emitidos vazios (estradas planas).
  • A escala é fixada em 16,67 px/m; a origem geográfica é 0.
Forma drawtonomyElemento OpenSCENARIO
Vehicleum <ScenarioObject> (<Vehicle> ou <Pedestrian>)
Path footprint (veículo principal)uma <FollowTrajectoryAction>

Um «peão» é simplesmente uma forma de veículo cujo nome de modelo corresponde ao padrão pedestrian/walk — é emitido como <Pedestrian> em vez de <Vehicle>. Faixas, passadeiras, semáforos e linestrings livres não são emitidos para o .xosc.

O cenário exportado é intencionalmente mínimo:

  • O único comportamento dinâmico é FollowTrajectoryAction — uma polilinha com marcas temporais. Não existem ações de velocidade, mudanças de faixa, respostas a semáforos, desvio de colisões nem condições de interação.
  • Cada entidade em movimento começa em SimulationTime ≥ 0 e o cenário tem um StopTrigger fixo aos 60 s.

Como uma pegada de percurso se torna movimento de veículo

Seção intitulada “Como uma pegada de percurso se torna movimento de veículo”

Esta é a parte central da exportação dinâmica, pelo que vale a pena ser preciso.

O painel de pegadas: Variable positioning, Interval e Anchor explicados

Um percurso (path) é uma linestring que desenha, e as pegadas (footprints) são cópias fantasma de um veículo dispostas ao longo dele (o rasto visível no editor). Na exportação:

  1. Só a pegada principal (a primeira) se torna um <ScenarioObject> em movimento. As cópias seguintes são uma pré-visualização no editor e são descartadas — obtém um veículo que percorre todo o trajeto, não uma fila.
  2. Os pontos de controle do percurso tornam-se os vértices da trajetória, em metros no referencial ENU.
  3. Cada vértice recebe um time, e o resultado é escrito como uma <Trajectory><Polyline> de <Vertex time="…"> dentro de uma <FollowTrajectoryAction>.

A velocidade é fixa (esta é a limitação principal)

Seção intitulada “A velocidade é fixa (esta é a limitação principal)”

A trajetória é temporizada a 10 m/s fixos (≈ 36 km/h). O drawtonomy não tem campo de velocidade em nenhum lado da interface, e o exportador nunca altera o valor padrão. No esmini, a entidade reportará sempre ≈ 36 km/h, independentemente do que desenhou. Não define a velocidade — controla o tempo através da disposição das pegadas, conforme descrito a seguir.

A opção «Variable positioning» decide como o tempo é distribuído ao longo da trajetória:

  • Uniforme (opção desativada) — as pegadas estão a intervalos de comprimento de arco iguais (Interval) e o tempo é distância / 10 m/s. O movimento tem velocidade constante. Alterar o Interval apenas muda o número de vértices escritos (densidade de amostragem); a forma do percurso e a duração total mantêm-se iguais.
  • Variável (opção ativada) — cada pegada está fixada numa posição ao longo do percurso, e a duração total é dividida em fatias de tempo iguais entre as pegadas. Onde as pegadas estão mais juntas, o veículo move-se mais devagar; onde estão mais espaçadas, move-se mais depressa. Esta é a única forma de variar a velocidade efetiva ao longo do trajeto.
Ação no editorEfeito na exportação
Mover um ponto de controle do percursoCoordenadas do vértice da trajetória + duração total (o comprimento muda, a velocidade mantém-se a 10 m/s)
Arrastar uma pegada em modo VariablePosição normalizada dessa pegada → time do seu vértice → velocidade local (efetiva) desse troço
Ativar/desativar Variable positioningAlterna entre temporização de tempo igual e de velocidade igual
Alterar Interval (modo uniforme)Apenas o número de vértices — a forma da trajetória e a velocidade não mudam
Alterar AnchorApenas o deslocamento visual das pegadas — não tem efeito na trajetória exportada
Alterar o modelo do veículovehicleCategory, modelo 3D, altura do bounding-box, predefinição de desempenho
Redimensionar o veículo (w, h)Dimensões do BoundingBox e geometria dos eixos
Rodar o veículoOrientação inicial (apenas quando o veículo não tem trajetória)
Mover o veículoWorldPosition inicial (ancorado ao início da trajetória, se existir)

Para responder diretamente à dúvida mais comum: sim — mover uma pegada a meio do percurso em modo Variable altera o plano de velocidade exportado, porque retemporizará esse segmento. Movê-la em modo Uniform, ou alterar o Anchor, não tem qualquer efeito.

Para ser transparente quanto ao âmbito, estes valores provêm de mapas ou constantes fixas, não de nada que possa editar: categoria/predefinições de desempenho do veículo, caminhos do modelo 3D, altura do veículo por categoria, geometria dos eixos (derivada das dimensões), modo de seguimento (position), o gatilho de paragem aos 60 s e — acima de tudo — a velocidade de trajetória de 10 m/s.

O exportador é distribuído em @drawtonomy/sdk e funciona sem o editor. Ao contrário do menu, o SDK permite também emitir os dois arquivos individualmente:

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// Empacotado (igual ao menu):
const { blob, baseName } = exporter.buildEsminiZip(snapshot, {
baseName: 'my-scene',
})
// Ou cada formato separadamente:
const xodr = exporter.exportToOpenDrive(snapshot)
const xosc = exporter.exportToOpenScenario(snapshot, {
xodrFilename: 'my-scene.xodr',
})

Para a API completa e pontos de extensão, consulte a Referência do SDK do Exportador.

FormatoVersão
OpenDRIVE1.8
OpenSCENARIO1.3

Suportado: estradas de linhas retas a partir de faixas; sinais, passadeiras e polígonos de interseção como objetos OpenDRIVE; um veículo por percurso a seguir uma trajetória temporizada; um zip esmini funcional que pode reproduzir de imediato.

Ainda não suportado: junções OpenDRIVE, geometria curva, estradas com múltiplas faixas, perfil de elevação; ações de velocidade OpenSCENARIO, mudanças de faixa, lógica de semáforos, interação entre múltiplos agentes ou qualquer controle de velocidade por veículo.