第三章:高精地图采集技术——采集车硬件配置与多传感器标定

大家好,我是你们的老朋友。今天我们来聊聊高精地图采集中最“硬核”的部分——采集车到底长什么样?传感器怎么配?标定怎么做?

说实话,我入行那会儿,高精地图采集车还是个稀罕物。一台车动辄几百万,传感器堆得跟刺猬似的。现在好多了,但核心原理没变。你想想看,地图精度要到厘米级,传感器配置和标定就是地基。地基不稳,后面建图、更新全是白搭。

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点云投影到图像上,看是否对齐。

具体做法:

  1. 准备一个标定板(棋盘格或圆点板)
  2. 采集多组LiDAR点云和相机图像
  3. 在点云中提取标定板的角点,在图像中也提取角点
  4. 用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 语义融合

光着色还不够。高精地图需要语义信息,比如车道线、路沿、交通标志。这就需要把图像语义分割结果映射到点云上。

具体流程:

  1. 用深度学习模型(如UNet、SegFormer)对图像做语义分割
  2. 将分割结果投影到点云
  3. 对每个点云点赋予语义标签
  4. 用点云聚类算法提取要素(如车道线、路沿)

我的经验:语义融合的精度取决于两个因素:标定精度和分割模型精度。标定误差超过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盘,一天一换。

一句话总结:采集车的硬件配置决定了数据质量的上限,而标定和融合决定了你能达到这个上限的多少。别在硬件上省钱,更别在标定上偷懒。

好了,这一章就到这里。下一章我们聊聊高精地图的实时更新策略——怎么让地图“活”起来。有什么问题,欢迎在评论区交流。