第三章:高精地图采集技术——采集车硬件配置与多传感器标定
大家好,我是你们的老朋友。今天我们来聊聊高精地图采集中最“硬核”的部分——采集车到底长什么样?传感器怎么配?标定怎么做?
说实话,我入行那会儿,高精地图采集车还是个稀罕物。一台车动辄几百万,传感器堆得跟刺猬似的。现在好多了,但核心原理没变。你想想看,地图精度要到厘米级,传感器配置和标定就是地基。地基不稳,后面建图、更新全是白搭。
3.1 采集车硬件配置
一台标准的采集车,说白了就是“感知全家桶”。我习惯把传感器分成三类:定位的、感知环境的、以及做数据同步的。咱们一个个说。
3.1.1 激光雷达(LiDAR)
激光雷达是建图的绝对主力。它直接输出三维点云,精度高、不受光照影响。我个人习惯把LiDAR分成两类:
- 机械旋转式:比如Velodyne HDL-64、Hesai Pandar64。线束多(64线、128线),视野360°,但寿命短、震动敏感。我在早期项目里用过64线,夏天高温一晒,电机容易卡死,后来就换固态了。
- 固态/混合固态:比如Livox Horizon、Ouster OS系列。体积小、寿命长,但FOV(视场角)有限,通常需要多台拼接。我建议至少装3台,前向、侧向全覆盖。
关键参数:
- 线束:64线起步,128线更好
- 测距:200米以上(高速场景)
- 精度:±2cm以内
- 帧率:10Hz或20Hz
3.1.2 相机
相机负责提供纹理信息。点云是骨架,影像是皮肉。没有相机,建出来的图就是一堆灰点,没法看。
我常用的配置是:
- 前向主相机:1920×1080或更高,帧率30fps,配广角镜头(FOV 90°-120°)。用于车道线、交通标志识别。
- 侧向/环视相机:4-6个,覆盖360°。用于路沿、护栏等侧面要素。
- 鱼眼相机:2个,装在车顶前后。用于路口、地下车库等大角度场景。
我的经验:相机和LiDAR的帧率一定要匹配。LiDAR是10Hz,相机最好也是10fps或20fps。否则时间戳对齐会非常痛苦。我曾经因为相机用了30fps而LiDAR是10Hz,结果每帧点云要插值3次,精度直接掉了一个量级。
3.1.3 IMU(惯性测量单元)
IMU提供加速度和角速度。它解决的是“短时高精度”问题。GPS信号一丢,全靠IMU撑着。
我建议选工业级或战术级IMU:
- 陀螺仪零偏稳定性:≤1°/h
- 加速度计零偏稳定性:≤0.1 mg
- 输出频率:200Hz以上
嗯,这里要注意。IMU的温漂很严重。我有个项目在新疆跑,白天40度,晚上零下,IMU数据直接漂到没法用。后来加了恒温箱才解决。
3.1.4 GPS/GNSS
GPS提供绝对位置。高精地图要求厘米级定位,所以必须用RTK(实时动态差分)或PPK(后处理动态差分)。
| 模式 | 精度 | 适用场景 |
|---|---|---|
| 单点GPS | 2-5米 | 不适用 |
| DGPS | 0.5-1米 | 低精度采集 |
| RTK | 2-5厘米 | 实时建图 |
| PPK | 1-3厘米 | 后处理建图 |
我个人更倾向PPK。虽然不能实时出图,但后处理可以结合IMU做平滑,精度更稳。RTK在城市峡谷里经常丢固定解,一丢就是米级误差。
3.2 多传感器标定原理
传感器装好了,但各自有各自的坐标系。LiDAR有LiDAR坐标系,相机有相机坐标系,IMU有IMU坐标系。不标定,数据就是乱的。
标定的本质,就是求传感器之间的外参(旋转矩阵R和平移向量t)。我把它分成两步:
3.2.1 LiDAR与相机标定
这是最常用的标定。LiDAR点云投影到图像上,看是否对齐。
具体做法:
- 准备一个标定板(棋盘格或圆点板)
- 采集多组LiDAR点云和相机图像
- 在点云中提取标定板的角点,在图像中也提取角点
- 用PnP算法求解外参
# 伪代码示例
def lidar_camera_calibration(lidar_points, image_points):
# lidar_points: 标定板角点在LiDAR坐标系下的3D坐标
# image_points: 对应角点在图像中的2D坐标
R, t = solve_pnp(lidar_points, image_points, camera_matrix)
return R, t
避坑指南:我曾经用单张图像标定,结果重投影误差很小,但实际建图时点云和影像总是错位。后来发现是标定板太近,远距离外参不准。正确做法是:标定板放在3米、5米、10米、15米多个距离,各采集10组以上数据。
3.2.2 LiDAR与IMU标定
这个稍微复杂点。IMU输出的是角速度和加速度,LiDAR输出的是点云。两者时间戳对齐后,通过运动约束求解外参。
我常用的方法是:
- 让采集车做“8”字运动,持续30秒
- 用LiDAR做帧间匹配(ICP或NDT),得到相对位姿
- 用IMU积分得到相对位姿
- 最小化两者差异,求解外参
3.2.3 相机与IMU标定
这个相对成熟。用Kalibr工具包,采集棋盘格视频和IMU数据,自动求解。
我个人习惯把三个标定结果统一到一个参考系。通常以IMU为中心,LiDAR和相机都标定到IMU坐标系下。这样后续融合方便。
3.3 点云与影像融合建图
标定完了,数据就能融合了。点云提供几何,影像提供纹理。融合建图就是把两者合在一起。
3.3.1 点云着色
最简单的融合方式。把LiDAR点云投影到图像上,取对应像素的RGB值赋给点云。
def colorize_pointcloud(points, image, R, t, camera_matrix):
# 将点云投影到图像平面
uv = project(points, R, t, camera_matrix)
# 取像素颜色
colors = image[uv[:,1], uv[:,0]]
return colored_points
但这里有个坑:点云是稀疏的,一个点可能对应多个像素。我建议用最近邻插值,或者用深度信息做加权平均。
3.3.2 语义融合
光着色还不够。高精地图需要语义信息,比如车道线、路沿、交通标志。这就需要把图像语义分割结果映射到点云上。
具体流程:
- 用深度学习模型(如UNet、SegFormer)对图像做语义分割
- 将分割结果投影到点云
- 对每个点云点赋予语义标签
- 用点云聚类算法提取要素(如车道线、路沿)
我的经验:语义融合的精度取决于两个因素:标定精度和分割模型精度。标定误差超过2个像素,语义标签就会错位。我建议标定后做一次“语义对齐验证”——找一条明显的车道线,看点云和图像是否对齐。如果偏差超过5cm,重新标定。
3.3.3 多帧融合与建图
单帧数据不够,需要多帧拼接。常用的方法是SLAM或BA(光束法平差)。
我习惯用基于图优化的方法:
- 每帧点云做帧间匹配(ICP或NDT),得到相对位姿
- 加入GPS/IMU约束,做全局优化
- 优化后,把所有点云变换到全局坐标系
- 用体素滤波降采样,得到最终地图
嗯,这里要注意。多帧融合时,点云会越来越密,但也会引入累积误差。我建议每100米做一个闭环检测,用回环约束修正漂移。
3.4 实战建议与避坑
最后,分享几个我踩过的坑:
- 时间同步:所有传感器必须用同一时钟源。我建议用PTP(精确时间协议)或GPS秒脉冲。否则时间戳偏差超过10ms,融合效果直接崩。
- 震动抑制:采集车行驶时震动很大。LiDAR和IMU必须刚性固定,最好用减震支架。我见过有人用双面胶粘IMU,结果数据全废了。
- 标定频率:传感器拆装一次就要重新标定。我建议每3个月或每5000公里做一次完整标定。日常可以用“在线标定”算法做微调。
- 数据存储:一台64线LiDAR+6个相机,每小时产生约200GB数据。车上要配大容量SSD,最好支持热插拔。我习惯用2TB的NVMe盘,一天一换。
一句话总结:采集车的硬件配置决定了数据质量的上限,而标定和融合决定了你能达到这个上限的多少。别在硬件上省钱,更别在标定上偷懒。
好了,这一章就到这里。下一章我们聊聊高精地图的实时更新策略——怎么让地图“活”起来。有什么问题,欢迎在评论区交流。