ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

激光雷达标定实战指南:从内参到外参,详解相机、雷达与IMU联合标定

激光雷达标定实战指南:从内参到外参,详解相机、雷达与IMU联合标定 我最早接触激光雷达标定是在一台搭载16线机械式雷达的无人小车上。当时相机和雷达各自都能干活但一要做目标级融合问题就全来了相机框出来的行人和雷达点云里的聚类对不上号明明同一个目标两种传感器各说各话。折腾了两周最终发现根子不在算法而在外参标定没做准。这篇学习笔记就是想把激光雷达标定这件事从原理到实操完整串一遍涵盖相机内参标定、相机-雷达联合标定、雷达-IMU外参标定以及标定过程中那些文档里不会写清楚的大坑。这套内容适合刚接触多传感器融合的开发者、做自动驾驶或机器人的算法工程师以及被错误标定折磨到怀疑人生的调试人员。看完你至少能明白激光雷达标定到底在标什么、不同标定方法分别解决什么问题、用Autoware等工具的具体操作流程、以及遇到标定结果不对时怎么系统排查。1. 先搞懂激光雷达标定的核心逻辑1.1 激光雷达的工作原理与测量模型激光雷达的基本原理是飞行时间法。发射器打出激光脉冲打到物体表面后反射回来接收器记录时间差乘以光速除以二就得到距离。再结合当前激光束的发射角度就能算出一个三维点坐标。以机械式雷达为例内部电机带动激光头旋转每一束激光有其固定的俯仰角旋转过程中形成一圈一圈的扫描线。16线雷达就有16个固定的俯仰角32线、64线、128线同理。每个点云的原始数据本质上是一个距离值加上两个角度值再通过球坐标系到笛卡尔坐标系的转换得到x、y、z。这里有一个容易被忽略的点激光雷达在出厂前已经做过一次内参标定包括每束激光的距离偏移、角度偏移、零漂修正。算法上有一个简化模型点云坐标等于旋转矩阵乘以距离向量再加上平移偏移。如果你发现某个雷达扫描出的地面是斜的、墙面是弧形的大概率是内参标定出了问题。但内参出厂时一般比较稳实际项目中更常见、更能直接影响融合效果的是外参标定。1.2 内参、外参、时间同步标定问题全景图标定这个词在不同语境下含义差异很大。从工程角度看多传感器系统里需要解决三类问题第一类是单个传感器自身的内部参数。相机有内参矩阵和畸变系数激光雷达有距离偏移和角度偏移IMU有零偏和尺度因子。这类标定的核心是求解传感器内部从原始测量值到物理量的映射关系。第二类是传感器之间的外部参数也就是外参。雷达坐标系到相机坐标系的旋转和平移矩阵雷达坐标系到IMU坐标系的变换矩阵都属于这个范畴。外参标定的本质是求解两个坐标系之间的刚体变换即一个旋转矩阵加一个平移向量。第三类是被很多人忽视的时间同步。相机出图时刻和雷达出点云时刻往往不对齐如果车辆在运动哪怕只差50毫秒远处的目标也会有明显的错位。时间同步严格来说不是标定但它和标定强相关因为时间未对齐时外参标定结果必然是错的。这三类问题经常被混为一谈。很多新手拿着九点标定的概念套到激光雷达标定上发现完全行不通原因就在于没有区分传感器标定和机器人手眼标定的适用场景。后面我会专门展开说。2. 相机-激光雷达联合标定的技术拆解2.1 从张正友标定法说起相机内参为什么是联合标定的前置条件相机-激光雷达联合标定的常规做法是利用标定板在相机图像和雷达点云中建立对应关系再求解外参。但如果相机的内参本身是错的那么即使你找到了图像中的角点坐标反投影出来的空间方向也是错的外参标定必然失败。相机内参标定最经典的方法是张正友标定法。它只需要拍摄不同姿态下的棋盘格标定板然后利用棋盘格的共面约束求解单应矩阵再分解出内参矩阵和畸变系数。核心公式是s * m A[R|t] * M其中m是图像坐标M是世界坐标A是内参矩阵R和t是外参。张正友法的巧妙之处在于它利用棋盘格平面上的点z0这一约束把问题简化为单应矩阵估计再用多张不同姿态的棋盘格图来约束内参。实际操作中有一个重要细节标定板的姿态要覆盖足够的自由度。我见过很多人在一个位置上拍十几张图片数量够了但姿态几乎没变化结果标定出来的焦距和畸变参数方差特别大。正确的做法是让标定板在画面中呈现俯仰、旋转、平移的不同姿态画面的四角和中心都要被棋盘格覆盖到。OpenCV里calibrateCamera函数输出的重投影误差一般要控制在0.1像素以内才算合格。如果你用的是Autoware工具链它自带的相机标定模块本质上就是张正友法的实现。所以联合标定第一步先确保相机内参没有问题这是后面所有操作的基础。2.2 相机与雷达外参标定的核心思路找对应、求变换相机内参已知后相机-雷达外参标定的问题就变成了给定一组三维点在雷达坐标系下的坐标以及这些点对应在图像上的二维坐标求解从雷达坐标系到相机坐标系的旋转和平移。这里最直观的方法是找标定板的边界角点。在点云中标定板的点云呈现为一个平面多边形提取它的边界点后拟合直线两条直线的交点就是标定板的角点。在图像中用OpenCV的棋盘格角点检测可以直接得到角点坐标。有了若干组对应关系后就构成了一个PnPPerspective-n-Point问题OpenCV里用solvePnP函数就能求解。Autoware的Calibration Toolbox采用的就是这种思路。它的操作流程大致是先采集同时包含标定板和棋盘格的多帧数据在图像中选一个角点在点云中手动点选对应的角点采集多组对应点之后工具会计算初始外参再进行非线性优化。这个手动点选的过程看似简单但坑很多。点云是稀疏的选角点时很容易选偏。我的经验是先在点云视图中选中一个角点附近然后用鼠标滚轮缩放精确到单个点同时在图像侧放大对应角点区域确保选的位置是同一个物理点。每组数据最好选6组以上对应点并且标定板要出现在视野的不同位置否则外参解算时退化严重。标定完成后的验证方式也很重要。把雷达点云投影到图像上叠加显示检查边缘轮廓是否和图像中的物体边沿对齐。如果近处对齐但远处偏移大概率是旋转分量没标准如果整体往一个方向偏移多半是平移分量有问题。2.3 Ubuntu 18.04安装Autoware联合标定工具实录在Ubuntu 18.04上安装Autoware的相机雷达联合标定工具最省事的方式是直接装Autoware 1.14或1.15版本。这里记录一下我当时的完整步骤以及踩过的坑。第一步是安装依赖。Autoware依赖ROS Melodic、OpenCV、PCL、Qt等一大堆库。官方文档推荐用提供的Docker镜像但如果你像我一样需要在物理机上跑就需要手动编译。建议先装好ros-melodic-desktop-full然后安装依赖sudo apt install ros-melodic-desktop-full ros-melodic-pcl-ros ros-melodic-cv-bridge。第二步是下载源码编译。我用的是1.14版本git clone https://gitlab.com/autowarefoundation/autoware.ai/autoware.git然后进入目录执行./scripts/compile。这里有一个常见的坑Autoware的编译脚本对OpenCV版本有要求Ubuntu 18.04默认OpenCV 3.2如果系统里装过OpenCV 4会导致编译报错。建议在干净环境下编译或者严格使用Autoware提供的依赖清单。第三步是启动标定工具。编译完成后运行./run启动Autoware在界面的Compute面板里选Camera-LiDAR Calibration。载入相机内参文件前注意格式问题Autoware要求YAML格式里面要包含camera_matrix和distortion_coefficients两个字段如果缺少会直接报错。我实际踩过最大的坑是点云显示界面不刷新。后来发现是PCL的可视化窗口和Autoware主界面之间的依赖问题解决办法是单独运行rviz和PCL viewer手动加载点云话题和图像话题再在Autoware的标定界面中操作。看数据采集环节先打开相机驱动和雷达驱动确认/image_raw和/points_raw话题有数据。然后匀速晃动标定板同时采集多帧数据。这里要特别强调一点——数据采集时车辆要停稳标定板位置要覆盖不同距离和角度否则外参优化会陷入局部最小值。3. 激光雷达与IMU外参标定的实操要点3.1 为什么要标定雷达和IMU的位姿关系LiDAR和IMU的外参标定在融合定位、建图、运动补偿这些任务里非常重要。雷达的扫描频率如果是10Hz一帧点云持续100毫秒在这期间车辆已经移动了一段距离如果不做运动补偿点云就会畸变。运动补偿需要知道IMU和雷达之间的位姿变换关系这样才能把IMU测得的加速度和角速度转换到雷达坐标系。另外雷达惯性组合导航系统里GNSS/INS输出的是车体姿态雷达点云在车体坐标系下要融合定位结果两者必须对齐。这里的外参就是IMU坐标系到雷达坐标系的旋转和平移。3.2 基于运动约束的LiDAR-IMU标定方法LiDAR-IMU外参标定和相机-雷达标定的思路完全不一样。相机-雷达标定靠的是静态目标特征对应而LiDAR-IMU标定核心是运动约束。原因是IMU没有直接测量三维点的能力没有办法和某个特定点云特征做点对点对应。基本思路是在雷达扫描过程中采集连续帧点云通过帧间配准比如ICPIterative Closest Point估计雷达在两帧之间的位姿变化同时积分IMU的角速度和加速度得到IMU在这段时间内的姿态变化。因为两者描述的是同一个运动只是在不同坐标系下表达所以存在一个固定的旋转矩阵R使得两者的旋转轨迹一致。标定过程就是找到一个R让雷达估计的姿态变化和IMU积分后的姿态变化之间的残差最小。这个方法的数学形式是基于手眼标定问题的扩展经典的AXXB问题。A是雷达帧间变换B是IMU帧间变换X是待求外参。求解过程可以用最小二乘、SVD分解或者李代数优化来做。时间同步在这个场景里尤其关键。雷达和IMU的时间基准如果不一致算出来的运动轨迹就会错位外参标定结果也不可靠。常见的做法是先用PPS和GPRMC做时间同步或者用Allan方差分析评估时间延迟量级。如果时间延迟不能被忽略就要在标定模型中加入时间偏移作为待优化量。实际项目中我用过开源的LiDAR-IMU标定工具比如lidar_align效果还不错。它的核心思想是连续帧点云配准和IMU积分轨迹匹配做完之后输出外参文件再在后续的定位建图流程里验证效果。3.3 与相机-IMU联合标定的关系相机-IMU联合标定解决的问题和外参类似只是把雷达换成了相机。Kalibr是这方面最常用的工具它基于连续时间的B样条轨迹建模同时求解相机内参、相机-IMU外参和IMU噪声参数。LiDAR和IMU外参标定往往可以和相机-IMU标定形成交叉验证。如果系统里同时有相机、雷达、IMU三个传感器你可以分别标定相机-雷达外参和雷达-IMU外参然后推导出相机-IMU外参再和直接相机-IMU联合标定的结果对比如果差值过大说明某个环节标定有问题。这个验证技巧在处理多传感器系统时非常实用。4. 标定实操中的高频问题与排查技巧4.1 数据采集阶段的高频问题与解决建议数据质量直接决定标定成败这个再怎么强调都不过分。我见过太多人拿着采集质量很差的包反复优化算法结果是算法再好也救不回来。相机-雷达联合标定采集时最典型的问题是运动模糊和曝光不均。标定板在晃动过程中如果速度太快图像角点检测就会不准如果曝光时间太长图像整体过亮或反光处过曝棋盘格角点提取也会失败。建议固定标定板在视野中停留1到2秒再移动到下一个位置保证图像清晰。点云角点的提取同样有讲究。标定板距离太远时反射点稀疏边界拟合不稳定距离太近时可能超出雷达盲区或视野。以16线雷达为例标定板放在5米到10米之间效果通常比较好。另外注意标定板表面必须对激光有良好反射纯黑哑光表面反射率低点云会出现空洞最好选择灰色或白色标定板。还有一个非常隐蔽的问题标定板的厚度和位置基准。标定板本身有物理厚度你在图像中看到的角点是棋盘格前沿角点但在点云中拟合的边界可能是标定板的后沿如果标定板比较厚且姿态倾斜明显这两者之间的误差会被带入外参求解。4.2 优化不收敛和结果不对的排查思路标定完成后如果投影结果有偏差不要急着重新采集数据先按下面的思路排查一下。第一查时间同步。把同一时刻的图像和点云叠加显示如果车辆在运动且点云和图像在运动方向上出现系统性偏移大概率是时间没对齐。尤其是ROS的bag包如果你回放数据时使用了--clock参数而录制时没有设置时间戳就会出现明显的时间错乱。第二查内参文件。很多人标定外参时用的是随便估的相机内参结果外参怎么调都调不准。严谨的流程是每次更换相机镜头或重新调焦后重新标定相机内参。第三查选点质量。如果所有选点都分布在标定板的同一个区域外参的某些维度会被约束得很差。比如你只在图像中心附近选点平移向量的估计方差就会非常大。第四查初值敏感性。很多标定工具需要提供外参初值如果你给的初值离真实值太远优化过程很容易收敛到局部极小值。一个可行的经验是先用标定板正面朝向已知的粗略外参作为初值再跑优化。下面是一个我在项目中整理的排查速查表供参考现象可能原因排查方法投影整体偏移平移分量误差检查选点空间分布补采远处点近处对齐远处歪旋转分量误差重新优化旋转多姿态采集点云和图像边缘不重合时间不同步检查话题时间偏移做时间戳对齐优化不收敛初值太差手动估算粗外参合理初始化角点检测失败曝光或运动模糊降低曝光、减慢标定板移动速度点云无标定板区域反射率太低用灰色或白色标定板5. 从激光雷达标定延伸到更广的标定场景5.1 九点标定、十二点标定和手眼标定的适用边界热搜词里有很多人搜九点标定、十二点标定和手眼标定。这些确实都属于标定的范畴但适用场景完全不同。九点标定和十二点标定是相机成像平面到机械平面坐标映射的标定方法。九点标定通常是指利用九个已知物理坐标的靶标点求解图像坐标到机器坐标的仿射变换关系十二点标定一般指用十二个点求解更复杂的变换模型比如透视变换。这在视觉引导的工业场景中非常常见属于2D图像坐标到2D机械坐标的映射。手眼标定解决的是相机坐标系和机械臂末端坐标系之间的变换问题。眼在手上还是眼在手外标定方法略有不同本质上是求解AXXB问题。这和前面提到的LiDAR-IMU外参标定的数学框架完全一致。这些标定方法跟激光雷达标定最本质的区别在于激光雷达标定处理的往往是三维空间中的刚体变换和传感器模型参数而九点十二点标定更多是二维投影和平面映射关系。很多人混淆是因为不了解标定对象和数学模型一旦理解了底层数学结构就能判断在什么场景该用什么方法。5.2 其他标定场景的横向对比双目相机标定、沙姆镜头标定、光度立体标定、机械手旋转中心标定、底盘标定这些场景本质上都是求解某个测量模型中的未知参数。双目相机标定的核心是左右相机之间的相对位姿关系包括旋转矩阵、平移向量和重投影基线距离。沙姆镜头标定的核心是把镜头平面、成像平面和物平面三者约束关系标定清楚这在工业视觉里常用于大景深或倾斜面测量场景。底盘标定更常见于轮式机器人里程计校准目的是修正轮距、轮径等参数。它们和激光雷达标定用的工具可能完全不同但方法论高度相通建立数学模型采集已知特征的数据构造优化问题用最小二乘或非线性优化求解参数。搞懂一个领域的标定其他领域的标定基本都能触类旁通。从我个人经验来说做激光雷达标定最重要的不是背公式而是养成验证的习惯。标定完成后一定要用独立于标定数据的素材来做验证而不是用同一段数据反复检查。我踩过最深的坑是标定误差在采集数据上很小但换一个场景后投影误差变得一团糟后来发现是因为采集数据分布过于单一外参在部分维度上欠约束。最后分享一个实用建议。如果你在项目里做多传感器标定不妨建立一套标准化流程文档记录每次标定时的传感器型号、固件版本、内参文件、标定板规格、采集场景、数据量大小、标定结果误差指标和验证结果。这套记录在设备拆装、维护、升级后再次标定时能省下大量时间。激光雷达标定不是一劳永逸的事机械结构受震动、温漂影响后参数会缓慢变化定期检查、必要时重标是保障系统稳定运行的基本功课。
返回列表