ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

自动驾驶传感器标定实战:从相机内参到激光雷达外参的完整流程

自动驾驶传感器标定实战:从相机内参到激光雷达外参的完整流程 写这篇文章之前先聊点实际的。我接触自动驾驶传感器标定这块有几年了从最早拿着棋盘格在试验场里来回跑到后面搭了一套半自动标定流水线中间踩过的坑比很多教程里写的步骤都多。很多人觉得标定就是“拍几张照片、跑个脚本、出个外参”真上手了才发现光照、靶标、传感器本身的噪声、甚至是线束松动都能让结果漂得离谱。这篇算是一份个人项目总结核心是把自动驾驶里最常见的几种传感器标定——相机内参、相机-激光雷达外参、LIDAR-IMU标定、多传感器联合标定——从原理到落地流程完整过一遍包括工具选型、参数设计、现场操作注意事项和排查思路。适合正在搭标定系统、或者做多传感器融合但被外参精度折磨的工程师参考也对刚入行、想搞懂“标定到底在标什么”的人友好。1. 标定的本质与整体思路拆解1.1 标定到底在解决什么问题自动驾驶车辆的感知系统通常由多类传感器组成相机负责纹理和色彩激光雷达提供精确的三维几何毫米波雷达负责测速和远距离探测IMU输出高频姿态和加速度。每个传感器都有自己的坐标系而融合的前提是知道“同一个物体在不同传感器坐标系里的观测如何映射到统一的车体坐标系下”。标定要解决的就是这个映射问题具体拆开是两层内参标定确定传感器自身的几何模型参数。比如相机的焦距、主点、畸变系数IMU的刻度因子、零偏、轴间安装误差激光雷达的各激光束俯仰角、水平角修正量。外参标定确定传感器坐标系之间的刚性变换关系通常用旋转矩阵R和平移向量t表示。例如“激光雷达坐标系到相机坐标系的变换”就是视觉和多线激光融合的核心外参。为什么不能靠CAD图纸或机械设计值直接算因为实际装配存在毫米级偏差和角度偏差车辆运行中悬架形变、温度变化也会导致外参发生漂移。标定的精度直接决定了感知融合的底限——外参差1度50米处目标的位置误差就能差出将近1米这对后融合或前融合算法都是不可接受的。1.2 思路选型离线标定、在线标定与自动标定按工程落地场景标定方案可以分为三类离线标定在产线或实验室使用靶标棋盘格、标定板、反光柱完成精度最高适合出厂标定和研发测试。相机内参、LIDAR-IMU外参一般都在这个阶段做。在线标定车辆在真实运行中利用道路特征车道线、杆状物、地面纹理周期性地修正外参漂移。这类方案更工程化因为实际使用中外参会因为碰撞、老化、更换部件而变化。自动标定结合SLAM或里程计信息在车辆正常行驶时提取成对特征通过优化方法估计外参。比如开源方案中常见的“目标车辆行驶一段轨迹用NDT配准激光雷达点云与IMU预积分轨迹”的做法。我个人的经验是产线/研发阶段别省离线标定的功夫在线和自动标定只能作为“漂移后的补偿机制”如果底子内参和初始外参就是歪的自动标定算法再强也容易陷入局部最优。选型上离线用靶标法、在线用特征法、长期用自监督法三者配合才能形成一个完整的标定链路。1.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预积分轨迹进行对齐本质上解一个手眼标定问题AXXB。手眼标定公式AXXB的意思是A代表一个传感器自身的运动B代表另一个传感器自身的运动X就是它们之间的外参。实际工程中A和B都含有噪声所以不能简单套用线性解法一般会用两步法先估计旋转再估计平移或者直接用李代数上的非线性优化把所有参数放在一起估计。这块的实践经验参考如下旋转估计对噪声更敏感因此采集数据时要保证足够的旋转激励比如“走8字”“绕Z轴大幅旋转”。平移估计对应的是IMU加速度计的积分因此零偏估计不准会直接影响平移精度。实操中我会先做IMU内参标定再做LIDAR-IMU外参标定顺序不能反。手眼标定对初始化敏感推荐先用经典的线性解法如Tsai方法给出初始值再用非线性优化精化不要直接上非线性优化否则容易掉进局部最优。2.4 标定中时间同步的隐含问题时间同步虽然不直接属于“坐标变换”的范畴但它跟标定精度强相关。如果相机和激光雷达的时间戳没有对齐车辆运动时目标在点云中的位置和图像中的位置就会发生错位这个错位反映在外参上就是“虚拟的平移和旋转误差”。在实际标定过程中如果传感器之间存在10ms的时间偏差而标定场景中车辆或靶标在运动那么这个偏差就会直接渗透到外参估计里。所以我在做外参标定之前会先检查传感器输出的时间戳是否基于同一时钟域。如果存在时间偏移是否用PTP或NTP同步过。标定数据采集时是否让车保持静止静止时时间不同步的影响会小很多。对于动态标定场景强烈建议先做时间同步再做外参标定顺序不要反。3. 实操过程与核心环节实现3.1 工具链选择ROS、Kalibr、Autoware标定工具标定是强工具型工作选对工具能节约大量时间。目前工程和学术界常用的工具有KalibrETH Zurich开源的相机-IMU标定工具箱支持相机内参标定、相机-相机外参标定、相机-IMU外参标定。它使用连续时间样条表示轨迹对动态数据支持很好。lidar_camera_calibrationAutoware等开源项目里常用的激光雷达-相机外参标定工具通常需要用户手动选取角点/标定板边界。但凡是传统的手写脚本这类脚本适合项目前期快速验证比如用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开源包来实现。核心思路是让搭载设备的小车或测试台运动足够长的时间包含足够的线性加速度和角速度激励。8字轨迹、蛇形轨迹、加减速工况都有必要覆盖。用激光雷达的帧间匹配如NDT或ICP得到两个时刻之间的相对运动关系。用IMU预积分得到对应的相对运动关系。建立与手眼标定类似的最小二乘问题同时估计外参和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 外参标定后精度仍不达标的快速排查路径如果标定流程走完验证时精度还是不行我通常按下面这个顺序排雷先查时间同步时间戳偏了多少毫秒动态验证时是否忘了考虑时间偏移再查传感器内参相机内参是否是本次标定得到的还是用了几个月前的旧文件激光雷达是否有温度漂移检查靶标与特征提取点云中的靶标边沿是“锯齿状”的吗角点提取是否稳定用残差分析定位问题把每帧数据标定后的重投影误差打印出来观察是否有个别帧误差远超其余帧把异常帧剔除后再优化一次通常精度会明显回升。最后考虑硬件问题雷达支架是否有松动相机镜头是否松动这些机械层面的问题往往被算法工程师忽视但实际发生率非常高。4.3 独家避坑经验这里分享几条很少在文档里写明、但我实际项目中反复用到的心得标定板不要用纯白或纯黑做背景。激光雷达点云分割时纯黑靶标可能反射率过低导致点云稀疏纯白靶标又容易和墙面融为一体。推荐用黑白棋盘格加上灰色边框这样几何和反射率两种信息都能利用。尽量把标定数据采集和标定计算做成同机、同软件环境。我以前遇到过在办公电脑上标定结果正常在现场工控机上结果就偏了后来发现是OpenCV版本不同导致角点检测算法行为差异。后来统一了Docker镜像才解决。外参精度验证不要在靶标同一距离做。靶标放在5米处标定也在5米处验证检验的是拟合能力不是泛化精度。应在3米、10米、20米等多个距离分别验证才能真实反映外参质量。记录环境条件。温度、湿度、光照、电源电压都会影响传感器输出。每次标定之前把环境信息记录到日志里是非常值得做的习惯。事实证明设备批次更换、季节交替导致的“莫名其妙标定不准”多半都是环境因素造成的。4.4 常见问题速查表问题现象可能原因快速解决办法重投影误差长期偏高棋盘格不平整/光照太强换硬质靶标调低曝光时间点云投射到图像整体偏移外参平移初始值不对手动粗调平移量再优化远近距离验证误差不一致相机内参不准/畸变模型用错重新标相机内参检查畸变模型动态标定时误差波动大时间同步不准/运动过激先做时间同步保持匀速运动同一数据多次结果不一致随机初值/求解器抖动固定初值和随机种子多次优化取最优激光雷达边缘呈锯齿状雷达内参温度漂移预热后标定保持环境温度稳定5. 扩展方向的思考最后说一点我自己的体会。传感器标定这个领域很多人觉得“算法已成熟剩下就是苦力活”但实际做下来真正决定一个项目标定上限的往往是工程化的能力怎么设计产线工位、怎么自动化处理数据、怎么监控外参漂移、怎么建立一套从研发到运维的闭环体系。我在这几年的项目里最大的收获不是学会了Kalibr或者手眼标定的公式而是建立了一套“标定思维”任何传感器融合问题先确认坐标系、时间戳、畸变和温度影响再谈算法。这套思维帮我排查过很多看似诡异的融合问题也让标定从“烦人的前置步骤”变成了“感知系统的底层基础”。如果你在做的项目里传感器换了一个批次外参就需要重新标或者融合结果在某些场景下突然变差很可能是标定链路里某个环节在慢慢漂移。这种时候不用急着调算法权重回头把标定数据重新分析一遍往往能找到更本质的原因。关于自动驾驶传感器标定值得写的内容还有很多比如语义标定、无靶标标定、序贯标定与联合标定的区别、融合精度与标定精度的理论界限。目前手头项目还没有完全解完这类问题等后续有了更完整的实验结果再来填坑分享。
返回列表