4、地图数据准备:点云地图(PCD)生成、矢量地图(Lanelet2/OpenDRIVE)制作、地图坐标系转换、地图加载与验证

说实话,地图数据准备是整个Autoware仿真流程里最容易被低估的一环。我见过太多人花大把时间调参数、改代码,结果车子一跑就偏,最后发现是地图坐标系没对齐。嗯,这章我们就来把地图这块彻底讲透。

4.1 点云地图(PCD)生成——从原始数据到高精地图

点云地图说白了就是激光雷达扫出来的「三维照片」。它记录了每个反射点的X、Y、Z坐标和强度值。Autoware的定位模块就是靠这个来匹配当前车辆位置的。

生成PCD地图的典型流程:

  1. 数据采集——用激光雷达(比如Velodyne VLP-16)绕着目标区域跑一圈。我个人习惯跑两圈,一圈慢速、一圈正常速度,这样能覆盖更多细节。
  2. 点云拼接——用NDT或ICP算法把每一帧点云对齐。这里有个坑:如果GPS信号不好,拼接出来的地图会「飘」。我在项目中遇到过,在隧道里采集的数据,出来一看墙都是歪的。
  3. 滤波与降采样——用PCL库的VoxelGrid滤波器,把点云密度降到每立方米几十个点就够用了。太密了反而拖慢匹配速度。
  4. 导出PCD文件——保存为二进制格式(.pcd),文件小、加载快。

核心命令示例:

# 用pcl_ros工具把bag转成pcd
rosrun pcl_ros bag_to_pcd input.bag /velodyne_points ./pcd_output

# 或者用NDT匹配拼接(我常用这个)
rosrun ndt_mapping ndt_mapping_node
  _use_odom:=false
  _use_tf:=true
  _output_pcd:=final_map.pcd

我的小技巧:生成完PCD后,用CloudCompare打开看一眼。如果地面有明显的「分层」或「重影」,说明拼接参数没调好。我曾经因为IMU标定不准,折腾了整整两天才发现问题。

4.2 矢量地图制作——Lanelet2 vs OpenDRIVE

点云地图告诉车子「我在哪」,矢量地图告诉车子「路怎么走」。说白了,矢量地图就是道路的「骨架」——车道线、交叉口、红绿灯、限速标志,全在这里面。

两种主流格式对比:

特性 Lanelet2 OpenDRIVE
起源 学术界(慕尼黑工大) 工业界(Vires/ASAM)
数据结构 点、线、区域(轻量) 道路、车道、连接(重型)
Autoware支持 原生支持(推荐) 需转换工具
学习曲线 低(一两天上手) 高(一周起步)
适用场景 园区、城市道路 高速公路、复杂立交

我个人强烈建议初学者先用Lanelet2。为什么?因为它的设计思路更贴近「人怎么理解道路」。你想想看,一条车道就是一条线,交叉口就是几个点的连接,多直观。

用Vector Map Builder制作Lanelet2地图:

  1. 加载PCD点云作为底图
  2. 沿着车道中心线画点(每5-10米一个点)
  3. 设置车道宽度、方向、速度限制
  4. 标注停止线、人行横道、红绿灯位置
  5. 导出为.lanelet2或.osm格式

注意:画车道线时,一定要保证点与点之间的间距均匀。我见过有人画得歪歪扭扭,结果车辆规划出来的路径像蛇一样扭来扭去。嗯,这其实是个很常见的坑。

4.3 地图坐标系转换——别让坐标「打架」

这是最容易出问题的地方。Autoware里至少涉及三个坐标系:

  • 世界坐标系(WGS84经纬度)——GPS用的
  • 地图坐标系(UTM或自定义)——PCD和矢量地图用的
  • 车辆坐标系(base_link)——车体中心

它们之间的转换关系,说白了就是一个「平移+旋转」的矩阵运算。但实际做起来,坑特别多。

我曾经踩过的坑:

有一次,我用RTK-GPS采集了地图原点坐标,结果加载地图后车辆位置偏了30多米。查了半天,发现是UTM分区搞错了——我用的Zone 50,但地图数据是Zone 51的。你想想看,差一个分区就是几十公里的偏差。

坐标系转换的核心步骤:

# 用GeographicLib做经纬度转UTM
from geographiclib.geodesic import Geodesic

# 定义地图原点(比如:东经121.47°, 北纬31.23°)
origin_lat = 31.23
origin_lon = 121.47

# 转成UTM坐标(Autoware默认用UTM)
# 这个转换Autoware内部会自动做,但你要确保原点设置正确

验证方法:加载地图后,用rviz2的「Publish Point」工具点一下地图上的某个特征点(比如路灯杆),看它的坐标是否和PCD文件里的一致。如果不一致,八成是坐标系转换参数错了。

4.4 地图加载与验证——跑起来之前先「体检」

地图做好了,怎么知道它能不能用?我一般按这个顺序验证:

  1. 可视化检查——在rviz2里同时加载PCD和Lanelet2地图,看车道线是否贴合点云。如果偏差超过20厘米,就得重新调整。
  2. 拓扑检查——用Autoware自带的lanelet2_validation工具检查车道连接是否完整。比如,有没有断头路?有没有车道方向标反了?
  3. 仿真测试——在模拟器里让车辆沿着地图跑一圈,看规划模块是否报错。我习惯先跑直线,再跑弯道,最后跑交叉口。

快速验证命令:

# 检查Lanelet2地图完整性
rosrun lanelet2_validation lanelet2_validation_node
  _lanelet2_map:=/path/to/your_map.osm

# 加载地图到Autoware
roslaunch autoware_launch map.launch
  pointcloud_map_path:=/path/to/pcd
  lanelet2_map_path:=/path/to/osm

嗯,这里要特别提醒一句:地图验证不是一次性的。每次修改地图后,都要重新跑一遍验证流程。我见过有人改了一个红绿灯位置,结果整个交叉口的拓扑全乱了。

本章知识体系总览

下面这张图概括了地图数据准备的核心逻辑:从原始传感器数据出发,经过点云地图和矢量地图两条线,最终汇合到Autoware的仿真环境中。

地图数据准备核心流程 传感器数据采集 数据预处理 点云地图(PCD)生成 矢量地图(Lanelet2)制作 NDT拼接 → 滤波 → 导出PCD 画车道线 → 标属性 → 导出OSM 坐标系转换(WGS84 ↔ UTM ↔ 地图) 地图加载与验证 → 仿真运行

这张图把整个流程串起来了。你从最上面的「传感器数据采集」开始,一路往下走,经过预处理后分两条线——左边做点云地图,右边做矢量地图。最后在坐标系转换这一步汇合,经过验证后就能跑仿真了。

说实话,地图准备这件事,第一次做可能会觉得繁琐。但只要你按照这个流程走一遍,后面再改地图就快多了。我自己的经验是:第一次花三天,第二次花半天,第三次就只需要改几个参数了。

本章要点回顾:

  • PCD地图是定位的基础,精度直接影响车辆行为
  • Lanelet2比OpenDRIVE更适合初学者,但复杂场景还是得用OpenDRIVE
  • 坐标系转换是最大的坑,务必用可视化工具验证
  • 地图验证不是一次性的,每次修改都要重新检查

可可精品资料库