3. 高精地图数据结构

做定位这么多年,我越来越觉得——高精地图就是自动驾驶的「骨架」。没有它,传感器再好也白搭。今天咱们聊聊高精地图里最核心的几种数据结构。说白了,就是地图在计算机里到底长什么样。

3.1 矢量地图 vs 栅格地图

先搞清楚两个基本概念:矢量地图和栅格地图。嗯,这俩的区别,我刚开始也迷糊过一阵子。

矢量地图,存的是点、线、面。比如车道中心线,就是一条折线,存一串坐标点。路沿石,就是一个多边形。优点是精度高、占用空间小。我习惯用矢量地图做匹配定位,因为可以直接算点到线的距离,效率很高。

栅格地图,存的是像素。每个格子存一个值,比如0表示可通行,1表示障碍物。优点是直观,适合做路径规划。但缺点也明显——分辨率越高,文件越大。我曾经在项目里试过5cm分辨率的栅格图,一张图就几百兆,加载慢得要命。

类型 存储方式 优点 缺点 典型用途
矢量地图 点、线、面 精度高、体积小 不适合表达连续场 匹配定位、车道级导航
栅格地图 像素网格 直观、适合规划 体积大、精度受限 障碍物检测、路径规划
我的习惯:定位模块用矢量地图,规划模块用栅格地图。两者配合使用,效果最好。

3.2 车道线模型

车道线是高精地图里最基础的元素。你想想看,车要沿着车道走,定位就得知道车道线在哪儿。

常见的车道线模型有三种:

  • 三次样条曲线:用几个控制点拟合出一条平滑曲线。精度高,但计算量大。
  • 分段线性:用很多小线段连起来。简单粗暴,适合高速场景。
  • 多项式模型:比如y = ax³ + bx² + cx + d。我比较常用这个,因为参数少,更新快。

举个例子,一段车道中心线的数据长这样:

{
  "id": "lane_001",
  "type": "center_line",
  "points": [
    [120.123456, 30.987654, 0.0],
    [120.123789, 30.987321, 0.5],
    [120.124123, 30.986987, 1.0]
  ],
  "width": 3.5,
  "speed_limit": 60
}

注意看,每个点除了经纬度,还有高度。为什么?因为路面不是平的。我在项目里遇到过,忽略高度差,定位结果直接偏了半米——这在车道级定位里是不能接受的。

避坑指南:我曾经在一条高架桥下的路段做测试,桥面和地面高度差3米。如果地图里没有高度信息,匹配结果会直接跑到桥上去。所以,车道线模型一定要带z坐标。

3.3 路标模型

路标就是路上的标志物,比如交通牌、路灯杆、护栏。这些是定位的「锚点」。为什么?因为它们位置固定,传感器容易检测到。

路标模型通常包含:

  • 位置:经纬度+高度
  • 类型:杆状物、平面标志、立体标志
  • 特征描述:颜色、形状、尺寸
  • 置信度:这个路标是否可靠

我个人习惯把路标分成两类:

  1. 绝对路标:位置非常精确,比如交通牌。可以用来做绝对定位修正。
  2. 相对路标:位置精度一般,但相对关系稳定,比如路灯杆。适合做相对定位。

你想想看,如果路上有100个路灯杆,每个杆的位置误差10cm,但杆与杆之间的距离误差只有1cm。那用相对关系做匹配,反而更准。这个道理,我是在一次雨夜测试中悟出来的——当时GPS信号很差,全靠路标做相对定位才没跑偏。

3.4 拓扑关系

拓扑关系,说白了就是「路是怎么连起来的」。哪条车道能变到哪条车道,哪个路口能左转,这些信息都靠拓扑关系来表达。

常见的拓扑结构:

  • 节点-边模型:路口是节点,路段是边。简单直观。
  • 车道级拓扑:每条车道是一个节点,车道之间的连接是边。更精细,但数据量大。
  • 分层拓扑:先粗粒度(路段级),再细粒度(车道级)。我比较推荐这种,因为可以按需加载。

举个例子,一个十字路口的拓扑关系:

{
  "intersection_id": "cross_001",
  "incoming_lanes": ["lane_A1", "lane_B1", "lane_C1", "lane_D1"],
  "outgoing_lanes": ["lane_A2", "lane_B2", "lane_C2", "lane_D2"],
  "connections": [
    {"from": "lane_A1", "to": "lane_B2", "type": "left_turn"},
    {"from": "lane_A1", "to": "lane_C2", "type": "straight"},
    {"from": "lane_A1", "to": "lane_D2", "type": "right_turn"}
  ]
}
核心要点:拓扑关系决定了定位的「搜索空间」。如果拓扑错了,定位算法再牛也白搭。我见过一个案例,地图里把左转车道标成了直行,结果车在路口一直走错道。

3.5 知识体系总览

下面这张图,是我自己总结的高精地图数据结构关系。你看一眼就能明白各个模块怎么配合。

高精地图数据结构体系 高精地图 矢量地图 栅格地图 车道线模型 路标模型 拓扑关系 障碍物栅格 可通行区域 定位匹配策略:ICP / NDT / 粒子滤波 / 图优化

从这张图你能看出来,矢量地图和栅格地图是两条线。矢量地图负责精细的结构信息,栅格地图负责环境感知。两者最终都服务于定位匹配算法。

我的建议:刚开始做高精地图的同学,先吃透矢量地图。因为定位算法90%的时间都在跟矢量数据打交道。栅格地图更多是辅助作用。

好了,这一章的内容就这些。数据结构是基础中的基础,后面讲匹配算法的时候,你会反复用到这些概念。记住一句话:地图数据质量,决定了定位精度的上限。

一句话总结:矢量地图管「结构」,栅格地图管「环境」,车道线和路标是「锚点」,拓扑关系是「骨架」。四者缺一不可。

可可精品资料库