打开并运行 .xosc 文件
drawtonomy 可以读取 OpenSCENARIO 1.x .xosc 文件,并在浏览器中用编译成 WebAssembly 的 esmini 运行它们。导入后的场景并非只读 — 动作、事件、操作和触发条件都进入同一个编辑器中,就像从头开始编写一样。
你需要两个文件
Section titled “你需要两个文件”.xosc 描述角色要做的事情。它不包含道路 — 它在 RoadNetwork 元素中引用一个 OpenDRIVE .xodr。没有这个道路,实体无处可置,所以 drawtonomy 在导入前会请求它。
导入前准备好两个文件。如果你的 .xosc 来自 esmini 代码库,对应的 .xodr 在 resources/xodr/ 目录中,与 resources/xosc/ 并列。
打开场景的三种方法
Section titled “打开场景的三种方法”在文件管理器中选中 .xosc 和 .xodr,将它们一起拖到画布上。这是最快的方式 — drawtonomy 会自动配对它们,只需一步导入:道路加载、角色放置到道路上、LOGIC 卡填充完成,无需第二次提示。
配对基于 .xosc 在其 RoadNetwork 元素中声明的道路名称。如果你拖放的 .xodr 不是被引用的那个 — 或只拖放了 .xosc — drawtonomy 无法完成配对,会回退到 OPENDRIVE MAP REFERENCED 横幅,让你指定正确的道路文件。
汉堡菜单 → Import…,然后选择 .xosc。
由于文件对话框只能选一个文件,drawtonomy 会在屏幕顶部显示一个横幅:
OPENDRIVE MAP REFERENCED
cut-in.xosc→../xodr/e6mini.xodr

点击 Open .xodr 选择道路文件。横幅还有一个 × 按钮;点击它会结束导入而不加载任何东西,所以如非取消,请使用 Open .xodr。
从 GitHub 链接
Section titled “从 GitHub 链接”在应用 URL 后追加 ?open= 和 GitHub 文件 URL:
https://drawtonomy.com/?open=https://github.com/esmini/esmini/blob/master/resources/xosc/cut-in.xosc该链接是实时的 — 试试看:
在 drawtonomy 中打开 esmini 的 cut-in 场景 →
drawtonomy 会获取 .xosc,读取其 RoadNetwork 引用,从同一代码库的同一提交或分支拉取 .xodr。它还会列举场景引用的 Catalogs 目录,加载找到的目录文件 — 这是唯一能自动解析目录的方式。
它接受什么、不接受什么:
| 支持的主机 | github.com 文件 blob 链接和 raw.githubusercontent.com |
| 不支持 | 其他主机和 tree/ 目录链接 |
| 代码库 | 必须是公开的 — 抓取是未认证的 |
| 速率限制 | 目录列表使用未认证的 GitHub API,上限是每小时 60 次请求 |
| 绝对道路路径 | RoadNetwork 指向 Windows 路径(C:\…)的情况无法解析;系统会改为请求 .xodr |
这使得单个链接足以与评审者分享一个可运行的场景 — 无需下载,无需安装。
分享你编辑的场景
Section titled “分享你编辑的场景”?open= 路由从 GitHub 读取,所以要分享你编辑的场景,把文件放在 GitHub 能提供的地方:
- 在 drawtonomy 中,Export →
OpenSCENARIO (.xosc)…,将 INCLUDE 设为.xosc+.xodr,让道路随场景一起传输。(保留导出生成的相对RoadNetwork路径。) - 提交并推送两个文件到公开的 GitHub 代码库。
- 从文件页面复制
.xosc文件的 GitHub blob URL(github.com/…/blob/…链接),附加到https://drawtonomy.com/?open=后面。
任何打开这个链接的人都会获得你编辑的场景、其道路,以及代码库包含的任何目录 — 自动解析,因为 ?open= 会从同一代码库加载目录。
导入生成的内容
Section titled “导入生成的内容”导入成功后,drawtonomy 会自动切换到场景模式,LOGIC 卡填充如下:
- 每个 OpenSCENARIO
Act变成一个阶段,保留其名称。一个包含CutInAndBrakeAct的场景会显示一个同名的阶段。 - 每个**
Event** 变成执行它的角色下的事件卡,标签是原始事件名称。 - 故事板的
StopTrigger变成 END CONDITIONS 节点 — 例如After CutInManeuver ends。
点击任何事件卡打开事件编辑器。触发条件、动作、动力学配置文件和优先级都能往返,所以导入的 Time gap to actor 触发条件读回时仍是 Time gap to actor 并带有相同的阈值。Maneuver 和 ManeuverGroup 名称保留在 ADVANCED 部分而非显示在卡上。
关于目录警告
Section titled “关于目录警告”许多已发布的场景声明 <CatalogLocations> 并从外部目录文件中拉取车型。导入此类文件时,drawtonomy 会显示一条信息吐司:
This scenario references external Catalogs that were not provided. Drop the catalog files with the .xosc, or actors may not load.
把它理解为信息,而非错误:
- 只要
.xosc声明目录位置就会出现,无论是否真正缺少什么。 - 标准车辆目录条目映射到 drawtonomy 的内置模型,所以大多数情况下每个角色都会用正确的形状、颜色和起始位置加载,场景能完整运行。
- 吐司会自己在几秒后消失;如需再次读取,重新导入文件。
- 目录确实会在
?open=GitHub 路由上自动解析。
如果导入后角色真的缺失,会很明显 — 受影响的实体根本不会在画布上出现。
编辑导入的场景
Section titled “编辑导入的场景”导入后可以改变任何东西,但一个细节容易被忽略。Variables 面板 — LOGIC 卡上的 {x} 按钮 — 直接说明了:
Editing values here does not change actions already imported with a literal value (references are resolved at import time).
换句话说:如果原始 .xosc 使用 $HostVehicle_Speed 且该参数是 27.7,导入的动作保持 27.7,不是引用。之后改变参数不会移动动作。编辑动作本身。
LOGIC 卡顶部的传输行驱动运行:播放和暂停、重置到开始、播放速率、跟随相机、幽灵轨迹和验证徽章。拖动或点击时间条可以跳转到任何时刻。完整信息见 播放。
对于导入的场景,值得养成两个习惯:
- 播放前设置跟随相机。导入的道路网络通常长达数公里,默认相机不跟踪任何东西。
- 用跳转而非观看。 每个姿态都来自仿真,所以暂停在切入的确切帧上是精确的,不是估计。
| 症状 | 原因 |
|---|---|
选择 .xosc 后什么都不加载 | 道路文件从未提供。重新导入并在横幅上使用 Open .xodr。 |
| 所有角色叠在一起 | 道路未加载,所以每个实体都回退到原点。检查 .xodr 是否与场景匹配。 |
| 一个角色半路停下再也不动 | 它到达了道路的末端。延伸道路或使用更长的 .xodr。 |
| 每次导入都显示目录吐司 | 对任何带 <CatalogLocations> 的 .xosc 都预期 — 见上方。 |
| GitHub 链接被拒绝 | 只接受 github.com blob 链接和 raw.githubusercontent.com,且代码库必须是公开的。 |
- 在浏览器中模拟 OpenSCENARIO 文件 — 以播放器为焦点的指南,包括视频导出。
- 阶段和事件
- 播放
- 什么是 OpenSCENARIO?
- 什么是 esmini?