3. OpenDRIVE基础
OpenDRIVE 是 ASAM 维护的开放道路网络描述格式,用于以 XML 方式静态描述道路的几何走向、车道拓扑、交叉口连接、信号设施与路侧对象。在 ASAM 场景标准与工具链集成工程中,OpenDRIVE 通常承担“静态地图底座”的角色:OpenSCENARIO 描述动态行为,OpenDRIVE 提供行为发生的空间与规则约束。理解其核心元素与 XML 结构,是后续场景生成、仿真回放与一致性校验的前提。
一、核心原理:分层描述与引用式结构
OpenDRIVE 采用“分层 + 引用”的描述模型。最外层是 <OpenDRIVE> 根节点,其下包含 <header>、<road>、<junction>、<controller> 等一级元素。道路本身不直接存储绝对坐标,而是通过参考线(reference line)加横向偏移的方式定义车道边界,从而保证几何精度与拓扑一致性。
一条道路由 <road> 表示,内部依次包含 <link>(前后继关系)、<planView>(平面几何)、<elevationProfile>(高程)、<lateralProfile>(横坡超高等)、<lanes>(车道)、<signals>(信号)、<objects>(对象)。这种顺序并非随意,而是从“走向—高程—横断面—附属设施”逐层细化。
<junction> 与 <connection> 把多条道路的车道连接起来,信号与对象则挂接在道路坐标系上。
二、几何描述:planView 的五种基本段
平面几何位于 <planView> 下,由若干 <geometry> 段首尾相接组成,每段必须给出起点坐标 x、y、航向角 hdg 和长度 length,并选择以下五种几何类型之一:
<line>:直线段,无额外参数。<spiral>:回旋线(缓和曲线),用curvStart与curvEnd描述曲率线性变化。<arc>:圆弧,用curvature表示恒定曲率。<poly3>:三次多项式,用a、b、c、d描述局部坐标下的横向偏移。<paramPoly3>:参数化三次多项式,用pRange指定参数范围,适合复杂曲线。
高程由 <elevationProfile> 中的 <elevation> 段描述,横断面则由 <lateralProfile> 的 <superelevation>、<shape> 等控制。几何段之间必须连续,否则仿真器在拼接处会出现跳变。
三、车道模型:中心车道与左右车道
OpenDRIVE 用 <lanes> 描述横断面,其下分为 <laneOffset>、<laneSection>。每个 <laneSection> 以 s 为起点,包含 <left>、<center>、<right> 三组车道。中心车道 id 恒为 0,仅作为参考;左侧车道 id 为正且向左递增,右侧车道 id 为负且向右递减。
每条车道通过 <width>、<border>、<roadMark>、<speed> 等子元素定义宽度、边界、标线与限速。车道之间的连接关系由 <link> 中的 <predecessor>、<successor> 表达,这是构建车道级拓扑的关键。
<laneSection s="0.0">
<left>
<lane id="1" type="driving">
<width sOffset="0.0" a="3.5" b="0" c="0" d="0"/>
<roadMark type="solid" color="white"/>
<speed max="60" unit="km/h"/>
</lane>
</left>
<center>
<lane id="0" type="none"/>
</center>
<right>
<lane id="-1" type="driving">
<width sOffset="0.0" a="3.5" b="0" c="0" d="0"/>
</lane>
</right>
</laneSection>
四、交叉口、信号与对象
交叉口由 <junction> 描述,内部通过 <connection> 把进入道路(incoming road)与连接道路(connecting road)关联,并用 <laneLink> 指定具体车道映射。连接道路本身仍是一条 <road>,只是其 <link> 指向交叉口。
信号设施位于 <signals> 下,每个 <signal> 用 s、t 定位,id、name、type、subtype 描述类型,<validity> 限定作用车道。控制器 <controller> 与 <control> 把信号组织成相位组,供动态场景调用。
路侧对象位于 <objects> 下,包括 <object>、<pole>、<tree>、<signal> 等,用 s、t、zOffset、hdg 定位,可附加 <outline> 与 <material>。这些对象是场景中静态障碍物、标志牌与感知目标的重要来源。
五、典型场景与工具链衔接
以“城市十字路口左转”为例:主路与支路各是一条 <road>,交叉区域由 <junction> 描述,左转连接道路是一条独立的 <road>,其 <laneLink> 把主路左转车道映射到支路出口车道。信号灯通过 <signal> 与 <controller> 绑定,OpenSCENARIO 中的 TrafficSignalController 即可按 id 引用并切换相位。
| 核心元素 | XML 路径 | 关键属性 | 工程用途 |
|---|---|---|---|
| 道路 | OpenDRIVE/road | id、name、length、junction | 路网骨架与拓扑单元 |
| 平面几何 | road/planView/geometry | s、x、y、hdg、length | 道路走向与曲率 |
| 车道 | road/lanes/laneSection/lane | id、type、level | 通行能力与车道级路径 |
| 交叉口 | OpenDRIVE/junction | id、type | 多路连接与冲突区 |
| 信号 | road/signals/signal | id、type、subtype、s、t | 动态信号控制与场景触发 |
| 对象 | road/objects/object | type、s、t、hdg | 静态障碍与感知目标 |
六、常见误区与复盘要点
<geometry> 的 x、y 当作绝对坐标。实际上它们是该段起点的全局坐标,段内点需按 s 沿参考线推算。误区二:忽略
<laneSection> 的 s 连续性。相邻 section 的起点必须严格递增且覆盖整条道路,否则车道宽度会出现断裂。误区三:交叉口只写
<junction> 而不写连接道路。连接道路是真实可行驶的 <road>,缺失会导致仿真器无法生成转向轨迹。误区四:信号
<validity> 未限定车道,导致信号作用于全部车道,与真实渠化不符。
<header> 的坐标系与偏移,再沿 <road> 检查几何段连续性,最后核对 <junction> 的 <laneLink> 是否与车道 id 一致。工具链集成时,建议把 OpenDRIVE 解析结果与 OpenSCENARIO 中的道路 id、信号 id 做一次交叉引用检查,避免“场景引用了不存在的道路或信号”这类高频错误。
掌握上述元素与结构后,就能在工具链中稳定地完成“地图加载—车道匹配—交叉口解析—信号绑定—对象挂接”的完整链路,为后续 OpenSCENARIO 动态场景与仿真验证打下可靠基础。