拓冰建站拓冰建站
首页 / 资讯中心 / 正文

LCC自标定:不依赖标定板的高分辨率激光雷达与相机像素级对齐方法

前两天有个做自动驾驶的朋友跟我吐槽他们新车队的激光雷达和相机外参又飘了回厂标定得排一个月。这让我想起2020年那篇挺有意思的工作同期的日常讨论里大家还在为棋盘格反光、标定板摆放角度头疼。这类“不用标定目标实现高分辨率激光雷达和相机像素级自标定”的思路把激光雷达和相机标定这个问题往前推了一大步。这篇内容不涉及任何具体代码库核心是讲清楚LCC系列方法怎么做到不依赖人工标定物靠场景本身完成像素级对齐。如果你手头正好有16线、64线甚至128线激光雷达配一个普通工业相机或车规相机也遇到过外参标定麻烦、标定完过一阵子又偏了的问题那这篇文章就是写给你看的。我尽量把原理、流程、适合什么场景、容易踩什么坑都讲透特别是“像素级”到底是怎么做到的以及这件事在实际落地时到底有多能打。1. 为什么“不用标定目标”是刚需1.1 传统标定流程的痛在LCC这类方法出现之前主流的激光雷达和相机联合标定大概分几类第一类是用标定板黑白棋盘格或者带空心圆的平板放在激光雷达和相机共同视野里然后人工选取对应点或者自动检测角点最后求解外参。这个方法本身没什么问题实验室里精度也很高但一落到实际项目里就难受了。你得专门准备一块尺寸合适的标定板。教车规级相机或者工业相机去认这块板子光照一变化、反光一严重检测就可能失败。标定板还必须同时出现在激光雷达点云和相机画面里这就限制了标定场景。更麻烦的是标定板到雷达的距离不能太远否则点云太稀疏角点根本提取不出来也不能太近否则视场角不够板子超出画面。在现场部署的时候往往要两个人抬着板子来回挪折腾半天才能采到一组有效数据。第二类常见做法是靠人工选点在点云和图像里手动选一些特征明显的角点比如建筑物的拐角、电线杆的根部、路沿的端点。这个方法不需要标定板但人工交互成本高而且如果场景里缺乏显著的几何特征选点本身就很难做准。选点的人对传感器的理解还会直接影响标定结果换个人结果可能就差一截。第三类是利用反射强度信息在场景里布置高反射率的靶标比如反光贴纸靠强度特征做匹配。这个方法对雷达的反射率标定稳定性要求很高不同批次、不同温度下雷达的反射率测量会有波动靶标和真实场景物体的强度区分度不够时匹配也会失效。1.2 自标定的现实需求我为什么说“不用标定目标”是刚需因为在实际项目里外参是会漂移的。车辆长期颠簸、机械振动、温度变化都可能让激光雷达和相机的相对位姿发生微小变化。底盘件的老化、螺丝松动哪怕只有零点几度的旋转偏差在50米外投射到图像上可能就是好几个像素的误差。对于感知算法来说这个误差会直接导致传感器融合错位目标框在点云和图像上对不上测距不准甚至影响决策。既然外参会漂那就需要经常标定。但传统标定方法对环境、设备和人工的要求都太高了不可能每个停车场都摆上一套标定板也不可能要求司机定期去手动选点。所以学术界和工业界真正需要的是让车辆或者机器人在日常行驶、工作过程中利用周围环境的自然特征自动完成外参的校正。这就是自标定Self-Calibration的核心诉求。LCC系列方法的思路就是冲着这个诉求去的——不依赖任何人工标定物不依赖预先布置的靶标只要场景里有足够的边缘、纹理和深度变化就能把激光雷达和相机的外参标出来而且是在像素级别上对齐。2. LCC到底在优化什么重新看待激光雷达与相机的“共同语言”2.1 思路起点多传感器融合的“对齐”要理解LCC方法首先要回答一个问题激光雷达和相机拍到的内容本质上有什么共同之处激光雷达输出的是三维点云每个点带有一个三维坐标有些雷达还带反射强度信息。相机输出的是二维图像每个像素带有一个颜色值。这两种数据一个在三维空间一个在二维平面它们的“共同语言”其实是投影关系——把三维点按照相机内参和外参投影到图像平面上如果外参准确那么投影点应该落在图像中对应的物体位置上。LCC系列方法把这个“对应”定义得更细它不仅要求三维点投影到正确的物体区域还要求投影形成的“结构”和图像中的“结构”在像素层面重叠。这里的“结构”指的是什么就是边缘。深度不连续的地方比如建筑物轮廓、路沿、车辆边界、树干边缘在激光雷达点云里表现为深度值的跳变。而同一位置在图像里往往也是颜色或者亮度的突变也就是图像边缘。这两种边缘来自完全不同的物理测量原理却在同一物理场景中天然对齐。这就是LCC方法的锚点如果外参是准的那么从点云深度计算出的边缘位置和图像梯度计算出的边缘位置应该在像素级别上重合。2.2 深度不连续与图像边缘的呼应我先举个直观的例子。假设路边有一栋楼楼的侧面和背景天空在深度上差异巨大。激光雷达打到楼上得到一个深度值打到楼后的背景得到另一个深度值两者之间必然存在一个深度突变。如果在图像上看向同一个方向楼顶轮廓、楼体侧面和天空之间的亮度差异通常也很大构成清晰的图像边缘。当外参准确时把雷达点云投影到图像上那些深度突变的边缘位置会和图像上的楼体轮廓严丝合缝地重合。一旦外参出现旋转或平移偏差投影后的边缘就会偏离图像边缘。偏离的方向和大小正好反映了外参误差的方向和大小。LCC方法的核心优化目标就是找到一组外参使得这种“多模态边缘”的对齐程度最大化。这个思路听着不复杂但真做起来有几个关键设计要考虑。第一怎么从点云里稳定地提取深度边缘点云是稀疏的尤其在远距离上相邻激光线束打到的深度值差异可能已经很大噪声也不小。如果直接用相邻点的深度差做边缘提取会把噪声也当成边缘。所以LCC方法里通常要对深度图做平滑、去噪再在多个尺度上计算深度梯度。第二怎么衡量“对齐程度”这是LCC系列方法最有意思的地方。优化目标如果定义得太简单比如只统计边缘像素的重合数量很容易陷入局部最优。因为场景里的边缘很多随便一个局部区域都可能出现大量伪重合。LCC的定义方式是构造一个“激光雷达一致性LCC”损失它对旋转和平移的响应曲线比较平滑是一个类似相关性的指标。我当时看到这个设计的第一反应是这不就是把图像配准里的互信息Mutual Information思路拿过来了吗确实有相似之处但LCC的特别之处在于它利用了深度边缘的几何属性——深度不连续处不仅是一个位置标记还带有方向信息。物体边缘在图像里的梯度方向通常垂直于物体轮廓而这个方向在3D点云投影后是可以预测的。把方向和位置都纳入对齐度量之后优化问题的可辨识度就大幅提升了不容易被相似的纹理区域带偏。3. 核心算法流程逐步拆解3.1 数据预处理和时间同步LCC方法对输入数据的第一个要求是时间同步。激光雷达和相机通常以不同的帧率采集数据雷达是10Hz、20Hz相机可能是30Hz。如果直接用未对齐时间戳的数据去计算边缘对齐运动物体的边缘会出现重影静态场景也会有轻微错位。实际处理中一般会选择一个参考时间戳把点云和图像都插值或者“最近邻”对齐到同一个时刻。对于运动物体LCC方法其实不太怕因为优化的是统计意义上的对齐少数运动物体产生的边缘错位会被大量的静态边缘淹没。但如果车辆本身在高速运动时间同步误差导致的外参虚拟偏移会被优化过程“吸收”标出来的外参会带一个和速度相关的误差。所以一个稳妥的做法是在车辆静止或低速时采集标定数据或者对点云做运动补偿。然后是内参。LCC方法要求相机内参已知且准确包括焦距、主点、畸变系数。内参不准的话再好的自标定算法也白搭。我见过不少现场问题最后查下来是相机内参错了标出来的外参怎么都收敛不到好结果。所以你如果准备用这类方法先花半小时把相机内参标好能省后面一大半的调试时间。点云方面需要把雷达点云按照最近邻方式投影到一个虚拟的“深度图”上这个投影过程用的是当前待优化的外参初值。初值什么水平能用不需要很准但也不能完全瞎给。LCC的优化本质是局部优化要求初始外参大致在真实值的一定范围内比如旋转偏差几度以内、平移偏差几十厘米以内。这个初值可以通过雷达和相机的粗略安装位置来估计并不需要额外标定。3.2 激光点投影与边缘提取处理流程可以拆成几个步骤。第一步是把激光雷达点云投影到一个以相机光心为原点的球面或平面上生成一个与图像分辨率基本对齐的深度图。注意这里的投影用的是内参矩阵和当前的外参假设而不是计算最终结果时用到的外参。这个深度图相当于把3D点云“渲染”成了相机视角下的深度图像。第二步是从深度图上提取深度不连续区域。这一部和图像边缘提取的处理逻辑很像在深度图上计算垂直和水平方向的梯度梯度的绝对值大小超过一个阈值的像素就被标记为深度边缘候选。但直接做会带来一个典型问题激光雷达的扫描线在近处密集、远处稀疏深度图不同位置的梯度噪声方差不一样。所以LCC方法在实践中通常会对深度图做自适应的梯度阈值或者在不同距离区间分别计算边缘提取的阈值。第三步是对图像做边缘/梯度提取。这里用的不是传统的Canny边缘检测硬二值化而是保留梯度幅值和方向的连续响应图。这么做的原因是在优化过程中我们希望损失函数是平滑可导的硬边缘二值化会引入很多离散的跳变让梯度下降很难稳定收敛。LCC方法里常用的是Sobel或者Scharr算子计算梯度幅值再配合方向信息加权。3.3 从粗到细的优化策略边缘提取完成之后面前就有两张图一张是激光深度边缘响应图一张是图像梯度响应图。优化目标就是寻找一个外参3个旋转参数、3个平移参数让这两张图在某种度量下对齐得最好。LCC方法的优化是从粗到细coarse-to-fine的。直接在高分辨率上优化容易陷入局部最优因为场景边缘太密集任何一个微小的外参变化都会让很多边缘的位置发生位移而位移后的边缘可能在错误的地方和图像边缘形成“伪对齐”。处理方法是先对深度图和图像都做高斯金字塔下采样在最粗糙的尺度上优化得到一个大致的外参估计然后逐步提高分辨率用上一层的估计作为下一层的初值。优化算法上LCC论文里用的是基于梯度的迭代优化比如高斯-牛顿法Gauss-Newton或者LM算法。损失函数的梯度可以通过数值微分或者解析推导得到。解析推导更稳定但公式推导稍复杂数值微分实现简单但步长选择不好会影响收敛。实际复现时大多数人先用数值微分跑通再优化成解析梯度。我在自己测试时发现粗到细的层数设置很关键。层数太少优化容易困在局部最优层数太多最粗层的信息可能已经模糊到看不出边缘对齐了反而浪费时间。一般来说原始分辨率下采样4到5个层级比较稳每层之间用2倍下采样。4. “像素级”怎么来的与特征级标定的本质区别4.1 特征级方法的局限很多人一看到“像素级”就会问这跟传统方法有什么区别难道传统标定不是也能达到像素级精度吗其实不是一回事。传统基于特征点或特征边缘的方法本质上是稀疏的。它们提取出几十个、上百个特征点然后优化这些特征点的重投影误差。这种方式的数据利用率非常低因为场景里的大量像素点没有被用到。更麻烦的是特征提取环节本身就引入了误差角点检测偏差0.5个像素反射强度匹配偏差一个像素这些误差会直接进入最终的标定结果。还有一点传统特征级方法对特征质量的依赖非常大。如果标定板角点检测失败或者场景特征太少整个标定流程就崩了。而LCC这种密集对齐方法用的是场景中所有边缘的统计信息对个别特征的错误不敏感。就算一些边缘位置提取有偏差只要整体统计上对齐标定结果依然很稳。4.2 密集像素对齐的实现LCC方法真正做到了像素级别靠的是密集对齐而不是稀疏特征匹配。它把深度边缘响应图和图像梯度响应图按照每一个像素位置进行比对计算一个全局的一致性度量。这种做法的信息量远大于稀疏特征。更重要的是LCC方法在像素级对齐时不只是看“边缘在不在”还看“边缘的方向对不对”。一个像素位于汽车边缘其梯度方向是竖直的而旁边的电线杆边缘梯度方向也是竖直的。如果只比较有无边缘汽车边缘和电线杆边缘会互相干扰。但LCC考虑了方向信息后竖直边缘只会和竖直边缘对齐水平边缘只会和水平边缘对齐这就大大增强了优化问题的可辨识度。从实现角度来说把方向信息纳入度量通常可以这样理解先分别计算深度边缘图的梯度方向$\theta_d$和图像梯度方向$\theta_i$然后对每个像素如果两个方向差的余弦值越高该像素对一致性的贡献越大。总损失定义为所有像素的加权和权重和梯度幅值相关。这样一来边缘强度越高、方向越一致的像素在优化中占的权重越大。这种密集、方向增强的对齐度量让LCC系列方法在优化时能充分利用高分辨率雷达的优势。128线雷达生成的深度图在近处异常密集边缘的像素精度甚至可以优于相机图像的边缘精度。也就是说雷达边缘本身可以直接作为亚像素级别的参考。LCC方法在高分辨率雷达上的精度提升比传统方法要显著得多这也是为什么标题里特意强调“高分辨率激光雷达”。5. 实测中的表现与适用边界5.1 精度和稳健性范围在公开数据集的实验中LCC方法通常能实现1到2像素以内的标定精度在一些均匀纹理较少的城区场景里甚至能控制在亚像素级别。这个精度水平在实际应用里已经足够用了。感知算法对融合错位的容忍度通常在几个像素以内毕竟图像检测框本身也有像素级的不确定性。我在自己拿数据集复现测试时的体感是只要初始外参偏差不大优化过程基本都能收敛到相似的结果重复性很好。把同样的数据跑两遍得到的旋转误差标准差大概在0.02度以内平移误差在厘米量级。这个重复性比人工标定要高得多人工标定很大程度上依赖操作者的经验多标几次结果偶尔会差出半度去。另一个让我印象深刻的点是LCC对局部遮挡的鲁棒性。场景里如果有车辆经过动态车辆产生的深度边缘和图像边缘不会完全对齐但它们只占整体边缘响应的一小部分。只要静态环境的边缘足够丰富动态目标带来的干扰就会被优化过程当成离群值消解掉。5.2 什么样的场景会翻车LCC方法并不是万能的有几种场景容易出问题。第一极其空旷的场景。比如平原上的直路两边是平坦的田地没有建筑物、没有树、没有路沿整个场景的深度边缘稀疏得可怜。这种情况下深度边缘响应图几乎为空白优化目标没有足够的梯度信息外参更新量趋近于零标定就失效了。解决办法也不是没有要么换个场景要么把透明玻璃、低反射物体也算进去——但这些在空旷场景里都不存在。第二重复纹理严重的场景。想想一个公园的围栏都是等间距的竖直栏杆或者一面密密麻麻的百叶窗。深度边缘和图像边缘确实很多但每个边缘都长得差不多优化过程可能把边缘对齐到相邻的栏杆上产生一个看起来损失函数只比最优值大一点点、但实际外参偏差一个周期的解。这个现象在视觉配准里叫“多模态匹配的歧义”。LCC方法加了方向信息也没法完全解决这个问题因为所有竖直边缘方向一致。处理办法是采集数据时尽量选有水平、竖直、斜向多种边缘方向的场景。第三大范围运动模糊或者曝光过度的图像。如果相机图像质量太差边缘信息都被糊掉了那自标定自然无从谈起。实测中最常见的翻车原因其实是数据没采好不是算法不收敛。6. 复现和落地时的实操注意点6.1 环境搭建建议如果你想在项目里试一下LCC这类方法环境搭建有几件事值得提前做。首先是数据采集。不要急着跑算法先花时间把数据采好。建议在光线稳定的白天选择城市或园区道路场景里最好同时有建筑物轮廓、树木、路灯、车辆、路面标线这些元素。车辆停在原地或者以很慢的速度行驶采集1到2分钟的数据就够了。采集时注意让雷达和相机视野覆盖重叠区域不要一个朝前一个朝侧面。其次确保时间戳对齐。如果用的是ROS系统建议把PointCloud2和Image的消息时间戳统一一下做一次近似同步。如果时间同步做得不好后续的边缘对齐会叠加一个动态偏移标出来的外参偏了都不知道是为什么。软件依赖方面主要就是点云处理库、图像处理库和数值优化库。不用深度学习框架也能跑通LCC方法本身不依赖神经网络。不过如果你有GPU图像金字塔的构建和梯度计算可以加速不少。6.2 参数调优心得LCC方法里有几个参数需要根据实际传感器配置调整。边缘提取阈值是第一个要调的。阈值太高会丢失弱边缘场景稀疏时优化没有信息阈值太低会引入大量噪声边缘把优化目标“淹没”。我一般先统计深度图梯度的直方图选取一个能够保留前5%到10%梯度响应点的阈值再在附近微调。图像金字塔层数需要根据图像分辨率调整。1280x720的图像用4层下采样到160x90足够2048x1536的分辨率可以加到5层。层数不是越多越好最粗层的分辨率太低时两点云边缘投影后可能都落在同一个像素里没有区分度。优化迭代次数和收敛条件也不能忽视。我习惯用相对变化量来判断收敛——当连续几次迭代中外参变化量小于某一个小阈值时就认为已经收敛了。这样比固定迭代次数更稳因为不同的初值需要的迭代次数差别很大。还有一个常被忽略的细节优化前给外参加一些微小的随机扰动然后跑多组标定看结果的离散程度。如果几组结果差异很小说明标定置信度高如果差异很大说明当前场景对某些外参参数不敏感需要重新采集数据。这个方法能帮你当场判断题目的数据是否可靠而不是等标定完才发现结果根本不对。6.3 容易踩的坑第一个坑相机内参不准还硬跑LCC。我前面提过一次这里再强调一遍。自标定算法默认内参是准的如果内参有偏差LCC会把内参误差“吸收”到外参里标出来的外参看起来损失函数很小实际重投影却对不上。所以强烈建议先单独标定相机内参确认重投影误差在0.1像素级别再跑LCC。第二个坑把深度图直接当普通图像处理忽略了深度缺失值。激光雷达在透明物体、黑色吸光物体、远距离物体上会产生很多无效点。这些无效点在深度图里表现为空洞如果不做处理梯度计算时会把空洞边界当成深度边缘产生大量虚假边缘。需要先对空洞区域做掩膜或者用邻近有效点做插值再做梯度计算。第三个坑优化时六个自由度的尺度差异没有归一化。旋转参数对损失的影响通常远大于平移参数如果直接用一个学习率或者一个步长去优化旋转会收敛得很快平移却半天挪不动。实践中要对旋转和平移参数分别设置不同的优化步长或者参数化时对平移做归一化处理。第四个坑把D435i这类深度相机当作激光雷达来用。LCC方法里说的雷达是机械式或固态激光雷达点云是稀疏的、有明确线束结构和距离信息的。RGB-D深度相机的深度图虽然也是深度但成像原理、噪声分布和视野范围都不一样。直接套LCC的深度梯度提取策略不一定合适需要针对深度相机的噪声特性做额外的平滑处理。7. 我个人对这类自标定方法的看法LCC系列这种“不标定目标”的自标定思路我在实际项目中验证之后最大的感受是它把标定从一件需要专业技能的事变成了一件数据驱动的事。以前标定是个仪式感很强的过程要准备设备、布置场景、人工干预现在只要把车开到路上跑一跑数据采回来就能自动算。这对于需要批量部署大量传感器的场景比如自动驾驶车队、机器人集群、智能巡检设备价值是实实在在的。我遇到过一位做矿区无人运输的朋友他们那边的卡车经常在矿坑里跑外参漂移是家常便饭。传统的标定方案在矿坑那种环境根本不现实没有场地摆标定板也没有技术人员常驻。他们最后采用的就是类似LCC的思路让卡车在装卸点附近的固定路线上跑一圈利用周围矿壁和设备的边缘自动校正外参。虽然矿坑里的场景边缘不算特别丰富但胜在车辆每天都在重复走同一条路线采集数据很方便每天跑一次自动标定融合效果一直保持在可用水平。这个故事让我意识到自标定真正的价值不是把精度从两个像素提到一个像素而是让标定这件事可以高频发生让传感器融合系统长期维持在一个健康的工作状态。如果你正在做多传感器融合的项目我的建议是别把自标定当成高配玩法它应该是一个标配能力。先跑通基础的离线路标定把系统做的稳一点然后再上在线自标定或者定期自检的方案。数据驱动一定会在某个环节出问题所以记得保留人工复核的兜底手段在自标定结果置信度低的时候主动报警而不是盲目相信自动输出的结果。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门