3. LGSVL地图格式详解:Apollo格式(XML)、Lanelet2格式(OSM)、OpenDRIVE格式概览

好,咱们进入第三讲。说实话,地图格式这块是很多初学者容易懵的地方。我刚开始接触LGSVL时,面对三种格式也是一头雾水。今天我就把Apollo XML、Lanelet2 OSM和OpenDRIVE这三种格式掰开揉碎了讲清楚。

3.1 为什么LGSVL要支持三种地图格式?

你可能会问:搞一种格式不就行了?其实不是。这背后是不同自动驾驶生态的选择。

  • Apollo格式:百度Apollo生态的标配。我参与过几个Apollo项目,团队内部几乎都用这个。
  • Lanelet2格式:基于OpenStreetMap的扩展,轻量、灵活。我个人觉得它最适合做快速原型验证。
  • OpenDRIVE格式:工业级标准,ASAM组织维护。大厂和仿真平台的首选。

说白了,LGSVL这么做是为了兼容不同背景的用户。你用什么格式,它都能接。

3.2 Apollo格式(XML)详解

Apollo格式本质上是XML文件。它的核心结构是<opendrive>根节点,但内部做了大量自定义扩展。

核心结构

<opendrive>
  <header>
    <!-- 地图元信息 -->
  </header>
  <road>
    <!-- 道路几何、车道、连接关系 -->
  </road>
  <!-- 更多道路... -->
</opendrive>

我记得第一次解析Apollo地图时,被它的<laneSection>结构绕晕了。这里我给大家总结几个关键点:

  • 道路(Road):每条道路有唯一ID,包含多个车道段(LaneSection)。
  • 车道(Lane):每个车道有类型(driving、shoulder、sidewalk等)和宽度信息。
  • 连接(Junction):路口区域,定义车道之间的连接关系。

我的经验:Apollo格式中,车道ID的奇偶性有讲究。奇数ID表示左侧车道,偶数ID表示右侧车道。这个规则在手动编辑时特别容易出错,我曾经因为这个排查了一整天。

3.3 Lanelet2格式(OSM)详解

Lanelet2格式基于OSM(OpenStreetMap)的XML结构。它把道路拆解成更小的单元——Lanelet。

一个Lanelet代表一段车道,包含左右边界点。多个Lanelet通过<relation>连接成完整路网。

典型结构

<node id="1" lat="37.4" lon="-122.1" />
<node id="2" lat="37.4" lon="-122.1" />
<way id="10">
  <nd ref="1"/>
  <nd ref="2"/>
  <tag k="type" v="line_thin"/>
</way>
<relation id="100">
  <member type="way" ref="10" role="left"/>
  <member type="way" ref="11" role="right"/>
  <tag k="type" v="lanelet"/>
</relation>

嗯,这里要注意:Lanelet2的坐标是经纬度,不是笛卡尔坐标。所以导入LGSVL时,引擎会自动做投影转换。

避坑指南:我曾经在编辑Lanelet2地图时,不小心把line_thin写成了line_thin(少了个i)。结果LGSVL直接不渲染车道线。这种拼写错误特别隐蔽,建议用专门的编辑器(如JOSM)来编辑OSM文件。

3.4 OpenDRIVE格式概览

OpenDRIVE是三种格式中最复杂的,也是功能最完整的。它用数学曲线(三次多项式、螺旋线等)来描述道路几何。

核心概念是参考线(Reference Line)。所有车道都基于参考线偏移生成。

OpenDRIVE道路定义示例

<road name="Highway_1" length="500.0" id="1" junction="-1">
  <planView>
    <geometry s="0.0" x="0.0" y="0.0" hdg="0.0" length="500.0">
      <line/>
    </geometry>
  </planView>
  <lanes>
    <laneSection s="0.0">
      <left>
        <lane id="-1" type="driving" level="false">
          <width sOffset="0.0" a="3.5" b="0.0" c="0.0" d="0.0"/>
        </lane>
      </left>
    </laneSection>
  </lanes>
</road>

我个人觉得,OpenDRIVE的学习曲线最陡。但一旦掌握了它的参数化描述方式,你会发现它非常强大。

3.5 三种格式对比

特性 Apollo (XML) Lanelet2 (OSM) OpenDRIVE
坐标系统 笛卡尔坐标 经纬度 笛卡尔坐标
道路描述 基于车道段 基于Lanelet 基于参考线
复杂度 中等
编辑工具 文本编辑器 JOSM 专用编辑器
适用场景 Apollo生态 快速原型 工业级仿真

3.6 我的选择建议

如果你是初学者,我建议从Lanelet2格式入手。它结构简单,用JOSM可视化编辑非常直观。等你熟悉了地图概念,再挑战OpenDRIVE。

如果你在Apollo平台上开发,那就老老实实用Apollo格式。毕竟生态兼容性最重要。

小技巧:LGSVL支持格式转换。你可以用它的内置工具把Lanelet2转成Apollo格式。我经常先用Lanelet2快速搭建地图,再转成Apollo格式做正式测试。

好了,三种格式的概览就讲到这里。下一节我们会深入Lanelet2格式的细节,手把手教你编辑一个完整的地图。