ARTICLE DETAIL

资讯详情

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

OpenCalib多激光雷达外参标定与点云对齐优化实战

OpenCalib多激光雷达外参标定与点云对齐优化实战 多激光雷达外参标定这件事我做过不少次每次都有新坑。上周用OpenCalib给一套双激光雷达系统做了外参标定和点云对齐优化趁着热乎劲儿把整个过程和踩过的坑都记录下来。这篇东西不是文档翻译是我实际跑通之后的经验复盘从坐标系原理到数据采集从初值计算到对齐调优最后附上常见问题排查表给准备上手OpenCalib多激光雷达标定的朋友一个完整参考。如果你是刚接触激光雷达标定或者手上正好有一套多雷达系统要对齐这篇文章应该能帮你省掉几个通宵。1. 标定前先搞清楚外参标定到底在标什么1.1 外参标定的本质是把坐标系拧到一起激光雷达外参标定本质上是在求两个三维坐标系之间的旋转矩阵和平移向量。我们常说的[R|t]就是这个外参的核心内容。旋转矩阵R描述了两个雷达坐标系之间绕三个轴的旋转关系平移向量t描述了两个坐标系原点之间的位移。为什么要标这个因为每台激光雷达都在自己的坐标系里输出点云。以两台雷达为例雷达A在坐标系A里看到一个障碍物在坐标(x_a, y_a, z_a)雷达B在坐标系B里看到同一个障碍物在(x_b, y_b, z_b)。这两个坐标值不同但它们对应的是空间中的同一个物理点。连接这两个坐标的桥梁就是外参[R|t]。标定之后我们就能把B坐标系下的点云统一变换到A坐标系下公式很简单p_a R * p_b t其中p_b是雷达B坐标系下的点p_a是变换到雷达A坐标系后的坐标。这个公式看起来简单但实际求解R和t的过程相当折磨人因为激光雷达点云是稀疏的、带噪声的、还可能被遮挡一个不好的初值会让优化直接掉进局部最小值。很多朋友问我IMU和里程计给的外参能不能直接用答案是不能。机械安装总有误差螺丝拧紧的力度不同都会导致几毫米到几厘米的偏差而毫米波级的激光雷达对角度误差极其敏感。举个例子如果旋转矩阵在俯仰方向上有0.5度的误差在10米处的位置误差就有87毫米左右这个误差会直接体现在点云融合后的重影上。1.2 多激光雷达为什么比单雷达难这么多单激光雷达的外参标定往往是标定雷达相对于车体或IMU的安装位姿这种场景下通常有丰富的先验信息——车辆运动模型、GNSS位姿、惯性测量数据都能帮上忙。多激光雷达的外参标定就麻烦得多。第一雷达之间往往没有刚性连接的运动约束至少从数据上看不出来第二多雷达之间可能存在视角差异共同视野区域有限第三各雷达的扫描频率、时间戳可能存在偏差时间同步问题会直接影响关联精度第四多雷达系统往往是异质的比如一台16线雷达配一台32线雷达点云密度和视场角差异巨大。我在实际做的时候最直观的感受是单雷达标定错了顶多是这幅点云有点歪多雷达标定错了融合后的点云会出现重影、拖影、边缘错位这一问题在建图和感知任务里会成倍放大。之前有一次标定结果不理想跑cartographer建图时整个地图都是飘的后来发现就是外参偏差导致两帧点云被错误叠加了。2. OpenCalib方案选型与工作流梳理2.1 为什么选OpenCalibOpenCalib是阿里巴巴达摩院开源的一套传感器标定工具集它不只做激光雷达标定还支持相机内外参、雷达与相机联合标定、多雷达标定等。相比一些商业方案OpenCalib最大的优势是配合各种数据集做了大量验证算法比较成熟而且提供了相对完整的标定流程模块。对于多激光雷达标定OpenCalib提供了基于点到面ILO(ICP-like)优化的方案也支持基于标定板的离线标定。我在项目里用的是无目标标定方式就是不需要摆放标定板直接在自然场景里提取特征点来优化外参这在室外场景下特别方便。如果你有标定板也可以走带目标的流程精度通常会更高一些。OpenCalib对ROS1的支持比较完善ROS2环境下需要自己做一些适配。我在Ubuntu 20.04 ROS1 noetic环境里跑过也在Ubuntu 22.04 ROS2 humble环境下尝试过都能跑通但ROS2适配需要多花点时间处理消息类型和tf的接口问题。2.2 整体工作流从数据到结果的五个阶段多激光雷达外参标定的工作流大致可以拆成五步数据采集让多台雷达在同一个场景中同时采集点云并记录时间戳。预处理去运动畸变、去噪、时间同步对齐。初始外参估计通过手工测量、视觉辅助或者粗略的ICP求一个近似初值。精细化优化以初始外参为起点利用点云匹配算法迭代优化旋转平移参数。结果验证把标定后的外参应用到实际点云上检查重投影误差、对角线边缘是否对齐。OpenCalib中这几步都有对应的模块但实际使用中数据采集和预处理的效果往往决定了最终标定的上限。我在那台双雷达系统上第一次标定结果不理想重投影误差总是降不下去后来查出来就是数据采集时场景太单调特征点太少导致的。3. 多激光雷达外参标定完整实操过程3.1 数据采集决定标定结果上限的关键步骤标定算法的上限是数据决定的优化只是逼近这个上限。所以数据采集这一步千万别图省事。场景选择上要选几何特征丰富的位置建筑物的墙角、电线杆、路沿、树干、停车场的车辆轮廓这些都是很好的自然特征。避免大片的空旷区域空旷区域点云没有几何约束旋转矩阵里的roll和pitch方向容易出现退化。我之前在停车场里做过一次标定周围全是车和立柱结果收敛速度特别快验证结果也好。后来又试过一次在空旷的草地上采集数据优化半天误差就是不下降换了个场景重采一次就收敛了。采集时长方面静态标定通常采集30秒到1分钟就够。如果你做的是在线动态标定需要让车辆低速行驶避免急转弯和急加速防止运动畸变严重。采集时要注意点云帧的时间同步。多雷达之间可以使用PPS秒脉冲加GPRMC时间报文的方式同步也可以共用同一个同步触发源。如果时间戳对不齐比如两台雷达的时间差达到50毫秒在动态场景下会造成数厘米到数十厘米的匹配误差这在标定过程中会被误认为是外参误差导致优化结果产生系统性偏差。在OpenCalib中采集数据后需要按指定格式保存成rosbag或文件夹形式。我在实际操作中直接用rosbag record录制了几个topic然后写了个Python脚本把点云消息转成OpenCalib能读取的格式。这一步看似简单但topic名称、坐标系名称都必须统一建议在采集前就把tf树理清楚。3.2 初值计算为什么不能直接跳到优化很多人有个误区觉得反正有优化算法初值随便给一个就行。这话对ICP类算法来说是大忌因为ICP本质上是一个局部优化算法它要求初值与最优解之间的距离足够近否则会陷入局部最小值。我在第一次做双雷达标定时初值直接拍脑袋给了单位矩阵结果优化跑了很久误差一直保持在很高的水平。后来改用手摇雷达支架角度再用CloudCompare手动粗配准把初值误差控制在了几度以内优化很快就收敛了。如果你手里没有现成的初值可以试试OpenCalib里提供的自动初始外参标定模块或者先用CloudCompare这类软件手动粗配准。CloudCompare里面配准两个点云的操作很直接同时加载两帧点云选中其中一个用点对点配准工具手动选几组对应点就能算出一个大概的变换矩阵这个结果当成初值相当不错。3.3 精细化优化OpenCalib核心参数与运行OpenCalib的多雷达标定优化主要利用NDT或者点到面ICP思想把两帧点云对齐的残差降到最小。配置项通常在标定任务的yaml文件里我用的核心参数大致如下max_iterations: 60 voxel_size: 0.3 max_correspondence_distance: 2.0 transformation_epsilon: 1e-8max_iterations控制最大迭代次数我一般设成60到100之间。voxel_size是体素下采样的大小这个值很关键。体素太大特征丢失严重精度上不去体素太小计算量巨大而且噪声影响变大。对于16线雷达0.3到0.5米比较合适对于64线雷达可以适当减小到0.2米左右。max_correspondence_distance控制一对匹配点的最大距离阈值超过这个阈值的点对会被视为outlier。这个参数跟场景尺度强相关室内场景建议小一些比如0.5到1.0米室外场景可以放到2到3米。这里有个经验先设大一点让算法收进全局范围再逐步减小精修。运行标定脚本后OpenCalib会输出迭代收敛曲线和最终的误差统计。我通常会看两个指标一是匹配残差是否持续下降并收敛二是优化出的外参与初值的差异是否在合理范围内。如果差异太大比如旋转角度差了5度以上说明初值太差或者数据有问题这时候需要回到采集环节检查。3.4 结果验证别让标定结果看起来好就是好标定结果验证是很多人容易跳过的一步但我强烈建议认真做。最直观的验证方式是把两台雷达的标定后点云叠加到一起在CloudCompare或rviz里观察墙角、路沿、车道线边缘是否对齐。正常对齐后墙角的点云应该是双层薄墙变成一层边缘不再有锯齿状的拖影。也可以用数值指标来验证。最常见的是最近邻距离误差Mean Point-to-Point Distance计算A雷达每个点到B雷达最近点的距离均值。还有一种更严格的方式是手选几组同名特征点计算它们在外参变换后的空间距离误差。我用过一种交叉验证的方法用前30秒数据标定用后30秒数据验证。如果标定结果在后半段数据上表现不佳说明存在过拟合需要回去看是不是场景特征不够丰富或者时间同步有问题。4. 点云对齐优化从能对齐到对齐得好4.1 对齐误差的几个来源外参标定之后点云对齐并不一定完美误差来源有很多。我自己归纳了一下大概有这几类第一外参标定本身的误差。即使优化收敛也存在残差只是残差被分摊到了累积误差中。这个误差在远距离点云上会被放大比如10米远的物体如果有0.1度的角度误差位置偏差约17毫米。第二时间同步误差。如果两台雷达不是同步触发即使在静态场景下也会有问题。动态场景中特别是车辆转弯时时间不同步会导致明显的重影。第三运动畸变。激光雷达一帧数据是扫描周期内逐步采集的车辆行驶时点云会出现运动畸变。可以通过IMU数据进行运动补偿。第四点云密度差异。不同线束的雷达点云密度不同在匹配时密度较稀的雷达特征不够明显容易产生匹配误差。第五温度漂移和机械形变。这个比较隐蔽但在长时间工作后雷达支架受热膨胀、螺栓松动等都会导致外参漂移很多严格的项目会要求定期重新标定。4.2 点云预处理优化前的必修课在做对齐优化之前点云预处理做得好不好直接决定了优化效果。体素下采样是最常用的手段。下采样有两个作用一是降低计算量二是均匀化点云密度避免某个区域点云过密对匹配产生过多的权重影响。我在预处理阶段一般用0.2米或0.3米的体素尺寸。地面点移除也很关键。地面点数量巨大但对匹配的贡献有限而且如果地面有坡度或者不平整反而会干扰优化。我用过一个简单的方法用RANSAC拟合平面把拟合出的地面平面上的点全部删除。如果场景是平坦的效果不错。动态物体剔除是我容易忽略的一步。如果在采集过程中有车辆或行人穿过这些点云对应的是非静态物体在外参优化中会造成严重的误匹配。后来我都是先做静态地图通过帧差法检测运动点并删除然后再进入标定流程。4.3 常用的对齐优化策略多激光雷达点云对齐优化手段上不只有标定这一步。我常用的优化策略包括基于残差的迭代再优化标定完成后再用NDT或ICP对整段数据的局部帧做一次精配准。如果发现某个区域总是对不齐可以把局部区域的点云单独提取出来重新优化外参。利用路面特征做约束路面是天然的平面约束。如果两雷达都能看到地面可以提取地面平面用平面法向量对齐来约束roll和pitch方向然后利用其他特征约束x、y、z和yaw。这种方法在空旷场景特别有效。多尺度匹配先用粗体素例如1米做大范围匹配获得一个比较好的初始结果再用细体素例如0.2米精匹配。这种方法比直接细匹配鲁棒得多基本成为了我的默认策略。我做过一次测试直接使用0.2米体素匹配在复杂场景下收敛到了错误的外参改用1米到0.5米到0.2米的多尺度匹配后结果稳定且误差更小。4.4 参数调优的实践参考这里分享一组我在多套系统上摸出来的参数范围可以作为起步参考。参数名初始范围说明voxel_size0.2 - 0.5 m越小精度越高但计算量大max_iterations50 - 100收敛慢时加大max_correspondence_distance1.0 - 3.0 m室外取大值室内取小值transformation_epsilon1e-9 - 1e-7迭代停止阈值越小越精细fitness_score目标0.05 m以内平均点距误差注意这里说的fitness_score指的是平均点距误差不是覆盖率。有些算法输出的fitness score越高越好OpenCalib里要看具体指标定义别被数字误导。5. 常见问题与排查技巧实录5.1 常见问题速查表我把实战中常遇到的问题整理成了表格方便大家对照排查。问题现象可能原因排查方向标定迭代不收敛初值误差过大用CloudCompare手动粗配准提供初始外参收敛到明显错误结果特征退化或场景单一更换场景补充几何特征误差降不下去时间同步偏差大检查PPS和GPRMC同步状态动态场景重影严重运动畸变未补偿使用IMU数据补偿运动畸变标定结果一段时间后失效安装松动或热漂移检查机械固定并重新标定点云边缘拖影多雷达密度差异下采样时设置合理体素大小室外场景ground不稳地面约束权重过高先移除地面点再匹配5.2 几个容易忽视的细节第一坐标系名称千万别混淆。OpenCalib对坐标系名称敏感如果点云消息里frame_id和你配置的坐标系名称不一致运行时会直接报错或者悄悄算错。我在实际操作中习惯先把所有点云消息的frame_id统一改名再喂给标定程序。第二雷达型号不同扫描模式不同。例如Livox系列是非重复扫描点云的分布特性和传统的机械式雷达差异很大。Livox MID-360这类雷达做外参标定时如果直接套用机械式雷达的配置容易出现特征点不足的问题。之前用MID-360做标定时我观察到它的点云在边缘区域比较稀疏所以在预处理时会适当降低体素分辨率提高边缘特征点的保留率。第三支架刚性影响很大。我曾经遇到过一个问题标定时结果很好但车辆行驶一段时间后外参明显漂移。最后发现是雷达支架用了一根细长的铝型材车辆振动导致支架变形。后来换了加厚的三角支架问题解决。如果你的项目对精度要求高支架刚性一定要重视。第四时间和温度对外参的影响不可忽视。工业级的激光雷达标定环境建议在正常工作温度下进行。我之前在早晨冷车状态下标完参数中午太阳暴晒后重新验证发现外参已经产生了毫米级偏差对于近距离感知任务影响不大但对于远距离融合建图来说累积误差会非常明显。5.3 实战中的一条重要经验最后分享一个我个人觉得很有价值的小技巧标定完之后不要把结果直接丢进系统里就不管了建议做一个自动校验脚本定期加载新采集的一小段数据自动计算重投影误差如果误差超过阈值就报警提示需要重新标定。我在项目里就是写了一个简单脚本每天开机后采集10秒数据通过标定好的外参把两个雷达点云融合计算重合区域的最近邻距离误差。正常情况下误差在5厘米以内如果超过8厘米就说明外参可能发生了变化。这个方法帮我提前发现过几次支架松动问题。另外一点多激光雷达外参标定不是一劳永逸的事情。机械振动、温度变化、装配应力释放都可能导致外参缓慢变化。如果你做的是量产级产品建议在产线上设计自动标定工位如果是研发阶段的实验车至少也要每月做一次检查标定。这听起来像废话但很多人恰恰是在这里吃了亏。
返回列表