4. 高精地图要素:车道线、路沿、交通标志、杆状物、路面标记的采集与表达
各位同学,今天我们来聊聊高精地图里最核心的“零件”——地图要素。
说白了,高精地图和普通导航地图最大的区别,就是它把路上的每一个细节都数字化了。我经常跟团队里新人讲,普通地图是给人看的,高精地图是给车看的。车看不懂“前方路口右转”,它需要知道车道线在哪、路沿有多高、红绿灯挂在哪根杆子上。
这一章,我就把五个最关键的要素掰开揉碎了讲。车道线、路沿、交通标志、杆状物、路面标记。嗯,每一个我都踩过坑,咱们一个一个来。
4.1 车道线:自动驾驶的“铁轨”
车道线是什么?它就是自动驾驶车辆的虚拟铁轨。车能不能跑在车道中间,全靠它。
4.1.1 采集要点
采集车道线,主流方案是用激光雷达+相机融合。我个人习惯用激光雷达做主传感器,因为它在夜间和逆光下表现稳定。
- 线型分类:实线、虚线、双实线、虚实线。每种线型对车辆行为约束不同。实线不能压,虚线可以变道。
- 颜色区分:白色、黄色、蓝色(某些特殊区域)。颜色错了,车就会“看不懂”规则。
- 宽度测量:标准车道线宽度是15cm,但国内很多老路只有10cm甚至8cm。我建议采集时精度做到±2cm。
关键参数:车道线采集的绝对精度要求通常为10cm(RMS),相对精度(相邻线之间)要求5cm。
4.1.2 表达方式
车道线在数据里怎么存?我们一般用三次样条曲线来表达。为什么不用直线?因为道路是有曲率的,直线拟合会丢失细节。
// 车道线数据示例(JSON格式)
{
"id": "lane_line_001",
"type": "solid", // 实线
"color": "white",
"points": [
[120.3456, 31.2345, 0.0],
[120.3457, 31.2346, 0.0],
...
],
"width": 0.15,
"material": "thermoplastic" // 热熔材料
}
这里要注意,points数组里的点不是随便采的。我一般要求每米至少采一个点,弯道处加密到每0.5米一个点。太稀疏了,车跑起来会抖。
我的经验:采集车道线时,一定要记录“中断点”。比如路口处车道线断了,这个断点位置必须精确。我曾经因为断点差了20cm,导致车辆在路口提前变道,差点撞上护栏。
4.2 路沿:车辆的“安全边界”
路沿,就是马路牙子。别小看它,它是车辆判断能不能靠边停车的依据。
4.2.1 采集难点
路沿的采集比车道线难。为什么?因为车道线是画在地上的,有明确对比度。路沿是立体的,而且很多路沿被泥土、树叶遮挡了。
我记得有一次在杭州采集,一条路的路沿被绿化带完全盖住了。激光雷达扫过去,根本分不清哪是路沿哪是土坡。后来我们不得不加了一组侧向激光雷达,专门扫路沿。
- 高度测量:标准路沿高度10-15cm,但有些老城区只有5cm。低于7cm的路沿,车辆基本可以骑上去。
- 材质区分:花岗岩、混凝土、金属。不同材质对雷达反射率不同,会影响检测。
- 连续性:路沿不能有超过5cm的缺口,否则车辆会误判为可通行区域。
4.2.2 表达方式
路沿我们通常用多边形(Polygon)或折线(Polyline)来表达。高度信息作为属性附加。
| 属性 | 类型 | 说明 |
|---|---|---|
| height | float | 路沿高度,单位米 |
| material | string | 材质类型 |
| continuity | bool | 是否连续 |
避坑指南:我曾经在深圳做项目,有一段路的路沿被重新铺装过,高度从12cm变成了8cm。但我们的旧地图没更新。结果测试车在靠边停车时直接骑了上去,底盘刮了。所以路沿数据必须定期更新,尤其是施工路段。
4.3 交通标志:车的“交通规则书”
交通标志,就是给车看的交通规则。限速牌、禁行牌、指示牌,一个都不能少。
4.3.1 采集方法
采集交通标志,相机是主力。但光有相机不够,因为标志是立体的,需要知道它的空间位置。我一般用相机+激光雷达联合标定,相机识别内容,雷达测距定位。
- 内容识别:用OCR技术识别标志上的文字和图案。限速60、禁止左转,这些必须100%准确。
- 位置定位:标志牌的中心点坐标,精度要求30cm以内。
- 朝向角度:标志牌面向哪个方向?这个很关键。面向来车方向还是背对?错了会导致车辆看不到标志。
4.3.2 表达方式
交通标志的表达,我习惯用节点(Node)+属性(Attribute)的方式。
{
"id": "traffic_sign_042",
"type": "speed_limit",
"value": 60,
"position": [120.3460, 31.2350, 5.2],
"orientation": 180.0, // 面向正南
"size": [0.6, 0.8], // 宽0.6米,高0.8米
"reflectivity": "high"
}
这里有个细节:orientation角度。我建议用朝向车辆行驶方向的角度,而不是绝对北向。因为车在行驶时,关心的是标志正对着自己还是侧对着自己。
小技巧:采集交通标志时,最好同时拍一张照片作为佐证。万一数据有疑问,可以回头查照片。我团队里有个规矩:每个标志至少拍三张不同角度的照片。
4.4 杆状物:路灯、信号灯、标志杆
杆状物,就是路上竖着的各种杆子。路灯杆、红绿灯杆、标志牌杆、监控杆。它们的作用是什么?给车辆提供参照物,尤其是定位用。
4.4.1 为什么需要杆状物?
你想想看,车辆在隧道里没有GPS信号,怎么定位?靠的就是杆状物。激光雷达扫到一根杆子,和地图里存的杆子匹配上,就能知道自己在哪。
我做过一个测试:在一条5公里长的隧道里,只靠杆状物匹配定位,误差控制在20cm以内。效果相当不错。
4.4.2 采集与表达
杆状物的采集,激光雷达是首选。因为杆子细长,相机容易漏掉,但雷达不会。
- 杆径:一般路灯杆直径10-20cm,信号灯杆更粗。精度要求±2cm。
- 高度:从地面到杆顶,精度要求±10cm。
- 类型:路灯、信号灯、标志牌、监控。不同类型,用途不同。
{
"id": "pole_123",
"type": "street_light",
"position": [120.3470, 31.2360, 0.0],
"height": 8.0,
"diameter": 0.15,
"material": "steel"
}
注意:杆状物的位置是根部坐标,不是顶部。因为根部在地面上,更容易和车辆感知对齐。
4.5 路面标记:箭头、文字、减速带
路面标记,就是画在地上的各种符号。直行箭头、左转箭头、公交专用道文字、减速带。这些标记告诉车“你应该怎么走”。
4.5.1 采集难点
路面标记的采集,最大的问题是磨损。新画的标记很清楚,但用了一两年后,很多都模糊了。我见过最夸张的,一个左转箭头只剩下一半,车根本识别不出来。
所以采集时,我们不仅要采标记本身,还要记录它的清晰度等级。清晰度低于60%的标记,建议标记为“需更新”。
4.5.2 表达方式
路面标记的表达,我推荐用多边形+语义标签。
| 属性 | 类型 | 说明 |
|---|---|---|
| type | string | 箭头、文字、减速带等 |
| content | string | 文字内容,如“公交专用” |
| clarity | float | 清晰度,0-1之间 |
| boundary | polygon | 标记的轮廓点集 |
{
"id": "road_mark_056",
"type": "arrow",
"subtype": "straight",
"clarity": 0.85,
"boundary": [
[120.3480, 31.2370],
[120.3481, 31.2371],
...
]
}
避坑指南:我曾经在成都做项目,有一段路的路面标记被重新画过,但旧标记没清除干净。结果地图里同时存在新旧两个左转箭头,位置差了30cm。车辆在路口犹豫不决,差点造成追尾。所以采集时一定要确认标记的“唯一性”,有重影的地方要人工核实。
4.6 要素融合:从采集到地图
好了,五个要素都讲完了。但实际工作中,它们不是孤立的。车道线、路沿、交通标志、杆状物、路面标记,必须融合到一张地图里。
我个人的工作流是这样的:
- 数据采集:用采集车跑一遍,拿到原始点云和图像。
- 要素提取:用AI模型自动识别各个要素。
- 人工校验:我团队里有个规矩,AI提取的结果必须经过人工抽检,抽检率不低于20%。
- 坐标对齐:把所有要素统一到同一个坐标系下(通常是WGS84或UTM)。
- 拓扑构建:建立要素之间的关联。比如,这个交通标志属于哪条车道?这根杆子支撑的是哪个信号灯?
嗯,这一步最费时间。但做好了,地图才能真正好用。
最后说一句:高精地图的要素采集,不是一次性的工作。道路在变,标记在变,杆子在变。我建议至少每季度更新一次核心道路的数据。别等到车跑上去出问题了,才想起来更新地图。
好了,这一章就到这里。下一章我们聊聊地图的坐标系统和精度控制,那是个更烧脑的话题。