4、地图数据准备:点云地图(PCD)生成、矢量地图(Lanelet2/OpenDRIVE)制作、地图坐标系转换、地图加载与验证
说实话,地图数据准备是整个Autoware仿真流程里最容易被低估的一环。我见过太多人花大把时间调参数、改代码,结果车子一跑就偏,最后发现是地图坐标系没对齐。嗯,这章我们就来把地图这块彻底讲透。
4.1 点云地图(PCD)生成——从原始数据到高精地图
点云地图说白了就是激光雷达扫出来的「三维照片」。它记录了每个反射点的X、Y、Z坐标和强度值。Autoware的定位模块就是靠这个来匹配当前车辆位置的。
生成PCD地图的典型流程:
- 数据采集——用激光雷达(比如Velodyne VLP-16)绕着目标区域跑一圈。我个人习惯跑两圈,一圈慢速、一圈正常速度,这样能覆盖更多细节。
- 点云拼接——用NDT或ICP算法把每一帧点云对齐。这里有个坑:如果GPS信号不好,拼接出来的地图会「飘」。我在项目中遇到过,在隧道里采集的数据,出来一看墙都是歪的。
- 滤波与降采样——用PCL库的VoxelGrid滤波器,把点云密度降到每立方米几十个点就够用了。太密了反而拖慢匹配速度。
- 导出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地图:
- 加载PCD点云作为底图
- 沿着车道中心线画点(每5-10米一个点)
- 设置车道宽度、方向、速度限制
- 标注停止线、人行横道、红绿灯位置
- 导出为.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 地图加载与验证——跑起来之前先「体检」
地图做好了,怎么知道它能不能用?我一般按这个顺序验证:
- 可视化检查——在rviz2里同时加载PCD和Lanelet2地图,看车道线是否贴合点云。如果偏差超过20厘米,就得重新调整。
- 拓扑检查——用Autoware自带的
lanelet2_validation工具检查车道连接是否完整。比如,有没有断头路?有没有车道方向标反了? - 仿真测试——在模拟器里让车辆沿着地图跑一圈,看规划模块是否报错。我习惯先跑直线,再跑弯道,最后跑交叉口。
快速验证命令:
# 检查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比OpenDRIVE更适合初学者,但复杂场景还是得用OpenDRIVE
- 坐标系转换是最大的坑,务必用可视化工具验证
- 地图验证不是一次性的,每次修改都要重新检查
可可精品资料库