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>。这些对象是场景中静态障碍物、标志牌与感知目标的重要来源。

OpenDRIVE 道路网络描述模型与 XML 结构 <OpenDRIVE> 根节点 <header> 版本 / 坐标系 / 偏移 <road> 道路(参考线 + 车道 + 附属) planView 平面几何 line / spiral / arc / poly3 elevationProfile 高程 / 纵坡 lateralProfile 超高 / 横坡 / 形状 lanes 车道 left / center / right geometry 段 x / y / hdg / length elevation 段 s / a / b / c / d superelevation s / a / b / c / d laneSection / lane width / roadMark / speed <junction> connection / laneLink <signals> signal / validity <controller> control / phase <objects> object / pole / tree 参考线定骨架 → 几何定走向 → 车道定通行 → 交叉口定连接 → 信号与对象定环境

五、典型场景与工具链衔接

以“城市十字路口左转”为例:主路与支路各是一条 <road>,交叉区域由 <junction> 描述,左转连接道路是一条独立的 <road>,其 <laneLink> 把主路左转车道映射到支路出口车道。信号灯通过 <signal> 与 <controller> 绑定,OpenSCENARIO 中的 TrafficSignalController 即可按 id 引用并切换相位。

核心元素XML 路径关键属性工程用途
道路OpenDRIVE/roadid、name、length、junction路网骨架与拓扑单元
平面几何road/planView/geometrys、x、y、hdg、length道路走向与曲率
车道road/lanes/laneSection/laneid、type、level通行能力与车道级路径
交叉口OpenDRIVE/junctionid、type多路连接与冲突区
信号road/signals/signalid、type、subtype、s、t动态信号控制与场景触发
对象road/objects/objecttype、s、t、hdg静态障碍与感知目标

六、常见误区与复盘要点

误区一:把 <geometry> 的 x、y 当作绝对坐标。实际上它们是该段起点的全局坐标,段内点需按 s 沿参考线推算。
误区二:忽略 <laneSection> 的 s 连续性。相邻 section 的起点必须严格递增且覆盖整条道路,否则车道宽度会出现断裂。
误区三:交叉口只写 <junction> 而不写连接道路。连接道路是真实可行驶的 <road>,缺失会导致仿真器无法生成转向轨迹。
误区四:信号 <validity> 未限定车道,导致信号作用于全部车道,与真实渠化不符。
复盘建议:拿到一份 OpenDRIVE 文件后,先校验 <header> 的坐标系与偏移,再沿 <road> 检查几何段连续性,最后核对 <junction> 的 <laneLink> 是否与车道 id 一致。工具链集成时,建议把 OpenDRIVE 解析结果与 OpenSCENARIO 中的道路 id、信号 id 做一次交叉引用检查,避免“场景引用了不存在的道路或信号”这类高频错误。

掌握上述元素与结构后,就能在工具链中稳定地完成“地图加载—车道匹配—交叉口解析—信号绑定—对象挂接”的完整链路,为后续 OpenSCENARIO 动态场景与仿真验证打下可靠基础。