自动驾驶系统进阶与项目实战(八)面向自动驾驶的高精度地图框架解析和实战
Lanelet2 是一种专为自动驾驶设计的高精度地图框架,基于 OpenStreetMap(OSM)格式。它提供了丰富的模块和功能,如路网规划、路径规划和交通规则支持。核心模块包括物理层(如点、线段等)、关联层(如车道)、拓扑层等。lanelet2 通过将 OSM 数据转换为可验证的形式实现地图验证,并支持多种语言和平台。在 Autoware 中应用时,lanelet2 地图被用于规划和感知系统中,并提供了特定的扩展属性以满足自动驾驶需求。同时,在 ROS 项目中使用 lanelet2 地图可以完成仿真任务并显示于 Rviz 中。构建自己的 lanelet2 地图需遵循相关法规要求,在中国可能需要资质支持。
自动驾驶系统进阶与项目实战(八)基于高质量地图数据的高精度地图框架构建与落地应用
前面讨论了一些关于大规模点云地图制作的方法以及其定位应用。
在高精度地图体系中占据重要地位的是点云图这一技术,在实际应用中主要应用于配准定位工作,并作为构建高精度地图过程中的关键几何辅助层(该层不仅能够反映路面的基本几何结构信息而且还能整合大量有效细节数据)。
产品形态下的高精度地图一般而言是包含丰富交通要素语义信息和精确坐标数据的一种矢量空间图形。
为了满足自动驾驶系统的需求我们有必要探讨如何建立一种专门针对自动驾驶业务需求的矢量地图。
目前行业在标准性解决方案方面尚未形成统一方案(OpenDrive并非专为自动驾驶设计)。
本文旨在深入探讨并实践使用Lanelet2框架构建适合自动驾驶需求的高精度地理信息空间系统。

Lanelet2是什么?
具体而言,Lanelet2是一套面向自动驾驶(即 HAD)的地图框架。它基于 C++ 开发。下图展示了自动驾驶模块如何利用该工具来构建和管理作为 HAD 服务的地图。

HAD地图的重要性不言而喻。然而目前市场上声称能够提供面向自动驾驶的高精度地图的厂商数量有限。开源的地图架构相对稀少 Lanelet 2项目的前身正是 Liblanelet 这一框架推动了 Bertha-Benz项目的开发(一个基于 HAD原型车的奔驰项目)。Liblanelet提供了基于C++语言的接口以支持路径规划 动作规划以及目标行为预测等功能 然而 Lib lanelet这个库存在一些短板 并不能支持上图中所示HAD系统中的许多功能 而Lanelet 2则是对这一库的一种改进版本。
地图格式(map format)目前呈现混乱的状态。
在地图数据源应用中,
最广泛使用的开源地图数据源当属OSM格式。
OSM全称Open Street Map,
其为一个开放源代码、基于Crowdsourcing构建的电子地图框架。
Lanelet2的设计理念
由上图可知HAD系统对于HD map的利用情况可以分为以下三个方面:
基于路网数据构建全局路径规划模型,并指导车辆行为决策与目标预测过程;
依赖车道线与其他辅助信息构建AD相关算法:涵盖路径规划与环境感知两大功能模块;
地图数据处理与定位配准环节主要负责接收并解析点云等关键地图图层数据;
该系统中的 routing 过程是从起点到终点的整体导航路径规划,在全局策略指导下运行;而 path planning 是基于当前规划方案实时确定下一步 100 米路径的具体走向及车道选择等细节,在局部范围内动态调整。两者的路径规划需求存在交集但并不完全相同:路径规划必须满足路由规划的基本要求
我们就从这三个方面理解Lanelet2的设计理念。
路网(Road network)
路网即地图中道路的拓扑关系,在传统的电子地图中,路网被定义为地图的核心结构。其中的道路元素具体而言,则是通过在路网基础上添加offset来进行描述的。在HAD系统中,使用路网语义的主要目标之一就是生成 routing 信息(即起点到终点的全局路径信息),与粗粒度的电子导航 routing 有所不同的是,在AD系统中的 routing 不仅需要明确车辆行驶的基本路线(road级别),还需要详细掌握车道(lane)级别的具体信息例如可通行的具体车道编号、是否为公交专用道以及车道转换的可能性等。
行为决策与路网信息具有高度关联,在现有的HAD系统中,行为决策遵循交通规则这一原则进行实现,并同时结合路径规划信息以提升准确性。类似地,在目标预测方面也有类似的依赖关系:通常情况下,在自己的车道上行驶或根据需要变道以适应道路环境;然而需要注意的是其适用性因参与者而异:对于非机动车和行人等特定群体而言,则可能需要根据具体情况灵活调整遵守的道路规则范围和空间布局等关键要素。
车道和环境要素信息
对于AD系统的规划特别是动作规划而言 车道的几何信息具有特别重要的作用
物理元素
基于配准定位的过程直接依赖于地图中某些物理元素的存在与应用。这些物理元素的类别与具体的定位方法之间具有关联性。涵盖诸如路标、护栏等信息,HAD map理论模型应当包含这些物理元素以实现基于地图的精确配准。
另一个主要挑战在于确保高度精度地图始终保持最新状态。这表明随着地图要素数量增加而需要更新的可能性也随之提高。大多数电子地图仅存储经过预先处理的结构化数据而不包括基本物理要素其变化往往难以被及时追踪。
在lanelet2论文中举了一个例子:假设我们在某条车道上移除了一个限速标志(sign),那么对应的位于该标后的路段(road segment)的限速也应当被取消。然而,在道路的另一端可能存在另一个限速标志(sign)。如果仅以道路属性来决定速度限制而不标明其来源信息依据的话,则会导致难以明确确定速度来源的信息依据
设计理念总结
Lanelet2将可被观测到的地图要素定义为地图的 物理层(physical layer) ,例如路标、红绿灯、交通标志以及防撞栏等可见设施。其他所有地图要素中还包括车道(lane)等抽象表示。同样地,在这种结构中我们引入了另一种层次—— 关联层(relational layer) ,它通过规则源与对应的车道建立关联关系。基于这些物理要素我们能够追踪并记录这些关联信息进而形成一个完整的地理信息体系其中涉及的关键节点包括:在道路交叉点处通常会省略明确标注车道线和车道边缘但由于道路网络的实际连接性需求HAD map必须包含这些隐含的存在元素以确保道路网络拓扑连通性这些隐含存在的关键节点属于我们的行为常识范畴而非直接可观察到的实际要素
从地图验证性这一视角来看,Lanelet 2 的作者主张应尽量避免这种"常识"元素与规则.一方面源于缺少物理相关联的元素,这为地图验证带来了诸多困难,另一方面"常识"有时也会发生变动.
扩展性是HAD地图必须具备的一项重要特性,在无人驾驶车辆算法不断进步的情况下,必然导致对地图的需求发生变化,并且需要能够适应各种国家和地区特有的交通法规。这些因素共同为地图的扩展性提出了更高的要求。为了构建面向自动驾驶的地图系统,lanelet2建议应遵循如下原则:
- 通过分析地图上所有信息与可观察元素(物理元素)之间的关联性进行验证;
- 覆盖所有潜在的道路通行区域,并非局限于 physically存在的道路。
- 确保各个车道间的交互关系清晰明确,并能从地图上直观识别哪些车道间可以变更道。
- 地图应包含关于行人和非机动车等其他交通参与者的行为规范及相关信息。
- 为了确保信息变更的可追踪性, 应将地图的信息源与其对道路交通的影响进行分离。
- 地图设计应具备良好的扩展性和模块化特性。
- 便于进行定期更新和维护的地图系统更容易实现功能升级。
基于上述原则基础,请您详细探讨Lanelet2在地图元素划分与定义方面的具体实现方式,并且同时参考OSM平台提供的Lanelet2地图数据格式的相关规定。
Lanelet2架构
由上述的设计理念可知,Lanelet2地图可以划分为:
物理层(Physical layer):该层面涵盖了所有直观可观察的元素。
关联层(Relational layer):该层面将物理层的元素与相关联的信息结合在一起,包括车道、区域以及交通规则等。
拓扑层(Topological layer):这一层面主要关注网络结构和连接关系,在城市交通管理中扮演着关键角色。
采用XML格式表示的OSM地图形式作为默认配置
Lanelet基础元素
Lanelet2地图主要包含6类基元(18年论文中为5类,后扩展为6类),分别是:
- Point objects: 点对象
- Line strings: 折线串
- Polygons: 多边形(polygon topology)
- Lanelets: 车道基本单元(basic lane units)
- Areas: 独立区域(independent zones or blocks)
- Regulatory elements: 法规要素(elements defining traffic rules)
前三种属于物理层部分,剩下的则构成关联层结构。每个节点都具有独特的标识码属性,在系统中我们依次考察基本单元的作用机制。
Points
在地图中, Points被视为最基本元素, 即使单个Points也可能携带特定含义, 比如可以代表如一根支柱等简单实体。然而, 在大多数应用场景下, Points往往以Linestrings的形式存在以构建更复杂的地理空间结构。值得注意的是,a single Point通常包括三维坐标信息, 并且在Lanelet2系统中具有独特地位——它是唯一内置空间定位数据的基本构建单元, 其他几何要素都通过与Point相关联的方式形成网络结构
<node id="1001" visible="true" version="1" lat="35.61834168094" lon="139.78068648494">
<tag k="ele" v="-2.5" />
<tag k="local_x" v="89576.40395318175" />
<tag k="local_y" v="42302.65455295006" />
<tag k="mgrs_code" v="54SUE895423" />
<tag k="subtype" v="" />
<tag k="type" v="" />
</node>
AI助手
Lanelet2中的Points会直接对应到OSM中的Node,并且ele字段的tag主要用于表示点的高度信息,在基于WGS84坐标系统中进行测量。
Linestrings
如图所示,在GIS空间分析中,由一系列有序点通过线性插值形成连续的线串被定义为LineString对象。这种对象主要用于描绘地图中各元素的轮廓特征,并广泛应用于道路标线、路缘石、外墙装饰以及栅栏等实体边界的表现;同时也能描述一些虚拟线条形式的对象;值得注意的是,在实际应用中LineString对象必须保证其数据完整性:首先不能包含重复采样点;其次必须保证几何拓扑关系满足不自相交的要求;此外为了实现统一功能定位需求,在每个LineString对象都需要附加一个type属性来明确其具体用途类型。

Polygon
Polygon简而言之是多边形的概念。它类似于Linestrings是由一系列线段构成的一组折线图形。其主要区别在于首尾相连形成闭合图形从而能够包围出一个明确的区域。在实践中常被用来表示特定的区域或领域(如个人感兴趣的领域)。
Lanelet
Lanelets作为地图中的车道划分的基本单位,在道路规划中扮演着关键角色。每一个 lanelets 即代表最小的车道分割单元,并意味着在同一 lane 内部的所有路段均遵循相同的交通规则。通过图示展示了 lanelets 的定义结构,请注意每个 lanelets 包含两条 lane strings 分别标识其左右边界,并形成了该 lanelets 的可通行区域(drivable area)。进一步说明的是,在实际应用中,默认情况下每个 lanelets 通常还会包含 Regulatory Elements 来规范该 lanelets 内的道路通行规则,并且相邻两个 lanelets 在端点处共享相同的 left 和 right boundaries;此外,在分析这些界限类型变化时会发现其背后隐藏着车辆变道的可能性信息:通过分析 lanelets 界线类型的变化情况(如直线、曲线等),可以确定车辆是否允许变道行为;需要注意的是,在某些特定场景下可能会省略绘制中心线这一非必选项;不过在采用 OpenStreetMap (OSM) 地图时,默认情况下系统会自动生成必要的 centerlines 路线以保证完整性和准确性

在lanelet框架中提供了一个示例来说明如何设置车道速度限制值
<relation id='45064' visible='true' version='1'>
<member type='way' ref='43822' role='left' />
<member type='way' ref='43564' role='right' />
<tag k='location' v='urban' />
<tag k='one_way' v='yes' />
<tag k='region' v='de' />
<tag k='subtype' v='road' />
<tag k='type' v='lanelet' />
</relation>
AI助手
Lanelet元素等同于OSM格式中的relation属性,在本图中展示了该Lanelet元素(ID为45064)在JOSM平台上的可视化呈现结果(图形中以粉红色线条表示)。

Area
Area与Lanelet相似,在实际应用中表现出良好的效果。它是由多条linestrings组成的区域,在实际应用中表现出良好的效果。
常用于描绘这些场景。
此外,在设计时还可以连接控制元素以制定相关的交通规则。
下图使用Area描述了两个停车区:

在osm格式中,采用type为multipolygon的关系用于表示Area,并对停车区进行实例说明。
<relation id='45420' visible='true' version='1'>
<member type='way' ref='44024' role='outer' />
<member type='way' ref='44402' role='outer' />
<member type='way' ref='44768' role='outer' />
<tag k='location' v='urban' />
<tag k='region' v='de' />
<tag k='subtype' v='parking' />
<tag k='type' v='multipolygon' />
</relation>
AI助手
该Area元素对应于下图中粉红色框内的停车区:

Regulatory elements(控制元素)
在数字地图中,控制元素设定了一系列的交通规则,在某些区域甚至会设定特殊车道标识。这些规则必须由lanelet或者area进行引用方能生效。下图展示的是信号灯相关的控制单元,该控制单元包含了停止线和红灯:

Lanelet2项目各个模块
Lanelet2论文的另一个重要贡献是依据上述设计理念与基本要素为基础开发出一套基于C++语言编写的地图框架系统。该系统作为lanelet2项目的主体架构,在设计实现上充分考虑了可扩展性和维护性要求。具体来说,在开发过程中我们采用了以下主要策略:首先通过严格的模块化设计实现了系统的可维护性;其次利用现代编程技术提升了系统的运行效率;最后通过完善的接口协议确保了系统的对外交互能力。
以下是改写后的文本
可以通过lanelet2_examples下的代码库深入学习lanelet2项目的API实现。由于具体实现细节超出了本文范围,请读者自行查阅官方文档。我们重点分析lanelet2在自动驾驶系统Autoware中的实际应用情况。
请注意,在本节的学习过程中,请各位同学在开始深入学习之前,请确保已经完成了lanelet2_examples下的代码学习与理解,并对其中的各项功能有了全面掌握后再进行下一步的学习。
Autoware对lanelet2的扩展
Autoware已抛弃基于CSV的map format,并采用lanelet2配合OSM格式的地图数据。其在AD系统中的架构及数据流如图所示:

lanelet2地图在系统中被称作vector map,在详细阐述了道路交通的语义信息后,在当前阶段主要用于planning和perception两个模块。其主要作用体现在提升系统的规划能力和感知能力上。
- Perception:
- 基于vector map进行目标轨迹预测(具体位于车道区域)
- 主要应用于红绿灯检测
Planning:
- 规划当前位置至目标终点的路径规划结果
- 在该场景中(注:目前最新的Autoware系统也采用了类似的 Apollo 规划模块架构,并根据具体场景进行了划分)计算沿车道行驶的运动轨迹
- 提取交通规则信息
为了满足自动驾驶系统各组件对HAD Map的需求而对lanelet2进行了扩展,在 lanelet2 的基础上进行了必要的扩展。其中包含必要属性与非必要属性之分,这些特性可表示为OSM中的Tag形式。进而我们将在下文详细探讨这一相关内容。
额外的必须属性
以下是按照您的要求对原文进行同义改写的版本
<node id='1' visible='true' version='1' lat='49.00501435943' lon='8.41687458512'>
<tag k='ele' v='3.0'/>
</node>
AI助手
在lanelet2框架中,属性名称为SpeedLimit的部分需要特别处理。其中OSM中的关系对应的Tag名是relation,在这种情况下,默认情况下该Tag并非必需Tag(non-mandatory tag)。由于此前已有详细的讨论表明存在多种定义SpeedLimit的方式(此处指上述提到的三种方法),为了确保命名的一致性和避免潜在的歧义性问题,则建议将该属性指定为必需Tag(mandatory tag),具体实现方式可参考后续章节的内容。
<relation id="34408" visible="true" version="1">
<member type="way" ref="34406" role="left" />
<member type="way" ref="34407" role="right" />
<tag k="speed_limit" v="30m/h" />
<tag k="subtype" v="road" />
<tag k="type" v="lanelet" />
</relation>
AI助手
- 交通信号灯
根据lanelet2的标准,默认情况下支持使用linestring和Polygon来描述交通信号灯。为了消除潜在的混淆,Autoware仅支持使用linestring来描述交通信号灯,如图所示。每个红绿灯由一条连续的linestring路径表示,该路径从左下方开始延伸至右下方,通过设置height属性确定其高度,例如在以下示例中。

<way id='13' visible='true' version='1'>
<nd ref='6' />
<nd ref='5' />
<tag k='type' v='traffic_light' />
<tag k='subtype' v='red_yellow_green' />
<tag k='height' v='0.5'/> <!-- this tag is mandatory for Autoware!! -->
</way>
AI助手
位于路口的区域的lanelet配置应具备turn_direction属性以实现左右转向灯的功能。
<relation id='1' visible='true' version='1'>
<member type='way' ref='2' role='left' />
<member type='way' ref='3' role='right' />
<member type='relation' ref='4' role='regulatory_element' />
<tag k='location' v='urban' />
<tag k='one_way' v='yes' />
<tag k='subtype' v='road' />
<tag k='type' v='lanelet' />
<tag k='turn_direction' v='left' /> <!-- this tag is mandatory for lanelets at intersections!! -->
</relation>
AI助手
使用Lanelet2地图完成仿真环境中的routing
在lanelet2地图中集成丰富交通元素,在自动驾驶系统中各模块将依据各自业务需求利用地图中的对应元素进行功能处理。本研究的实践环节将通过在lanelet2地图上实现起点至终点的 routing功能,并将其路由结果实时可视化于Rviz中,并整个实践环节构成一个基于C++语言开发的ROS ROS项目。
代码克隆与环境准备
建议您访问您的ROS workspace以获取这个项目
cd your_ros_workspace/src/
git clone https://github.com/AbangLZU/ad_with_lanelet2.git
AI助手
参考仓库中的README.md文件说明,在该节中提到安装lanelet2项目所需的依赖。通常情况下,请确保已准备好该项目所需的一些必要的库和工具。
安装好lanelet2相关依赖后,使用catkin build编译:
cd your_ros_workspace
catkin build
AI助手
如果你尚未安装 catkin build 工具,请通过以下命令完成配置:
本项目的仓库配备了Autoware官方发布的高精度地图样例(lanelet2格式),我们利用该地图进行实践操作,并将实践所得的地图文件存档于项目根目录下的指定位置:
map/map_loader/data/lanelet2_map.osm
AI助手
路径下。
Lanelet2地图的可视化和编辑
基于OS地图格式构建lanelet2_map数据集时,在实现lanelet2地图时(即基于 lanelet2_map.osm文件),可以方便地利用现有的osm tools chain进行查看与编辑操作。采用JOSM(一个Java实现的地图编辑器)对项目内的lanelet2_map.osm文件进行可视化与编辑操作。由于其基于Java语言开发,在不同操作系统环境下都可以方便地运行。访问官网获取最新版本的JOSM软件包下载地址,请确保您从网络上获取jar包后再运行本文采用的方式。
为系统配置Java环境,请参考官方文档:https://josm.openstreetmap.de/wiki/Download#Java 检查你的系统是否正确安装了Java软件。你可以通过以下方法验证:在命令行界面中运行java --version命令可以查看系统中的Java版本信息
openjdk 14.0.1 2020-04-14
OpenJDK Runtime Environment (build 14.0.1+7)
OpenJDK 64-Bit Server VM (build 14.0.1+7, mixed mode, sharing)
AI助手
下载好josm-tested.jar包后,在同目录下使用以下命令运行JOSM:
java -jar josm-tested.jar
AI助手
通过在JOSM界面中完成lanelet2地图样式和预设组合设置的添加。随后,请依次点击以下选项:

分别在项目中的lanelet2_maps/josm/目录下设置两个CSS文件lanelets.mapcss和lines.mapcss作为地图样式,并在预设组合标签部分加入该目录下的laneletpresets.xml文件:
接着,在配置文件中找到相应的配置项,并根据以下参数设置地图样式:
然后,在预设组合标签部分添加 lanelet2_maps/josm/ 目录下的 laneletpresets.xml 文件:

在JOSM软件中,请按照以下步骤操作:首先,在主界面左侧导航栏中找到并点击"路线编辑器"选项卡;随后,在屏幕上定位到"map/map_loader/data"子目录位置处,并双击打开名为lanelet2_map.osm的OSM数据文件。完成以上操作后,在JOSM环境中自动生成并展示该路线网的空间分布图。

你可在JOSM中查看和编辑地图中的各个元素。
在ROS中使用lanelet2地图完成routing
在你的ros workspace中,运行本项目:
cd your_ros_workspace
source devel/setup.bash
roslaunch src/ad_with_lanelet2/run_map_simulator.launch
AI助手
如图,map被加载与Rviz中:

run_map_simulator.launch内容如下,一共会启动4个ros node:
- planning节点:基于Autoware平台实现的简单planning功能
- map loader负责加载Autoware扩展版的lanelet2地图,并生成用于可视化的Rviz marker
- mission planning模块采用了Autoware的任务规划功能,并通过Routing算法实现路径生成
- Rviz软件通过启动并配置相应的参数来完成可视化任务
<launch>
<include file="$(find simple_planning_simulator)/launch/simple_planning_simulator.launch"/>
<include file="$(find map_loader)/launch/lanelet2_map_loader.launch"/>
<include file="$(find mission_planner)/launch/mission_planning.launch" />
<!--- Run Rviz-->
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find map_loader)/loader.rviz" />
</launch>
AI助手
单击Rviz软件界面中的2D Pose Estimate选项,在图形界面中定位当前位置于该区域。随后将显示于下文页面区域。

该仿真节点基于初始姿态init pose向base_link发送到world坐标的变换信息;随后,在Rviz软件中配置2D Nav Goal参数来指定路径规划的目标位置;具体可见以下动画演示。

如图所示,Mission Planning Module会根据预设的目标位姿动态规划 routing 路线(图中深色路线):

注解:基于Tier 4公司的开源地图(Autoware的主要维护者),该样例地图在日本地区通常遵循左侧优先的原则进行路径规划,在进行路径规划时应遵循左侧优先的原则设定起点与终点位置。
构建自己的Lanelet2高精度地图
总体而言,Lanelet 2 是一套基于开源理念开发的功能上较为完善的高精度地图架构方案,默认情况下专为自动驾驶系统设计,并提供丰富的技术支持和工具包。基于OpenStreetMap(OSM)平台构建这一架构,在实际应用中可显著提升开发效率与效果。对于许多开发者来说已经是迫不及待地希望将其应用于项目中。那么如何构建属于自己的lanelet2高精度地图方案呢?实际上,在实际操作过程中您会发现完整的建图流程涉及多个关键环节,在技术实现上具有较高的难度。特别是在中国建设公共道路高精度地图时需要满足特定的技术条件和资质要求。因此,在中国建设公共道路高精度地图时需要满足特定的技术条件和资质要求。在此背景下我们需要分以下几种情况进行具体讨论:
- 如果你是获得资质的传统图商/自动驾驶公司:支持Lanelet2格式的高精度地图成为趋势之一,在市场中具有广泛的应用前景;Autoware对lanelet2的支持可能提升国内对该数据格式的地图需求;
- 如果你是无资质的自动驾驶公司/高校研究者:推荐采用经过验证的高质量high-precision map产品的lanelet2方案,在性价比方面具有显著优势;
当下国内能够全面支持lanelet2(Autoware扩展版)并获得相关测绘资质认证的高精度地图生产机构中,深度智图(DeepMap)占据主导地位。其官方网站相关信息可通过参考链接获取。
参考
- lanelet2相关研究文章:https://www.mrt.kit.edu/z/publ/download/2018/Poggenhans2018Lanelet2.pdf
- lanelet2官方GitHub仓库:https://github.com/fzi-forschungszentrum-informatik/Lanelet2
- 个人lanelet2项目GitHub仓库:https://github.com/AbangLZU/ad_with_lanelet2
- Autoware平台官网:https://www.autoware.ai/
- JOSM平台:https://josm.openstreetmap.de/
- 深度智图平台:https://www.deepmap.ai/
