自动驾驶传感器标定实战:从相机内参到激光雷达外参的完整流程
2026/9/8 19:35:46 网站建设 项目流程

写这篇文章之前,先聊点实际的。我接触自动驾驶传感器标定这块有几年了,从最早拿着棋盘格在试验场里来回跑,到后面搭了一套半自动标定流水线,中间踩过的坑比很多教程里写的步骤都多。很多人觉得标定就是“拍几张照片、跑个脚本、出个外参”,真上手了才发现,光照、靶标、传感器本身的噪声、甚至是线束松动都能让结果漂得离谱。

这篇算是一份个人项目总结,核心是把自动驾驶里最常见的几种传感器标定——相机内参、相机-激光雷达外参、LIDAR-IMU标定、多传感器联合标定——从原理到落地流程完整过一遍,包括工具选型、参数设计、现场操作注意事项和排查思路。适合正在搭标定系统、或者做多传感器融合但被外参精度折磨的工程师参考,也对刚入行、想搞懂“标定到底在标什么”的人友好。

1. 标定的本质与整体思路拆解

1.1 标定到底在解决什么问题

自动驾驶车辆的感知系统通常由多类传感器组成:相机负责纹理和色彩,激光雷达提供精确的三维几何,毫米波雷达负责测速和远距离探测,IMU输出高频姿态和加速度。每个传感器都有自己的坐标系,而融合的前提是知道“同一个物体在不同传感器坐标系里的观测,如何映射到统一的车体坐标系下”。

标定要解决的就是这个映射问题,具体拆开是两层:

  • 内参标定:确定传感器自身的几何模型参数。比如相机的焦距、主点、畸变系数;IMU的刻度因子、零偏、轴间安装误差;激光雷达的各激光束俯仰角、水平角修正量。
  • 外参标定:确定传感器坐标系之间的刚性变换关系,通常用旋转矩阵R和平移向量t表示。例如“激光雷达坐标系到相机坐标系的变换”,就是视觉和多线激光融合的核心外参。

为什么不能靠CAD图纸或机械设计值直接算?因为实际装配存在毫米级偏差和角度偏差,车辆运行中悬架形变、温度变化也会导致外参发生漂移。标定的精度直接决定了感知融合的底限——外参差1度,50米处目标的位置误差就能差出将近1米,这对后融合或前融合算法都是不可接受的。

1.2 思路选型:离线标定、在线标定与自动标定

按工程落地场景,标定方案可以分为三类:

  • 离线标定:在产线或实验室使用靶标(棋盘格、标定板、反光柱)完成,精度最高,适合出厂标定和研发测试。相机内参、LIDAR-IMU外参一般都在这个阶段做。
  • 在线标定:车辆在真实运行中利用道路特征(车道线、杆状物、地面纹理)周期性地修正外参漂移。这类方案更工程化,因为实际使用中外参会因为碰撞、老化、更换部件而变化。
  • 自动标定:结合SLAM或里程计信息,在车辆正常行驶时提取成对特征,通过优化方法估计外参。比如开源方案中常见的“目标车辆行驶一段轨迹,用NDT配准激光雷达点云与IMU预积分轨迹”的做法。

我个人的经验是,产线/研发阶段别省离线标定的功夫,在线和自动标定只能作为“漂移后的补偿机制”,如果底子(内参和初始外参)就是歪的,自动标定算法再强也容易陷入局部最优。选型上,离线用靶标法、在线用特征法、长期用自监督法,三者配合,才能形成一个完整的标定链路。

1.3 工艺流程设计:标定应该放在哪个环节

标定不是一次性动作,而是一个贯穿整车生命周期的流程。在具体的项目里,我一般把标定分为三个阶段:

  1. 传感器级标定:单传感器内参,在传感器出厂或上车前完成,属于固定值。
  2. 车辆级标定:多传感器之间的外参,在整车下线或试制阶段完成。
  3. 运营级标定:车辆使用中的外参监控和修正,属于持续性的运维能力。

这样的分层设计,好处是可以把复杂度拆开。传感器级标定只要做一次,车辆级标定在产线上用同样的工位和工装重复跑,运营级标定则交给后台数据平台引导。如果所有标定都堆到整车阶段做,产线节拍根本承受不了,这也是很多标定系统从“算法问题”变成“工程问题”后的关键转变化。

2. 核心细节解析与实操要点

2.1 相机内参标定:张正友标定法的工程化落地

相机内参标定目前工业界绝对主流的方法还是张正友标定法。它只需要相机对平面棋盘格拍摄多张不同姿态的图片,就可以估计内参和畸变参数。原理上,它是利用“平面靶标上的已知角点坐标 -> 图像上的像素坐标”之间的单应性约束,先线性求解内参初值,再通过极大似然估计做非线性优化。

实操中的关键细节有以下几点:

  • 棋盘格质量:一定要用高精度打印或工业级陶瓷/玻璃棋盘格。我之前用过普通A4纸打印的棋盘格,角点检测本身没问题,但是纸张不平整、热胀冷缩会造成角点位置误差,最后标定出的焦距和实际值偏差了0.5%左右。对于感知融合来说,0.5%的焦距误差在图像边缘可能带来几个像素的投影偏差。所以要么用光学级板材,要么把纸板贴在平整的铝板上。

  • 采集姿势:张正友标定法要求棋盘格出现在画面的各个区域,尤其是边缘和角落。很多新手只拍正前方和左右各一张,结果内参在图像中心区域拟合得很好,边缘畸变修正完全不对。通常我会采集15到20张,覆盖不同距离和角度,确保棋盘格在画面中的占比在1/4到1/2之间变化。

  • 重投影误差的判断:标定完成后要检查角点的重投影误差。一般的经验值,工业相机内参标定重投影误差应在0.1像素以内,车载相机如果分辨率高、图像质量好也可以稳定在0.2像素以内。超过0.3像素就要检查数据是否存在运动模糊或者棋盘格反光问题。

  • 畸变模型的选择:车载相机一般用plumb_bob模型(k1,k2,p1,p2,k3),但鱼眼镜头需要换成equidistant模型。如果用错模型,即便重投影误差小,实际投影到3D空间时也会出现明显偏差。

2.2 激光雷达内参标定:比想象中更容易出问题

很多人忽略激光雷达的内参标定,觉得出厂就做好了。实际并非如此,尤其在低线束雷达和固态雷达上,内参偏差非常普遍。激光雷达内参包括每个激光束的俯仰角、水平偏置角、距离校正值(距离补偿),以及旋转轴与底座的安装误差。

做LIDAR内参标定时,常见的做法是使用平面靶标或者专用的柱状靶标。数据采集时,雷达扫描平面靶标会产生一条弧线(对应某一束激光打在靶标上的点),通过拟合该弧线并与平面方程比较,就可以算出该束激光的角度误差和距离补偿值。

实操中我遇到的一个高频问题是温度变化对激光雷达内参的影响。激光雷达在冷启动和长时间运行后,内部激光器和接收器的热漂移会让测距值变化几个厘米。这对于近距感知影响不大,但在标定外参时会被提取得特征点吸收,导致外参在某些温度下偏了。后来我在标定流程里加入了一条规范:标定前必须让雷达开机预热至少20分钟,并记录环境温度,这算是成本最低但效果最明显的提升步骤。

2.3 外参标定的数学基础与手眼标定关系

外参标定的本质是求解两个传感器坐标系之间的刚性变换T = (R,t)。求解方法可以分成两类:

  • 目标靶标法:传感器同时观测同一个靶标,通过靶标在不同传感器坐标系里的位姿约束求解外参。比如相机和激光雷达同时看棋盘格,或者用一个带有特征点的标定板。
  • 自然特征法:不使用靶标,而是通过运行轨迹或环境特征(如地面反射强度图、道路边缘)做配准。比如LIDAR-IMU标定,利用激光雷达点云配准得到运动估计,再与IMU预积分轨迹进行对齐,本质上解一个手眼标定问题AX=XB。

手眼标定公式AX=XB的意思是:A代表一个传感器自身的运动,B代表另一个传感器自身的运动,X就是它们之间的外参。实际工程中,A和B都含有噪声,所以不能简单套用线性解法,一般会用两步法:先估计旋转,再估计平移,或者直接用李代数上的非线性优化把所有参数放在一起估计。

这块的实践经验参考如下:

  • 旋转估计对噪声更敏感,因此采集数据时要保证足够的旋转激励,比如“走8字”“绕Z轴大幅旋转”。
  • 平移估计对应的是IMU加速度计的积分,因此零偏估计不准会直接影响平移精度。实操中我会先做IMU内参标定,再做LIDAR-IMU外参标定,顺序不能反。
  • 手眼标定对初始化敏感,推荐先用经典的线性解法(如Tsai方法)给出初始值,再用非线性优化精化,不要直接上非线性优化,否则容易掉进局部最优。

2.4 标定中时间同步的隐含问题

时间同步虽然不直接属于“坐标变换”的范畴,但它跟标定精度强相关。如果相机和激光雷达的时间戳没有对齐,车辆运动时,目标在点云中的位置和图像中的位置就会发生错位,这个错位反映在外参上就是“虚拟的平移和旋转误差”。在实际标定过程中,如果传感器之间存在10ms的时间偏差,而标定场景中车辆或靶标在运动,那么这个偏差就会直接渗透到外参估计里。

所以我在做外参标定之前,会先检查:

  • 传感器输出的时间戳是否基于同一时钟域。
  • 如果存在时间偏移,是否用PTP或NTP同步过。
  • 标定数据采集时是否让车保持静止(静止时时间不同步的影响会小很多)。

对于动态标定场景,强烈建议先做时间同步再做外参标定,顺序不要反。

3. 实操过程与核心环节实现

3.1 工具链选择:ROS、Kalibr、Autoware标定工具

标定是强工具型工作,选对工具能节约大量时间。目前工程和学术界常用的工具有:

  • Kalibr:ETH Zurich开源的相机-IMU标定工具箱,支持相机内参标定、相机-相机外参标定、相机-IMU外参标定。它使用连续时间样条表示轨迹,对动态数据支持很好。
  • lidar_camera_calibration:Autoware等开源项目里常用的激光雷达-相机外参标定工具,通常需要用户手动选取角点/标定板边界。
  • 但凡是传统的手写脚本:这类脚本适合项目前期快速验证,比如用PCL或OpenCV库写一个简单的外参估计脚本。缺点是可靠性低,错误率极高,只适合打样。

我在项目里实际采用过Kalibr做相机-IMU标定,也用Autoware的工具做过LIDAR-相机外参标定。整体感受是Kalibr稳定性和精度都更优,但对外参初值和采集质量要求比较高,需要按要求做充分的激励运动和足够的采集时长。

3.2 相机-激光雷达联合标定的完整流程

相机-激光雷达联合标定是我在多个项目里落地最多的场景,以棋盘格靶标法为例,完整流程如下。

第一步:准备靶标与场地

靶标建议用亚克力或复合板材的棋盘格,尺寸不小于1.2m x 0.9m,并能在一定的光线条件下提供均匀的反射率。靶标周围不要有强反光物体,同时保证靶标尽可能是平面。场地需要灯光均匀,避免阳光直射导致棋盘格过曝。

第二步:数据采集

  • 相机和激光雷达同步触发,保持车辆静止。
  • 采集时靶标在雷达和相机公共视野范围内摆放多个位置,每个位置采集1到2秒。
  • 靶标姿态要包括正对、左右偏转、俯仰变化,保证角点投影分布在图像的不同区域。
  • 建议采集10-15组数据,不用更多,多了反而容易引入重复姿态导致的约束退化。

第三步:特征提取与匹配

  • 相机侧,通过棋盘格角点检测得到靶标在图像坐标系里的准确角点位置。
  • 激光雷达侧,需要从点云中分割出靶标平面。做法是使用RANSAC拟合靶标平面,再通过平面边界和雷达强度信息筛选出靶标的内点。这里特别要注意,如果靶标是棋盘格,黑白格子在激光反射强度上是有差异的,但直接用强度阈值分割非常不稳定,我更推荐先用几何约束(靶标离车距离、平面大小)定位靶标。

第四步:初始外参估计与优化

将靶标角点从靶标坐标系变换到激光雷达坐标系,再投影到图像坐标系,与检测到的像素角点构成2D-3D对应关系。通过PnP求解初始外参,随后用重投影误差最小化做全局优化。

第五步:精度验证

外参标定完不是算出个矩阵就完事了,必须做精度验证。

  • 把雷达点云投射到图像上,检查靶标边缘和杆状物的对齐情况。
  • 量取多个已知距离的目标,用投影误差评估外参精度。经验值:在20米处的投影误差应小于0.5米,在50米处应小于1米。如果超出这个范围,大概率不是外参问题,而是内参或时间同步问题。

3.3 LIDAR-IMU外参标定的实现细节

LIDAR-IMU标定是我觉得在所有标定任务中“理论简单、实操麻烦”的典型。它不需要靶标,但高度依赖车辆运动和IMU数据的质量。

常见流程用kalibr或lidar_imu_calib开源包来实现。核心思路是:

  1. 让搭载设备的小车或测试台运动足够长的时间,包含足够的线性加速度和角速度激励。8字轨迹、蛇形轨迹、加减速工况都有必要覆盖。
  2. 用激光雷达的帧间匹配(如NDT或ICP)得到两个时刻之间的相对运动关系。
  3. 用IMU预积分得到对应的相对运动关系。
  4. 建立与手眼标定类似的最小二乘问题,同时估计外参和IMU的陀螺零偏、加速度计零偏。

我在做这个标定时踩过一个典型的大坑:IMU的加速度计零偏如果没标好,会直接吞噬掉平移外参的精度。所以,在进行LIDAR-IMU外参标定之前,最好把IMU单独静止放置几个小时,用Allan方差法标定零偏和噪声密度。如果直接把这个步骤跳过去,后续所有融合结果都会有一种“说不清道不明的漂移”,排查起来极其痛苦。

另外,采集数据时车辆要尽量避免“原地旋转过猛,导致轮速打滑”的情况。轮速打滑会让点云匹配出现错误的运动估计,进而污染外参结果。测试时我一般会把车速控制在10-20km/h,避免急加速和急刹。

3.4 参数设计与采集规范表

为了让大家能直接参考,我把常用标定任务的核心参数整理成一个表格,方便现场使用。

标定任务推荐工具/方法数据量要求关键参数/判断指标常见坑
相机内参Kalibr或棋盘格+OpenCV15-20张图像重投影误差 < 0.2像素纸张不平、过曝、运动模糊
相机-相机外参Kalibr或双目标定器20-30对图像重投影误差 < 0.3像素同步触发偏移
相机-激光雷达外参靶标法+手动/自动提取10-15组静态数据20米投影误差 < 0.5米强度阈值误分、靶标不平
LIDAR-IMU外参lidar_imu_calib5-10分钟动态数据轨迹误差 < 1%激励不充分、零偏未标
相机-IMU外参Kalibr5-10分钟动态数据重投影误差 < 1像素运动模糊、激励不足

这个表格是我项目里的经验值,不同的传感器硬件、不同的精度指标会有差异,但作为起步参考和验收基准是够用的。

4. 常见问题与排查技巧实录

4.1 标定结果起伏不定的原因分析

很多项目卡在“同一套数据跑两遍,结果差很多”这个问题上。这种不稳定通常有几个来源:

  • 优化初值不一致:非线性优化对初值敏感,如果代码里初始化用随机值或默认值,每次收敛到的最优解可能不同。解决方法是固定一个较合理的初值来源,或者对多组初值做多次优化,选取重投影误差最小的结果。
  • 数据质量波动:光照变化、靶标反光、传感器温度漂移都会影响特征提取的一致性。建议在脚本里加入数据质量检查的环节,比如角点检测置信度、点云平面拟合残差,凡是质量不达标的数据帧直接丢弃,不要进入优化。
  • 求解器随机因素:部分求解器(比如高斯牛顿中的线性求解)在某些库实现里会引入多线程数值抖动。要消除这种问题,最好是固定随机数种子并锁定OpenMP线程数。

4.2 外参标定后精度仍不达标的快速排查路径

如果标定流程走完,验证时精度还是不行,我通常按下面这个顺序排雷:

  1. 先查时间同步:时间戳偏了多少毫秒?动态验证时是否忘了考虑时间偏移?
  2. 再查传感器内参:相机内参是否是本次标定得到的,还是用了几个月前的旧文件?激光雷达是否有温度漂移?
  3. 检查靶标与特征提取:点云中的靶标边沿是“锯齿状”的吗?角点提取是否稳定?
  4. 用残差分析定位问题:把每帧数据标定后的重投影误差打印出来,观察是否有个别帧误差远超其余帧,把异常帧剔除后再优化一次,通常精度会明显回升。
  5. 最后考虑硬件问题:雷达支架是否有松动?相机镜头是否松动?这些机械层面的问题往往被算法工程师忽视,但实际发生率非常高。

4.3 独家避坑经验

这里分享几条很少在文档里写明、但我实际项目中反复用到的心得:

  • 标定板不要用纯白或纯黑做背景。激光雷达点云分割时,纯黑靶标可能反射率过低导致点云稀疏,纯白靶标又容易和墙面融为一体。推荐用黑白棋盘格加上灰色边框,这样几何和反射率两种信息都能利用。
  • 尽量把标定数据采集和标定计算做成同机、同软件环境。我以前遇到过,在办公电脑上标定结果正常,在现场工控机上结果就偏了,后来发现是OpenCV版本不同导致角点检测算法行为差异。后来统一了Docker镜像才解决。
  • 外参精度验证不要在靶标同一距离做。靶标放在5米处标定,也在5米处验证,检验的是拟合能力,不是泛化精度。应在3米、10米、20米等多个距离分别验证,才能真实反映外参质量。
  • 记录环境条件。温度、湿度、光照、电源电压都会影响传感器输出。每次标定之前,把环境信息记录到日志里是非常值得做的习惯。事实证明,设备批次更换、季节交替导致的“莫名其妙标定不准”,多半都是环境因素造成的。

4.4 常见问题速查表

问题现象可能原因快速解决办法
重投影误差长期偏高棋盘格不平整/光照太强换硬质靶标,调低曝光时间
点云投射到图像整体偏移外参平移初始值不对手动粗调平移量再优化
远近距离验证误差不一致相机内参不准/畸变模型用错重新标相机内参,检查畸变模型
动态标定时误差波动大时间同步不准/运动过激先做时间同步,保持匀速运动
同一数据多次结果不一致随机初值/求解器抖动固定初值和随机种子,多次优化取最优
激光雷达边缘呈锯齿状雷达内参温度漂移预热后标定,保持环境温度稳定

5. 扩展方向的思考

最后说一点我自己的体会。传感器标定这个领域,很多人觉得“算法已成熟,剩下就是苦力活”,但实际做下来,真正决定一个项目标定上限的,往往是工程化的能力:怎么设计产线工位、怎么自动化处理数据、怎么监控外参漂移、怎么建立一套从研发到运维的闭环体系。

我在这几年的项目里,最大的收获不是学会了Kalibr或者手眼标定的公式,而是建立了一套“标定思维”:任何传感器融合问题,先确认坐标系、时间戳、畸变和温度影响,再谈算法。这套思维帮我排查过很多看似诡异的融合问题,也让标定从“烦人的前置步骤”变成了“感知系统的底层基础”。

如果你在做的项目里,传感器换了一个批次,外参就需要重新标;或者融合结果在某些场景下突然变差,很可能是标定链路里某个环节在慢慢漂移。这种时候,不用急着调算法权重,回头把标定数据重新分析一遍,往往能找到更本质的原因。

关于自动驾驶传感器标定,值得写的内容还有很多,比如语义标定、无靶标标定、序贯标定与联合标定的区别、融合精度与标定精度的理论界限。目前手头项目还没有完全解完这类问题,等后续有了更完整的实验结果,再来填坑分享。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询