做LVIO-SLAM有一段时间的人,基本都绕不开一件事:相机和激光雷达之间的外参标定。标题里这个是系列笔记的第二十一篇,正好讲到相机与雷达外参标定,我猜很多人在实战里遇到过这样的场景——点云投影到图像上,边缘总是差那么几个像素,地面勉强对齐但墙面错开,定位轨迹短期看着没问题,时间一长就飘。这套系统的定位精度、建图质量,很大程度上取决于外参标得准不准。
这篇先聊离线标定的原理部分,也就是“相机与雷达外参标定(1)”该覆盖的内容:为什么要标、标定问题怎么建模、基于标定板的方案是如何求解的。后续再展开在线标定和联合标定的实操部分。如果你正在跑LVIO框架,或者打算把相机和雷达装到同一台设备上做感知和定位,这篇文章的核心内容是绕不开的基础。
1. 外参标定在LVIO系统里到底解决什么问题
1.1 三个传感器各自“看到”了什么
激光雷达、相机、IMU在LVIO系统里分工明确,但也各有所短。激光雷达直接输出三维点云,几何信息准确但稀疏,颜色和纹理信息几乎没有;相机输出图像,纹理丰富但缺少深度;IMU输出加速度和角速度,不依赖外部环境,却有积分漂移。
问题就出在“各有所短还要相互配合”这句话上。要让点云的深度补到图像的纹理上,或者让图像的视觉残差引导雷达的几何观测,就必须知道每个传感器之间的空间变换关系:雷达坐标系原点相对相机光学中心偏移了多少,三个轴分别转了多少角度。这个变换关系就是外参。
外参标定就是要估计出这个变换关系的精确数值。如果外参存在误差,最直观的现象就是点云投影到图像上对不齐——那种“明明是一条直线,从激光雷达视角看是笔直的,投影到图里却变成折线”的情况,基本就是旋转误差导致的。
1.2 外参误差如何顺着残差链扩散到整个系统
LVIO系统同时运行多条残差链。视觉观测通过特征点重投影误差约束位姿;激光雷达通过点到面、点到线的距离残差约束位姿;IMU通过预积分约束相邻帧之间的运动。这三条链最终都在优化后端里融合,空间一致性就是通过外参来维持的。
假如雷达和相机之间的外参有偏差,视觉和雷达各自估计出的位姿就会不一致。优化器面对这种不一致,只能把误差当作噪声或者做折中处理,最终结果会演变成两种情况:一种是系统把错误归结到别的变量上,导致地图漂移;另一种是长期运行中某个传感器的权重被削弱,整个系统的鲁棒性下降。
我在某设备上实跑LVIO时就观察过一个现象:雷达外参的旋转分量偏了大概0.6度,视觉惯导单独跑的时候轨迹精度还行,但一旦开启雷达融合,整体精度反而变差了,而且回环检测后地图还会出现细微的重叠重影。查来查去,就是外参的问题。
1.3 为什么不能用“大概对齐”凑合
有朋友说,我手工量一下安装位置,角度按说明书估一下,行不行?短期看,勉强凑合。长期看,不行。
原因有两个。第一,实车安装很难做到零误差。支架加工公差、螺丝锁紧后的微小形变、外壳应力,都会让实际外参和设计值有偏差。第二,LVIO系统对旋转外参的敏感度相当高。假设雷达位置离相机光心20厘米,如果旋转外参误差仅0.5度,投影到20米外的目标时,位置偏差就是大约17厘米。对于建图、目标级定位这类任务,这个误差完全不能接受。
所以外参标定不是“可做可不做”的事,而是整个传感器融合系统的前置条件。外参没标好,后面跑再好的算法也白搭。
2. 标定前必须建好的两个数学模型:SE(3)与残差定义
2.1 六个自由度的几何意义
外参不是一个数,而是从激光雷达坐标系到相机坐标系的一个刚体变换。刚体变换有三个旋转自由度和三个平移自由度,统称六个自由度。
旋转部分可以用旋转矩阵R表示,属于特殊正交群SO(3)。平移部分用平移向量t表示。组合在一起就构成特殊欧氏群SE(3):
T_cam_lidar = [[R, t], [0, 1]]
这个4x4矩阵的含义是:给定激光雷达坐标系下的一个三维点p_lidar,通过T_cam_lidar可以把它变换到相机坐标系下:
p_cam = R * p_lidar + t
标定的目标,就是估计R和t的最优值。旋转矩阵有3个独立元素,但实际优化时一般不直接优化矩阵里的9个数,因为旋转矩阵必须满足正交性约束(R^T R = I,det(R) = 1),直接优化会引入冗余甚至非法的旋转。工程上通常用李代数so(3)来表达旋转增量,用李群SE(3)来表达完整的刚体变换。
简化理解的话:外参标定的本质,是找到一个能准确描述“同一个三维点在两个传感器坐标系之间坐标映射关系”的刚体变换,旋转决定方向,平移决定原点位置。
2.2 四个坐标系的链条关系
LVIO系统里不止激光和相机两个坐标系,实际参与运算的包括世界坐标系、相机坐标系、雷达坐标系、IMU坐标系。
- 世界坐标系:地图和轨迹的参考系,通常与第一帧IMU或雷达位姿对齐。
- 相机坐标系:以相机光心为原点,视觉特征的位置由它描述。
- 雷达坐标系:以雷达扫描中心为原点,点云几何位置由它描述。
- IMU坐标系:以IMU测量中心为原点,加速度和角速度由它描述。
把LVIO的数据流拆开看,链条是这样的:相机看到图像特征,估计出相机在世界系中的位姿;雷达扫描得到点云,估计出雷达在世界系中的位姿;IMU在自身坐标系里积分,给出帧间运动增量。要让这三条链对齐到同一个世界系,就必须知道每一对传感器之间的外参:T_cam_imu和T_lidar_cam。
这篇重点讨论T_lidar_cam,也就是雷达在相机坐标系下的位姿。
2.3 残差模型的两种主流选择:点到面和点到线
标定外参需要构建几何约束。激光雷达扫描到的是一个三维点集,相机拍摄到的是一个二维图像平面。纯视觉特征和点云点之间没有直接对应关系,所以要把几何约束建立在“点”与“几何元素”之间。
点到面的残差:雷达点落在某个平面附近,理想情况下该点到平面的距离应为0。这个约束用于拟合标定板平面特别合适,因为标定板本身就是平面,点云打在标定板上,点到平面的距离可以作为残差。
点到线的残差:雷达点落在某条直线附近,理想情况下点到直线的距离应为0。这个约束适合利用环境中的边缘特征,比如墙角、门框、柱子的棱线。
外参标定过程中,这两种残差都有使用。点到面更稳定,因为平面在点云中容易提取和拟合;点到线在某些场景下精度更高,但线特征提取的鲁棒性不如面特征。实践中,可以用标定板的平面做主要约束,用环境中明显线特征做辅助约束。
3. 有标定板路线的核心原理:从点线面约束到非线性优化
3.1 为什么平面标定板是最稳妥的出发点
点云和图像的数据形式差异很大,想在自然场景里做外参标定,需要找两个传感器都能观测到的共同特征。标定板之所以稳妥,是因为它同时提供了三种信息:平面几何信息、视觉特征信息、明确的边界线信息。
点云扫到标定板上,通过平面拟合可以直接求出板平面在雷达坐标系下的法向量和距离。相机拍到标定板,通过棋盘格角点或ArUco码可以求出板平面在相机坐标系下的位姿。同一个平面在两种传感器坐标系下各有描述,这两个描述之间的变换关系,正好就是外参。
标定板带来的优势是简单且可控。板面是平面,几何公式清晰;板上的图案提供了丰富的视觉参考,角点和边界都能准确提取;采集时可以自由调整板在不同距离、不同角度下的姿态,让约束覆盖外参的所有维度。
3.2 标定板的位姿先验如何获得
既然要用同一个平面在两套坐标系下的信息做约束,第一步就是把这两种信息分别提取出来。
雷达侧,给定一帧点云中落在标定板上的点集,可以用RANSAC平面拟合求解平面方程。平面方程在雷达坐标系下写成:
n_lidar^T * p + d_lidar = 0
其中n_lidar是平面单位法向量,d_lidar是原点到平面的距离。相机侧,通过识别标定板上的棋盘格角点,用PnP算法可以求解标定板平面在相机坐标系下的位姿。假设板平面的法向量在相机坐标系下为n_cam,平面上某个已知点到原点的距离为d_cam。
这里要强调一点:雷达点云通常有噪声,仅靠一帧点云拟合平面可能不稳定,尤其是标定板面积小、距离远的时候。实践上一般会融合多帧点云,或者对标定板进行多次扫描再拟合,有效降低单帧噪声的影响。
3.3 构造并求解优化问题
有了同一平面在雷达坐标系和相机坐标系下的两种表达,外参标定就变成了一个优化问题:寻找一个T_lidar_cam,使得通过该变换映射后,两边的平面表达尽量一致。
构造残差的方式有很多种,最直接的是将雷达坐标系下的平面法向量和距离变换到相机坐标系,与相机侧的观测作差:
r = [R * n_lidar + ? - n_cam; d_cam - (n_cam^T * t + d_lidar)]
严格推导的话,平面变换公式还需要处理法向量变换的细节,但原理上可以这样理解:外参的正确性,同时约束旋转和平移。旋转误差会体现在法向量方向不一致上,平移误差会体现在平面偏移距离不一致上。
通过多组“雷达点云拟合平面+相机位姿估计平面”的观测对,可以构建一个包含多个残差的非线性最小二乘问题:
T = argmin Σ ||r_i||^2
使用高斯牛顿法或Levenberg-Marquardt方法迭代求解。每一步迭代计算残差向量r_i关于外参增量的雅可比矩阵,求解增量,更新外参,迭代至收敛。雅可比矩阵的推导是将外参用于SE(3)流形上的扰动模型,在李代数层面做微分。
实际应用中,我习惯用ceres或g2o实现这套优化。这类库支持自动求导,虽然雅可比推导可以省去,但理解扰动模型的基本思想还是必要的,否则遇到收敛失败的情况时无法定位问题。
4. 跑通标定流程前必须做对的三件事:数据采集、初始值和配置
4.1 数据采集的实操要点:场景、位姿、断档
标定优化做得好不好,一半取决于数据采得好不好。采集不是简单让传感器对着标定板拍几张就完事,有几个要点值得注意。
场景选择:标定板周围不要有太多其他平面或反光物体,否则点云中很难干净地分割出标定板区域。反光金属面不仅会让雷达产生异常点,也会干扰相机检测。
位姿覆盖:标定板必须在雷达和相机的共同视野内,并且要有足够多的不同姿态。我通常会让标定板在相机的四个象限里都出现,分别做正视、俯仰偏转、左右旋转和前后移动。没有充足的位姿覆盖,旋转自由度和平移自由度之间可能发生耦合,导致解出的外参在某些方向上精度很差。
数据断档问题:采集时要确保每一帧数据里标定板都是完整可见的,不能让板的某一角超出视野,会导致平面拟合和角点检测都不稳定。宁可多采集几次,也不要试图用残缺数据去凑。
4.2 初值敏感性:旋转和平移初始值有偏会发生什么
非线性优化对初值敏感。外参的初始值如果偏差过大,优化很容易落到局部极小值,结果看起来残差很小,实际投影仍然对不齐。
在标定流程中,建议先用粗略手段获得一个靠谱初值:可以手动在点云和图像中选几个共同可见的角点,用三点法估计初始外参;也可以参考机械设计图先给出安装位置和角度,再用标定数据精修。
平移初值的误差容忍度比旋转初值要高一些,因为平移误差主要影响残差中的常数项,旋转误差则直接影响残差梯度方向。如果旋转初值差超过10度,基于平面的优化很容易陷入错误解,表现为收敛后残差下降缓慢,或者投影效果依然错位。
我在标定一个设备时,就遇到过初值旋转差10度的情况。第一次跑优化,残差从10降到3就降不下去了。排查后确认,初值的旋转方向反了,通过修正初始旋转量,优化很快就收敛到残差0.5以下。这就是初值重要性的一个直观例子。
4.3 传感器时间同步对结果的影响
外参标定假设雷达和相机观测的是同一时刻的环境。如果时间不同步,标定板在运动过程中采集到的雷达点云和图像不是同一姿态下的观测,平面约束就会引入额外误差。
时间同步不严的情况下,标定结果可能出现一种奇怪的现象:静态采集时投影完美对齐,运动过程中边角出现拖影或错位。这是因为时间偏差点云和图像在时间轴上错开了,导致动态场景下几何不一致。
所以在正式标定前,先确认传感器的时间戳是否对齐。雷达点云的时间戳、相机图像的时间戳、IMU采样的时间戳,三者之间可能会有固定的延迟,需要在系统里补偿。具体做法取决于硬件方案,有的设备支持PTP同步,有的用软件PPS同步,这些时间同步的细节最好在标定前处理好。
5. 结果质量判定与常见坑(以实际数据为例子)
5.1 怎么看标定结果合不合格
优化跑完之后,如何判断外参标定质量?
最直接的方法是投影检查。把雷达点云投影到图像上,观察点云边缘和图像边缘的对齐程度。如果外参准确,标定板的激光点应该精准地落在图像中标定板区域内,边缘线上不能有明显的错位或重叠。
还有几个量化角度可以辅助判断。一是残差的最终分布:残差均值接近0,且标准差较小,说明优化收敛得不错;残差呈现明显的偏态分布,说明某个方向上的约束不足或数据有误。二是用多组验证数据测试:标定时用的数据在采集条件上可能和真实使用场景有差异,最好在采集数据中留一部分不参与优化,专门用来验证外参的泛化效果。
我习惯的做法是:标定完成后,用另一组完全独立采集的数据做投影验证。对标定板在不同距离、不同角度下的投影效果分别检查,确认都满足要求,才认可这个外参可用。
5.2 常见质量问题与排查方向
外参标定结果质量差,通常能从现象反推原因:
- 投影在图像中心对齐良好,但边缘区域偏差大:大概率是相机镜头畸变未被正确矫正,而不是外参问题。需要先做单目相机内参标定,确保畸变参数准确。
- 投影在近距离对齐良好,远距离偏差逐渐拉大:旋转外参的误差通常是主因,因为旋转误差产生的偏移随距离线性放大。
- 投影整体有固定偏移,但方向一致:平移外参误差为主,此时检查平面距离残差是否偏大。
- 多组优化结果差异很大:采集数据时标定板的位姿覆盖不足,或者优化陷入局部极小值。需要重新采集更丰富位姿的数据,并检查初值。
5.3 一个补充思路:为什么后来很多方案转向在线标定
离线标定的一大缺点是繁琐且易出错,需要专门采集数据、依赖标定板、处理时间同步,标定一次后如果设备有轻微变形或松动,外参就失效了。这也是后来很多LVIO方案在系统运行中实时估计外参的原因——外参被纳入状态向量,作为隐藏状态在定位建图过程中持续优化。
在线标定的好处是始终跟踪外参的变化。设备受振动、温度变化影响后,外参会缓慢漂移,在线估计能自动修正,让长时运行的定位精度保持稳定。
但离线标定仍然是基础。在线标定需要一个足够好的初始外参,如果初值差太多,在线优化同样会发散。因此“先离线粗标定+后在线精修”是工程上比较稳妥的组合。这篇内容先把离线标定的原理和流程讲透,后续再展开在线标定的实现细节。
我在实际项目中最大的体会是:外参标定不是一次性的工作,而是一个需要纳入系统维护流程的常规步骤。设备安装完要标;设备经过碰撞、维修、拆装之后要复标;长期运行中也要持续关注投影对齐情况。一个负责任的外参维护策略,比任何花哨的算法都更能保证系统稳定。
最后分享一个实用的小技巧:标定过程中把标定的中间结果都记录下来,包括每帧点云拟合的平面参数、相机侧估计的板位姿、每次迭代的残差变化。一旦标定结果异常,这些数据能帮助你快速定位是标定板识别失败、点云拟合异常还是收敛状态不对,省掉大量重复采集的时间。