跳转到内容

导出至 OpenDRIVE / OpenSCENARIO / esmini

drawtonomy 可将手绘场景一键转换为 ASAM OpenDRIVE.xodr) 路网文件和 OpenSCENARIO.xosc) 场景文件,并打包为单个 zip,在 esmini 中直接回放。

转换功能有意保持精简——只覆盖能与 ASAM 数据模型对应的少数图形,其余一律忽略。本页详细说明哪些图形会被转换、导出的车辆实际如何运动,以及当前功能边界,确保输出不过度承诺。

下方视频一镜到底:绘制交叉口、绘制路径、生成车辆足迹、导出 esmini zip,再在 esmini 中回放导出的 .xosc

一镜到底:绘制交叉口、绘制路径、生成足迹、导出 esmini zip,再在 esmini 中回放导出的 .xosc。

ASAM 导出只有一个入口,drawtonomy 不单独提供 .xodr / .xosc 两个菜单项——两个文件始终一起生成并打包进同一个 zip。

高亮显示 .zip (esmini) 的导出子菜单

  1. 绘制好场景(车道、交叉口、车辆、路径……)。
  2. 打开菜单 → Export → .zip (esmini)
  3. 根据提示输入基础名称(默认为 drawtonomy-<日期>)。
  4. 浏览器下载 <name>.zip,其中包含 <name>.xodr<name>.xosc 以及场景所引用的 esmini 三维模型资源。

导出范围是当前页面的全部内容——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

车辆在 esmini 中沿导出轨迹行驶

车辆沿橙色线行驶——那条线就是由你绘制的路径生成的 FollowTrajectoryAction

drawtonomy 图形OpenDRIVE 元素备注
Lane(车道)一条 <road>1 条车道 = 1 条独立道路
Traffic light(信号灯)最近道路上的 <signal>仅机动车 / 行人类型
Crosswalk(人行横道)<object type="crosswalk">垂直于道路放置
Polygon(多边形,≥3 点)<outline><object type="patch">用于填充交叉口 / 区域的视觉效果

其他图形——车辆、行人、独立点、自由线段、文字、图片——均不写入 .xodr

道路的具体规格:

  • 几何形状仅为直线段。 道路参考线从车道的左右边界采样后,以 <line> 段输出。不生成 arcspiralpoly3 几何。
  • 固定车道布局。 每条道路恰好包含一条左车道(id=1)、一条中心车道(id=0)和一条右车道(id=-1),类型均为 type="driving"。不支持多车道道路和多路段。
  • 道路标线硬编码为 solid white 0.13 m
  • 无交叉口(junction)。 每条道路的 junction="-1"不生成任何 <junction> 元素。交叉口仅通过多边形补丁(视觉效果)以及从车道 next / prev 连接(仅取第一个条目)派生的前驱 / 后继链接来表示。
  • 无高程 / 超高。 elevationProfilelateralProfile 输出为空(平面道路)。
  • 比例尺固定为 16.67 px/m,地理原点为 0
drawtonomy 图形OpenSCENARIO 元素
Vehicle(车辆)一个 <ScenarioObject><Vehicle><Pedestrian>
Path footprint(路径足迹,前导车辆)一个 <FollowTrajectoryAction>

“行人”是指模板名称匹配行人 / 步行模式的车辆图形,导出时以 <Pedestrian> 而非 <Vehicle> 输出。车道、人行横道、信号灯和自由线段不写入 .xosc

导出的场景有意保持最小化:

  • 唯一的动态行为是 FollowTrajectoryAction——一条带时间戳的折线轨迹。不包含速度动作、变道、红绿灯响应、碰撞避让或任何交互条件。
  • 每个运动实体从 SimulationTime ≥ 0 开始,场景设有 StopTrigger 60 秒的硬限制。

这是动态导出的核心,有必要说清楚。

足迹面板:Variable positioning、Interval 和 Anchor 的说明

路径(path) 是你绘制的线段,足迹(footprints) 是沿路径排列的车辆残影(编辑器中可见的轨迹)。导出时:

  1. 只有前导足迹(第一个)会成为运动中的 <ScenarioObject>。其余残影只是画布预览,导出时丢弃——你得到的是一辆沿整条路径行驶的车辆,而非车队。
  2. 路径的控制点转换为轨迹顶点,坐标单位为世界(ENU)米。
  3. 每个顶点附带一个 time 值,结果写成 <FollowTrajectoryAction> 内的 <Trajectory><Polyline><Vertex time="…">

轨迹时间以硬编码的 10 m/s(约 36 km/h) 计算。drawtonomy 的 UI 中没有速度字段,导出器也从不覆盖默认值。在 esmini 中,实体始终以约 36 km/h 行驶,无论你画了什么。你无法直接设置速度,但可以通过足迹布局来调整时序,详见下文。

路径的”Variable positioning”开关决定时间如何沿轨迹分配:

  • 均匀模式(开关关闭) ——足迹以等弧长 Interval 间隔排列,时间为 距离 / 10 m/s,运动为匀速。调整 Interval 只改变顶点数量(采样密度),路径形状和总时长不变。
  • 可变模式(开关打开) ——每个足迹固定在路径上的某个位置,总时长被等分到各足迹之间。足迹密集处车辆行驶慢,稀疏处行驶快。这是在路线中改变有效速度的唯一方式。
编辑操作对导出的影响
移动路径控制点轨迹顶点坐标 + 总时长(路径长度变化,速度保持 10 m/s)
可变模式下拖动足迹该足迹的归一化位置 → 对应顶点的 time → 该段的有效速度
切换 Variable positioning在等时和等速时序之间切换
修改 Interval(均匀模式)仅改变顶点数量——轨迹形状和速度不变
修改 Anchor仅改变足迹绘制偏移——对导出轨迹无影响
更换车辆模板vehicleCategory、三维模型、包围盒高度、性能预设
调整车辆尺寸(w、h)包围盒尺寸和车轴几何
旋转车辆初始朝向(仅当车辆没有绑定轨迹时生效)
移动车辆初始 WorldPosition(若已绑定轨迹,则吸附到轨迹起点)

直接回答常见问题:是的——在可变模式下将足迹拖到路径中段会改变导出的速度规划,因为它重新分配了该段的时间。在均匀模式下拖动足迹,或修改 Anchor,则不会产生影响。

以下内容来自固定映射或常量,无法通过 UI 修改:车辆类别 / 性能预设、三维模型路径、各类别车辆高度、车轴几何(由尺寸推算)、跟随模式(position)、60 秒停止触发器,以及最重要的——10 m/s 轨迹速度。

导出器包含在 @drawtonomy/sdk 中,可脱离编辑器运行。与菜单不同,SDK 还支持单独输出两种文件:

import { exporter, createSnapshot } from '@drawtonomy/sdk'
const snapshot = createSnapshot(shapes)
// 打包(与菜单导出一致):
const { blob, baseName } = exporter.buildEsminiZip(snapshot, {
baseName: 'my-scene',
})
// 或分别导出各格式:
const xodr = exporter.exportToOpenDrive(snapshot)
const xosc = exporter.exportToOpenScenario(snapshot, {
xodrFilename: 'my-scene.xodr',
})

完整 API 与扩展点,请参阅 导出器 SDK 参考

格式版本
OpenDRIVE1.8
OpenSCENARIO1.3

已支持: 从车道生成直线段道路;将信号灯、人行横道和交叉口多边形作为 OpenDRIVE 对象导出;每条路径对应一辆车辆沿时序轨迹行驶;生成可立即回放的 esmini zip。

暂不支持: OpenDRIVE 交叉口、曲线几何、多车道道路、道路高程;OpenSCENARIO 速度动作、变道、红绿灯逻辑、多智能体交互,以及任何单车速度控制。