ARTICLE DETAIL

资讯详情

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

激光雷达与IMU联合标定实战:用lidar_imu_calib搞定外参与时延

激光雷达与IMU联合标定实战:用lidar_imu_calib搞定外参与时延 做激光雷达SLAM和IMU融合定位这些年我踩得最多、也最容易被忽略的坑就是传感器之间的“初始位姿”到底准不准。外壳夹具拧歪一度地图立马换个画风点云重影、地图漂移、定位跳变排查到最后大概率都是外参的锅。lidar_imu_calib就是专门把激光雷达和IMU之间的旋转、平移以及时间延迟一次标出来的开源工具非常适合和我一样用VLP-16这类多线机械雷达搭配9轴IMU做建图、定位、多传感器融合的玩家。这篇文章我直接拿VLP-16实测跑通一遍从环境搭建、数据采集到参数配置和结果验证全部写清楚按步骤做就能拿到能用的外参。1. 为什么激光雷达和IMU需要联合标定1.1 标定的到底是什么很多刚入坑的同学觉得雷达和IMU都装在同一个板子上直接卡尺量一下、角尺比一下不就行了真没这么简单。装上之后雷达坐标系和IMU坐标系之间存在一个固定但未知的三维旋转R和一个三维平移t这个变换在融合算法里叫外参。同时两个传感器的时间戳系统很难做到完全同步VLP-16在10Hz频率下工作IMU通常跑200Hz两个数据流之间的延迟哪怕差几十毫秒在转动剧烈的场景下点云也能错出明显重影。所以标定要做两件事一个是空间对齐R和t一个是时间对齐时延td。这个工具解决的是“雷达-IMU融合”里的公共第一步。后面无论是做LIOlidar-inertial odometry、把IMU用于点云去畸变还是视觉激光雷达融合第一步都是先把外参标准。你要是外参不对算法再牛也会被带偏。1.2 VLP-16这类雷达的误差放大效应VLP-16是16线机械雷达水平360度、垂直视场从正15度到负15度标称测距能到100米。这个雷达性价比高在室内外巡检、小车上非常常见。但它也有一个物理特性角分辨率不够细垂直方向相邻两线之间隔着2度水平方向10Hz时大约0.2度。正因为角分辨率有限外参差一点远距离点云就会偏移得离谱。举个例子如果外参绕水平轴偏了1度30米远处的点云会偏移大约0.5米。这点误差映射到地图上就是墙面分层、地面出现双影、柱子变成两根。IMU的安装角通常还带着几度的偏差靠机械加工去保证精度成本高还不稳定。对做SLAM的人来说与其跟“建图飘”的问题死磕不如先把标定做了效率高得多。2. 标定原理速通知道三条主线就行2.1 工具内部在做什么lidar_imu_calib的整体思路可以拆成三阶段先是初始旋转估计再是时间偏移估计最后是联合优化。第一阶段程序从激光点云里提取边缘点和平面点利用相邻两帧之间的点云匹配估计出激光雷达在短时间内的自身运动。与此同时拿IMU加速度计和陀螺仪积分出同一段时间的姿态变化。把这两段运动放到一起用最小二乘就能求出一个初始的旋转外参。第二阶段引入一个时间偏移量td。程序把IMU轨迹在时间轴上左右平移让IMU运动序列和激光雷达运动序列对齐对齐效果最好的那一个td就是时间延迟的初值。第三阶段把外参R、t和时延td一起放进Ceres优化器里联合优化。激光雷达这边给的是点云帧间配准残差IMU这边给的是姿态积分残差两股约束合起来求解得到最终的外参。整个过程背后的数学主要是四元数、李群SO(3)和B样条插值对使用来说不需要全部精通但理解这个流程能帮你知道参数文件里的每一项在干什么。2.2 为什么标定数据必须“动起来”我见过有人把设备往桌子上一放录了五分钟rosbag就开始标结果外参乱七八糟然后怀疑工具不行。其实不是工具不行是数据里根本没有足够的运动激励。激光雷达帧间配准需要雷达前方有视差变化需要有边、有角、有平面IMU积分需要设备真正发生转动和平动加速度计和陀螺仪才有有效输出。如果设备静止雷达看到的是同一幅点云IMU积分出来的是重力向量约束全部退化优化结果完全不可信。所以采集必须包含六个自由度的激励前后左右平移、上下颠簸、左右旋转、点头抬头都要有。后面我会给一套可直接照抄的运动方案。3. 环境准备与工具安装3.1 硬件安装与时间同步开工之前先检查机械固定。雷达和IMU之间绝对不能有相对运动螺丝要紧固支架不能软。要是设备标定过程中被撞了一下后面所有结果都得作废。时间同步这件事容易被忽略。VLP-16驱动默认会带时间戳但如果你通过USB转网口或者交换机中转时间戳可能抖动。IMU如果用的是串口转USB也容易有周期抖动。工具本身能估计时间延迟但它的能力范围在几十到几百毫秒级别如果你系统时间本身就是乱的那谁也救不了。我的习惯是先把工控机的系统时间用NTP同步好再确认VLP-16的PTP或者gPTP时钟正常最后看一眼IMU话题的时间戳曲线是否平稳。IMU的数据频率也要达标建议至少100Hz最好200Hz。VLP-16一般跑10Hz两个频率跨一个数量级标定才有余量。3.2 编译依赖与避坑我在Ubuntu 18.04 ROS Melodic上编译运行一次通过。Ubuntu 20.04 ROS Noetic也能跑但更容易踩编译版本坑建议新手直接用18.04省心。依赖主要是三个Ceres Solver、PCL、Eigen。Ceres建议用1.14.0版本直接用系统源安装sudo apt install libceres-dev然后创建工作空间并拉代码mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/APRIL-ZJU/lidar_imu_calib.git cd ~/catkin_ws catkin_make -j4编译如果不通过优先检查Ceres版本。Ubuntu 20.04自带的高版本Ceres搭配这个老代码经常会出现函数签名不匹配的报错解决办法是源码编译Ceres 1.14.0git clone https://github.com/ceres-solver/ceres-solver.git cd ceres-solver git checkout 1.14.0 mkdir build cd build cmake .. make -j4 sudo make install编译成功后用rospack find lidar_imu_calib验证路径能找到说明环境OK。Noetic用户如果遇到C标准问题需要在CMakeLists里把C标准改成14代码本身不至于大改。4. 采集一份合格的标定数据4.1 场景选择和运动激励方法数据是否合格决定了标定能不能收敛也决定标定结果靠不靠谱。先把场景选好要选有结构感的区域比如园区里的柱子、墙角、停车场的隔离墩、树干、围墙、栅栏。太空旷的广场、什么都没有的走廊、大玻璃幕墙区域都不行点云匹配会退化。运动方案我建议按顺序录原地顺时针慢慢转一圈再逆时针转一圈每圈10秒左右推着设备走一个S形或8字形过程中自然包含转向走直线的同时突然加速和减速来回两三趟把设备上下点头、左右摇晃幅度不用大但要连续最后做几个“边转边平移”的组合动作相当于把旋转和平动耦合起来。整套动作录下来1到3分钟足够。我实测下来2分钟的数据标出来的结果就很稳。录的时候观察rviz里的点云不要出现大面积断帧人也不要挡在雷达正前方不动。4.2 rosbag录制与话题检查先确认两个核心话题有数据rostopic hz /velodyne_points rostopic hz /imu/data雷达话题频率要在10Hz上下IMU要在100Hz到200Hz。如果IMU话题半天跳不出来先查驱动不要急着录。确认无误后开始录制rosbag record /velodyne_points /imu/data -O lidar_imu.bag录完后马上检查rosbag info lidar_imu.bag重点看话题名是否正确、总时长是否足够、消息数量是否合理。我踩过一次坑IMU驱动发布的话题是/imu/data_raw而工具配置里写的是/imu/data跑起来之后程序在等数据日志一直不动。所以录制前一定要把话题名记下来后面配参数要用。5. 参数配置逐项讲解5.1 雷达与IMU参数文件lidar_imu_calib的参数文件主要集中在config目录下不同fork版本文件组织略有差异但核心就是雷达配置、IMU配置和主标定配置三类。雷达配置里最要紧的几个参数是话题名、最小距离和最大距离。VLP-16最远标称100米但过远的点云噪声大、线数稀反而干扰配准建议max_range设在30到50米。min_range设在1到1.5米把近处的非地面杂点滤掉。IMU配置里除了话题名一般还要填噪声密度和随机游走。这两个值如果是随便抄的工具也能跑但优化精度会受影响。最靠谱的做法是用imu_utils或者Kalibr先把IMU内参标定出来再把结果填进去。如果你手上的IMU是入门级九轴模块噪声参数填个大概也够用毕竟这个工具的重点是外参。5.2 标定主参数说明主标定配置里我建议重点关注三个时间偏移初值offset_init、是否启用时延估计、优化迭代设置。offset_init默认给0通常没问题。如果雷达和IMU驱动之间延迟明显比如你发现点云和IMU在时间上差了好几百毫秒可以先在rviz里观察一下大概差多少然后把offset_init填成这个负值或正值帮助工具更快收敛。时延估计开关一定要打开。很多同学觉得“我时间同步做得好不需要估计时延”但实际系统里驱动转发、串口缓冲、bag落盘都会引入延迟把这行关掉等于自动放弃了工具一个很有用的能力。迭代次数和收敛阈值保持默认就行不用动。真正要花心思的是采集数据参数本身给工具留的余量非常大。6. 跑通流程与结果验证6.1 运行与日志解读启动工具前把参数文件里的话题名和你录的bag对齐。直接回放bagrosbag play lidar_imu.bag然后再开标定节点。不同版本的启动命令不一样我的经验是看仓库README常见的启动方式是roslaunch lidar_imu_calib lics_calib.launch跑起来后日志会按阶段输出。第一阶段会显示点云特征提取和帧间匹配的进度第二阶段会打印时间偏移估计值第三阶段优化完成后会直接打印最终外参一般以四元数加平移量的形式给出例如 q_imu_lidar 和 t_imu_lidar。拿到四元数可以先自己心算一下合理性。如果雷达和IMU大致都朝前安装旋转外参应该接近单位四元数如果是垂直安装会比较接近90度对应的四元数。如果算出来的旋转角是45度、137度这种和机械安装完全对不上的值先别急着用数据或参数大概率有问题。6.2 结果怎么验证标定输出不能直接拿来就跑一定要验证。我最常用的方法有三个。第一个方法用TF把雷达点云转到IMU坐标系在rviz里同时打开标定前后的点云。静止环境下远处墙面应该清晰锐利不该出现双影。如果墙面出现了两层点云边界说明旋转外参还有残差。第二个方法把标定外参写进LIO算法比如Fast-LIO或LIO-SAM然后回放同一段标定bag做一次建图。如果建图干净、回环闭合半径小说明外参是可信的。如果地图出现蘑菇云形状或者转弯处明显漂移多半还是外参或者时延的问题。第三个方法重复标定三次。每次重新录一段数据比较三次标定结果。如果旋转角变化在0.1度以内、平移变化在1厘米以内说明稳定性良好。如果三次结果差别很大说明数据激励不足或场景不合适直接重新采数据。7. 常见问题与避坑指南7.1 常见报错速查表现象可能原因解决思路编译报错找不到CeresCeres没装或版本过高源码安装Ceres 1.14.0Noetic下编译报C标准错误gcc版本太高CMakeLists中指定C14启动后日志一直停在等待话题参数文件话题名和bag不匹配用rosbag info核对话题名点云特征提取大量失败场景空旷或雷达频率不稳换有柱子、墙角、围栏的场景优化结果反复横跳数据激励不足或时长太短按4.1的运动方案重新录2分钟时延估计收敛到边界值系统时间戳漂移严重校准系统时间检查驱动时间戳结果和机械安装角差距过大IMU坐标系定义不同核对坐标系方向尝试对IMU坐标轴取反7.2 标定精度翻车排查思路标定结果“看起来能用但仔细一测就露馅”通常不是工具不行而是数据采集或坐标系约定出了偏差。安装松动是第一大杀手。设备固定螺丝没拧紧机器人动起来之后雷达和IMU相对位姿一直在变标定出来的当然是个随机值。这一点我建议每次采集前都重新拧一遍。坐标系方向没对齐也很常见。VLP-16的坐标系定义一般是x轴向前、y轴向左、z轴向上但IMU的坐标系不同厂商定义千奇百怪有的z轴向上有的z轴向下有的x轴指向后方。如果IMU的某一个轴方向和工具假设的相反标定结果里会出现一个奇怪的偏转角。遇到这种情况先检查IMU驱动手册里的坐标定义必要时在驱动层把坐标轴修正统一。时间戳抖动是另一个容易忽略的点。我遇到过IMU驱动串口波特率设置不对导致数据丢包、时间戳重复标出来的时延值特别大。用rostopic hz观察话题频率曲线如果忽高忽低先修驱动再标定。7.3 最终自检清单每次拿到标定结果我都按下面这份清单检查一遍旋转外参是否和机械安装方向大致一致平移量是否在厘米到几十厘米的可信范围时延是否落在相对稳定的合理区间rviz里点云转坐标系后没有明显重影连续标定三次结果波动在可接受范围内用一套独立于标定数据的bag验证建图效果。这六条全过了这组外参才敢往算法里放。我个人的经验是与其在出问题时反复调算法参数不如用2分钟录一段好数据、花10分钟标定一次把外参这个地基夯实。标定这东西机器不会骗你数据骗你的时候才最麻烦。后续再做LIO建图或者多传感器融合你会感谢当初把标定认真做完的自己。
返回列表