ARTICLE DETAIL

资讯详情

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

3D雷达与IMU联合标定实战:LI Calib从入门到避坑

3D雷达与IMU联合标定实战:LI Calib从入门到避坑 多传感器融合定位这几年从实验室走向量产3D雷达和IMU的联合标定几乎是每个做SLAM、自动驾驶或者机器人导航的团队都绕不开的一道坎。我最早接触这块是在一个园区低速配送车上当时用的就是浙大LI Calib这套开源工具前前后后折腾了将近两周才把外参标到能用的精度。这套工具的核心价值在于它不需要任何标定板、不需要特定场景只要让设备在自然环境中正常运动一段就能把雷达和IMU之间的旋转外参、时间偏移以及重力方向一起估出来。适合谁看如果你正在做多传感器融合定位、激光里程计、或者nav2导航里3D雷达和IMU的联合使用这篇文章应该能帮你少走不少弯路。1. 为什么雷达和IMU的外参不能靠卷尺量1.1 外参误差在融合定位里是怎么被放大的很多人第一反应是雷达和IMU都固定在同一个支架上我拿尺子量一下相对位置不就行了位置确实可以大致量出来但旋转外参你没法量。雷达坐标系和IMU坐标系之间的旋转关系通常包含俯仰、偏航、滚转三个角哪怕只差1到2度在融合算法里经过几十米的累积位置误差就能到米级。我做过一个简单的估算假设旋转外参有1度的俯仰误差车辆前进100米后雷达观测到的地面点云在垂直方向上的投影偏差大约是100 × tan(1°) ≈ 1.75米。这个量级对于车道级定位来说是完全不可接受的。所以外参必须通过数据驱动的方式精确估计而不是靠手工测量。LI Calib的思路就是利用雷达观测到的环境结构比如地面、墙面、树干这些稳定特征和IMU提供的运动信息通过优化让两者对齐。它同时估计旋转外参、时间偏移和重力向量这三个量是耦合的必须一起解。1.2 LI Calib到底解的是哪几个量具体来说LI Calib的优化变量包括旋转外参R从IMU坐标系到雷达坐标系的旋转矩阵用旋转向量表示三个自由度时间偏移t_d雷达时间戳和IMU时间戳之间的固定延迟一个标量重力向量g在雷达坐标系下的重力方向两个自由度因为重力大小已知约9.81注意这里没有估计平移外参。原因是雷达和IMU之间的平移量相对较小而且LI Calib的核心观测是旋转运动平移对外参旋转的约束很弱。如果你需要平移外参通常是在旋转标定完成后用其他方法比如基于轨迹对齐单独估计。这个设计选择很关键它让问题从6自由度降到了6自由度3旋转1时间2重力但实际上旋转和时间偏移是主要难点重力方向在优化中会逐渐收敛。1.3 什么情况下LI Calib会失效不是所有场景都能标定成功。我踩过的坑里以下几种情况基本标不出来第一种是运动激励不足。如果你只是让设备缓慢平移没有明显的旋转运动那旋转外参根本不可观。LI Calib需要设备有充分的旋转激励尤其是绕不同轴的旋转。实际操作中我一般会做几组“8字”运动包含明显的偏航和俯仰变化。第二种是雷达退化场景。如果设备一直在长走廊或者空旷场地运动雷达观测到的几何特征单一优化会发散。最好选择有墙面、地面、树木、建筑等丰富结构的环境。第三种是时间同步本身有问题。如果雷达和IMU的时间戳来自不同的时钟源而且没有硬件同步那时间偏移可能不是常数LI Calib假设的是固定延迟这种情况下标定结果会不稳定。2. 数据采集环节的细节决定标定成败2.1 传感器安装的硬性约束在采集数据之前安装方式就已经决定了标定的上限。我总结了几条硬性约束雷达和IMU必须刚性连接。任何减震垫、橡胶垫都会引入额外的相对运动标定出来的外参会包含这些弹性形变导致实际使用时精度下降。我见过一个案例团队为了减震在IMU下面垫了泡棉结果标定出来的外参在颠簸路面上完全不可用。IMU的安装方向尽量与雷达坐标系大致对齐。虽然LI Calib会估计旋转外参但如果初始偏差太大比如超过30度优化的初值太差容易收敛到局部最优。我的习惯是让IMU的X轴大致指向雷达前方Y轴大致指向左侧这样初始旋转接近单位矩阵。线缆要固定好。运动过程中线缆晃动会带动IMU轻微移动虽然幅度很小但在高精度标定里是噪声源。2.2 运动轨迹怎么设计才有效数据采集的轨迹设计直接决定了标定的可观测性。我的经验是分三段第一段是静态段保持设备静止30秒左右。这段数据用来估计IMU的零偏和初始重力方向LI Calib会用它做初始化。第二段是激励段做充分的旋转运动。具体来说手持设备或者让车辆做以下动作先绕垂直轴左右转几圈偏航激励然后绕前进轴左右倾斜滚转激励最后绕横轴前后俯仰俯仰激励。每个动作持续10到15秒动作要平滑但幅度要够角速度最好能达到30到60度每秒。第三段是验证段做一段正常的运动轨迹用来验证标定结果。这段数据不参与优化只用来检查标定后的融合效果。整个采集过程建议持续2到3分钟数据量太大优化会慢太小则激励不足。2.3 时间戳和话题录制的注意事项如果你用ROS录包有几个细节必须注意雷达和IMU的时间戳必须来自同一时钟源。如果雷达走的是自己的内部时钟IMU走的是主机时钟那时间偏移会漂移。我一般会确保雷达驱动发布的时间戳是主机时间或者至少两个传感器都走PTP同步。录制时用rosbag record同时录雷达和IMU话题不要分开录。分开录的话两个包的时间基准可能不一致后续对齐很麻烦。录包时加上--buffsize参数避免丢帧。雷达点云数据量大默认缓冲区可能不够。提示录包前先用rostopic hz确认两个话题的频率稳定。雷达一般10HzIMU一般100Hz到200Hz。如果频率抖动很大先排查驱动问题。3. 从录包到标定结果的完整操作链路3.1 环境准备与依赖安装LI Calib依赖ROS、Eigen、Ceres Solver这几个基础库。我用的环境是Ubuntu 20.04 ROS Noetic这套组合比较稳定。安装步骤如下# 安装Ceres Solver sudo apt-get install libceres-dev # 安装Eigen sudo apt-get install libeigen3-dev # 创建工作空间 mkdir -p ~/li_calib_ws/src cd ~/li_calib_ws/src然后把LI Calib的源码克隆到src目录下。注意检查它的CMakeLists.txt里Ceres的版本要求有些版本需要Ceres 2.0以上。编译时如果遇到Eigen对齐问题在CMakeLists.txt里加上add_definitions(-DEIGEN_MAKE_ALIGNED_OPERATOR_NEW)这个坑我踩过不加的话运行时会报段错误而且报错位置很隐蔽不容易定位。3.2 配置文件的关键参数怎么填LI Calib的配置文件里几个参数必须根据你的传感器改参数名含义我的推荐值说明imu_topicIMU话题名/imu/data根据实际话题改lidar_topic雷达话题名/velodyne_points根据实际话题改imu_rateIMU频率200按实际填lidar_rate雷达频率10按实际填time_offset_init时间偏移初值0.0一般设为0gravity_init重力初值0,0,-9.81雷达坐标系下time_offset_init这个参数很关键。如果你知道硬件同步做得很好就设0如果有明显延迟可以先估一个大概值。我一般先设0跑一遍看优化出来的时间偏移是否在合理范围内一般不超过0.1秒。3.3 运行标定与结果解读运行标定的命令很简单roslaunch li_calib calib.launch然后播放录好的包rosbag play your_data.bag --clock标定过程中终端会打印迭代信息包括当前残差、梯度范数等。正常情况下残差应该逐渐下降并收敛。如果残差震荡或者发散说明数据有问题。标定完成后会输出几个结果旋转外参一个旋转向量可以转成旋转矩阵或者四元数时间偏移标量单位秒重力向量雷达坐标系下的重力方向我一般会把旋转外参转成欧拉角看一下确认俯仰、偏航、滚转是否在合理范围内。如果某个角超过10度要么是安装确实偏了要么是标定出了问题。3.4 标定结果怎么验证才靠谱标定完不能直接用必须验证。我常用的验证方法有两种第一种是重投影验证。把标定后的外参应用到雷达点云上看地面点是否水平、墙面点是否垂直。如果外参准确地面点云在IMU重力方向上的投影应该是一条细线。第二种是融合轨迹验证。用标定后的外参跑一遍激光里程计或者融合定位看轨迹是否平滑、闭环误差是否合理。我一般会跑一个闭环场景看起点和终点的位置偏差。如果验证不通过先别急着重新标定检查一下数据采集时有没有明显的运动激励不足或者时间同步问题。4. 那些让我熬夜的坑和对应的解法4.1 标定结果每次都不一样这是最常见的问题。同一段数据跑两次旋转外参差个0.5度时间偏移差个几毫秒。原因通常有三个一是优化初值敏感。LI Calib的优化是非凸的初值不好会收敛到不同的局部最优。解法是固定随机种子并且用上一轮的结果作为下一轮的初值。二是数据激励不足。如果旋转运动不够丰富优化问题接近病态微小的噪声就会导致结果跳动。解法是重新采集数据增加旋转激励。三是雷达点云噪声大。如果雷达本身精度差或者有运动畸变未补偿观测噪声会传递到外参上。解法是检查雷达驱动是否做了运动补偿。4.2 时间偏移估计出来是负的或者特别大时间偏移的正常范围一般在正负0.05秒以内。如果估计出来是负的而且绝对值很大说明雷达时间戳比IMU时间戳超前很多这通常意味着两个传感器的时间基准不一致。我遇到过一次雷达驱动发布的时间戳是雷达内部时钟而IMU是主机时钟两者差了将近0.3秒。这种情况下LI Calib估计的时间偏移没有物理意义标定出来的外参也不准。解法是统一时间基准要么都走主机时钟要么都走PTP。4.3 重力向量方向明显不对重力向量在雷达坐标系下应该大致指向下方。如果标定出来指向侧面或者上方说明优化发散了。原因可能是IMU的加速度计有零偏或者尺度因子误差。LI Calib假设IMU加速度计是准的如果IMU本身没标定过重力方向就会估错。解法是先用IMU标定工具把加速度计和陀螺仪标一遍再跑LI Calib。4.4 标定后融合定位反而变差了这种情况一般是外参过拟合了。LI Calib优化的是标定段数据的残差如果标定段数据有特定的运动模式优化出来的外参可能只对这段数据最优换一段数据就不行了。解法是增加标定数据的多样性不要只用一种运动模式。我一般会采集三段不同场景的数据分别标定然后取中位数作为最终外参。5. 标定之外和nav2、VINS等系统的衔接5.1 标定结果怎么喂给nav2导航nav2里如果用3D雷达做定位通常会和IMU融合。标定好的外参需要配置到robot_localization或者类似的状态估计节点里。具体来说在robot_localization的配置文件中需要设置imu0_config: [false, false, false, true, true, true, false, false, false, true, true, true, false, false, false]这里的关键是把IMU的角速度和线加速度打开并且配置好外参。外参一般通过static_transform_publisher发布rosrun tf static_transform_publisher x y z qx qy qz qw imu_link lidar_link 100其中qx qy qz qw就是LI Calib标定出来的旋转四元数。5.2 和VINS-Fusion的IMU标定有什么区别VINS-Fusion里也有IMU标定但它标的是IMU和相机之间的外参以及IMU的零偏和尺度因子。LI Calib标的是IMU和雷达之间的外参。两者解决的问题不同不能互相替代。如果你同时用相机、雷达和IMU那需要分别做相机-IMU标定和雷达-IMU标定然后把三者统一到一个坐标系下。这个过程叫多传感器联合标定比单一标定复杂得多。5.3 标定频率和在线标定的取舍外参会随着时间漂移吗会但很慢。如果传感器安装牢固外参在几个月内变化很小。我一般建议每三个月重新标定一次或者在设备受到撞击后重新标定。在线标定是另一个思路就是在运行过程中实时估计外参。但在线标定对算力要求高而且容易受场景影响。我的经验是离线标定做准在线标定只做微调。6. 一些提高标定精度的实操技巧6.1 数据预处理能去掉一半的噪声在跑LI Calib之前我一般会对雷达点云做几件事去除地面点。地面点虽然对重力估计有用但太多地面点会主导优化让旋转外参的约束变弱。我一般保留一部分地面点去掉大部分。去除远处点。远处点云稀疏且噪声大对优化贡献小。我一般只保留30米以内的点。去除动态物体。运动的人、车会在点云里留下拖影干扰优化。如果场景里动态物体多先用聚类方法去掉。6.2 多段数据联合标定单段数据标定容易过拟合我一般会采集三段数据分别标定然后旋转外参取三段结果的中位数时间偏移取三段结果的平均值重力向量取三段结果的平均值并归一化这样得到的标定结果更鲁棒。如果三段结果差异很大说明数据采集有问题需要重新采。6.3 用标定后的残差判断质量LI Calib优化完成后会输出最终残差。残差的大小反映了标定的质量。我一般会看两个指标旋转残差应该在0.01弧度以内时间残差应该在0.001秒以内如果残差明显偏大说明模型和数据的匹配度不好可能是时间同步问题或者雷达运动畸变未补偿。6.4 标定结果的保存和版本管理标定结果一定要版本管理。我一般会把每次标定的结果存成一个YAML文件包含calib_date: 2024-01-15 rotation: [qx, qy, qz, qw] translation: [x, y, z] time_offset: 0.002 gravity: [gx, gy, gz] residual: 0.008这样后续如果定位出问题可以回溯到具体是哪次标定的结果。7. 关于标定这件事我自己的几点体会做了这么多次雷达和IMU标定我最大的体会是标定不是一个一劳永逸的事情而是一个需要持续关注和迭代的工程环节。很多人把标定当成一个“跑一次就完事”的步骤结果在后续使用中遇到各种定位问题回头才发现是标定没做好。另一个体会是数据采集的重要性远大于优化算法本身。LI Calib的优化算法已经很成熟了但如果你采集的数据激励不足、时间同步有问题、或者安装不牢固再好的算法也标不出准确的外参。我现在的习惯是花70%的时间在数据采集和检查上30%的时间在跑优化和验证上。最后说一个容易被忽略的点标定完成后一定要在实际运行场景里验证。实验室里标得再好到了实际场景里可能因为温度变化、振动、安装松动等原因出现偏差。我一般会在设备正式运行的第一周每天检查一次定位精度确认标定结果稳定后再降低检查频率。
返回列表