ARTICLE DETAIL

资讯详情

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

LIO-SAM激光雷达与IMU联合标定全流程实战指南

LIO-SAM激光雷达与IMU联合标定全流程实战指南 激光雷达和IMU的联合标定是每一个做多传感器融合定位的人都绕不开的一道坎。我见过太多人在这上面栽跟头——有人拿着出厂标定文件直接跑LIO-SAM建出来的图歪七扭八有人标定完了看着残差挺小一上路跑不了几百米就飘得亲妈都不认识还有人折腾了一整天最后发现是时间戳没对齐。这篇内容就是把我自己在LIO-SAM上做LiDAR-IMU联合标定的完整流程拆开揉碎讲清楚从环境准备、数据采集、参数配置到标定验证每一步都配上我踩过的坑和对应的解法。不管你是刚接触SLAM的新手还是已经用过LOAM系列但没深入搞过标定的老手都能从这里找到可以直接复现的操作路径。1. 先搞清楚LIO-SAM到底需要什么样的标定1.1 外参标定和内参标定的边界在哪里很多人一上来就说我要标定LiDAR和IMU但根本没分清自己到底需要标什么。LIO-SAM这个框架对LiDAR和IMU之间的关系有两个层面的要求外参LiDAR到IMU的旋转和平移和时间偏移两个传感器之间的时间戳差值。内参方面LiDAR的内参一般在出厂时已经标定好了IMU的内参零偏、尺度因子、轴间非正交误差通常也需要提前标定LIO-SAM本身不负责IMU内参的在线估计。外参决定了IMU测量的角速度和加速度能不能正确地投影到LiDAR坐标系下。如果外参有偏差最直接的后果就是点云配准的时候运动畸变去除不干净建出来的地图在转弯处会出现明显的重影。时间偏移的影响更隐蔽——它不会让地图立刻崩掉但会让系统在快速运动时产生持续的定位漂移而且这种漂移很难通过调参来补偿。我自己的经验是外参标定的精度要求取决于你的运动激烈程度。如果你的平台运动比较温和比如低速巡检机器人外参误差在2-3度以内基本能跑但如果是无人机或者高速移动平台外参误差超过1度就会明显影响建图质量。1.2 LIO-SAM对IMU频率和LiDAR帧率的隐性要求LIO-SAM的论文里没有明确写对传感器频率的要求但实际跑下来IMU频率低于100Hz会很难受。原因在于LIO-SAM的IMU预积分模块需要在两个LiDAR帧之间做积分如果IMU频率太低积分误差会急剧累积。我实测过200Hz和100Hz的IMU在同样的运动轨迹下200Hz的建图边缘清晰度明显更好。LiDAR帧率方面10Hz是标配但如果你用的是固态激光雷达比如Mid-360这类帧率可能更高这时候要注意LIO-SAM的mappingProcessInterval参数需要相应调整。这个参数控制的是建图模块处理点云的间隔设得太大会丢帧设得太小计算量扛不住。还有一个容易被忽略的点IMU和LiDAR的时间戳必须来自同一个时钟源。如果你的IMU是通过USB转串口接入的而LiDAR是网口接入的两者时间戳很可能有系统级的偏差。这个偏差不是固定值会随着系统负载变化而波动必须在驱动层面做时间同步。1.3 为什么出厂标定文件不能直接用这是我最想强调的一点。很多LiDAR和IMU模组出厂时会附带一个标定文件里面写了外参的初始值。这个值可以用作初值但绝对不能直接当作最终标定结果。原因有三个第一出厂标定是在理想环境下做的没有考虑你实际安装时的机械误差第二出厂标定的IMU和LiDAR坐标系定义可能和LIO-SAM要求的坐标系定义不一致直接填入会导致符号错误第三出厂标定通常只标了旋转平移部分要么没标要么精度很差。我自己的做法是把出厂标定值作为优化初值填入LIO-SAM的配置文件然后通过实际跑数据来验证和微调。如果发现建图质量不达标再用手眼标定或者基于运动的方法重新标定。2. 标定前的环境搭建与数据采集2.1 传感器驱动配置中最容易翻车的三个地方驱动配置看起来简单但这里出的问题占了标定失败的很大比例。第一个坑是IMU数据的单位。不同厂商的IMU驱动输出的角速度单位可能是rad/s也可能是deg/s加速度单位可能是m/s²也可能是g。LIO-SAM要求的是rad/s和m/s²如果单位搞错了标定出来的外参会完全不对。第二个坑是LiDAR点云的坐标系定义。LIO-SAM默认LiDAR坐标系是X向前、Y向左、Z向上但有些LiDAR尤其是某些国产固态雷达的坐标系定义是X向前、Y向右、Z向下。如果不做转换直接喂给LIO-SAM建图会上下颠倒。第三个坑是点云格式。LIO-SAM的imageProjection模块对点云格式有要求需要包含ring字段线号和时间戳字段。如果你用的是自定义点云格式需要在驱动里做转换。# LIO-SAM中IMU参数的典型配置 imuTopic: imu/data # 如果IMU输出的是deg/s需要在这里做转换 # 或者在驱动层面就转成rad/s imuAccNoise: 0.01 imuGyrNoise: 0.001 imuAccBiasN: 0.0002 imuGyrBiasN: 0.000032.2 数据采集时该走什么样的轨迹标定数据的采集轨迹直接决定了标定精度。我见过有人拿着设备在走廊里走了一圈就说标定完了这种数据标出来的外参根本不可信。正确的采集方式应该包含以下几类运动充分的旋转运动绕三个轴各转几圈、充分的平移运动前后左右各移动几米、旋转和平移的耦合运动比如走S形或者8字形。旋转运动用来激励IMU的陀螺仪平移运动用来激励加速度计耦合运动用来估计时间偏移。采集时长建议在3-5分钟太短了激励不充分太长了数据量大处理慢。采集环境最好选在结构特征丰富的地方比如有墙壁、柱子、家具的室内空间这样LiDAR的配准才有足够的约束。注意采集数据时一定要避免纯旋转运动。纯旋转时LiDAR的几何约束很弱标定容易退化。旋转和平移必须同时存在。2.3 时间同步标定成败的隐形杀手时间同步这个问题我在前面提了一嘴这里展开说。LIO-SAM内部有一个odometrySurfLeafSize参数和imuQueLength参数这些参数都和时间有关。如果IMU和LiDAR的时间戳偏差超过10ms标定结果就会明显变差。检查时间同步的方法很简单录一段数据包用rosbag info看两个topic的时间戳范围然后手动对比同一时刻的数据。更精确的方法是用rqt_plot把IMU的角速度和LiDAR的帧时间画在一起看运动突变点是否对齐。如果发现时间不同步解决方案有两个一是在驱动层面做硬件触发同步需要传感器支持二是在录包之后用软件做时间对齐比如用rosbag filter做时间偏移补偿。我推荐第一种方案因为软件对齐会引入额外的误差。3. LIO-SAM标定参数配置的完整拆解3.1 外参矩阵的填写规则与常见符号错误LIO-SAM的配置文件里外参是以extrinsicRot和extrinsicTrans两个参数给出的。extrinsicRot是一个3x3的旋转矩阵extrinsicTrans是一个3x1的平移向量。这两个参数描述的是IMU坐标系到LiDAR坐标系的变换。这里最容易出错的地方是旋转矩阵的方向。有些人会搞反填成LiDAR到IMU的变换。判断方法很简单如果你把IMU的测量值通过这个旋转矩阵变换到LiDAR坐标系后发现Z轴方向反了那就是方向搞反了。# LIO-SAM外参配置示例 extrinsicRot: [1, 0, 0, 0, 1, 0, 0, 0, 1] extrinsicTrans: [0.0, 0.0, 0.0]上面这个配置表示IMU和LiDAR坐标系完全对齐且没有平移。实际使用中你需要根据你的安装方式填入正确的值。如果你不确定可以先填单位矩阵和零平移跑一遍数据看看建图效果然后根据偏差方向逐步调整。3.2 IMU噪声参数怎么设才合理LIO-SAM的配置文件里有四个IMU噪声参数imuAccNoise、imuGyrNoise、imuAccBiasN、imuGyrBiasN。这四个参数直接影响了IMU预积分的权重设得不合理会导致系统过于信任IMU或者过于信任LiDAR。imuAccNoise和imuGyrNoise是测量噪声的标准差可以从IMU的数据手册里查到。如果查不到可以用Allan方差工具自己标定。imuAccBiasN和imuGyrBiasN是零偏随机游走噪声这两个参数比较难标定一般用经验值。我的经验是如果建图时发现地图在IMU数据剧烈变化时出现明显扭曲说明IMU噪声参数设得太小了系统过于信任IMU。反之如果地图在LiDAR特征稀疏的区域漂移严重说明IMU噪声参数设得太大了。3.3 关键参数之间的耦合关系LIO-SAM的参数不是独立的它们之间有耦合关系。比如mappingProcessInterval和surroundingKeyframeDensity这两个参数就相互影响。前者控制建图频率后者控制关键帧的密度。如果建图频率很高但关键帧密度很低会导致计算资源浪费反之则会导致地图更新不及时。还有historyKeyframeSearchRadius和historyKeyframeFitnessScore这一对参数它们控制回环检测的搜索范围和匹配阈值。搜索半径设得太大会增加计算量设得太小会漏掉回环。匹配阈值设得太严格会拒绝正确的回环设得太宽松会引入错误的回环。我一般会先用默认参数跑一遍然后根据建图效果有针对性地调整。不要一上来就大改参数那样你根本不知道是哪个参数起了作用。4. 标定结果的验证与迭代优化4.1 用建图质量反推标定精度标定完了怎么知道标得准不准最直接的方法就是看建图质量。如果外参标定准确建出来的地图应该是清晰的、没有重影的。如果外参有偏差地图在转弯处会出现明显的重影或者拖尾。具体来说你可以找一个有明确几何特征的环境比如方形的房间建完图之后测量地图中墙壁的厚度。如果墙壁厚度明显大于实际厚度说明外参有偏差。偏差越大墙壁越厚。另一个方法是看Z轴方向的漂移。如果外参的俯仰角或者横滚角有偏差建出来的地图在长距离行驶后会出现明显的Z轴漂移。你可以把地图保存成PCD文件然后在CloudCompare里测量起点和终点的高度差。4.2 基于运动一致性的定量评估方法除了看建图质量还可以用定量的方法来评估标定精度。我常用的是运动一致性检验把LIO-SAM输出的里程计轨迹和IMU积分出来的轨迹做对比看两者的偏差是否在合理范围内。具体操作是录一段数据分别跑LIO-SAM和纯IMU积分然后把两条轨迹画在一起。如果外参准确两条轨迹应该基本重合短时间内。如果外参有偏差两条轨迹会出现系统性的偏离。还有一种方法是闭环误差检验让设备走一个闭合的回路看LIO-SAM输出的起点和终点是否重合。闭环误差越小说明标定越准确。一般来说走一个10米x10米的方形回路闭环误差在0.1米以内算合格。4.3 标定参数微调的实操技巧如果你发现标定结果不够好需要微调参数我建议按照以下顺序来第一步先调时间偏移。时间偏移的影响最大而且最容易调。你可以手动在配置文件里加一个时间偏移量然后看建图质量是否改善。时间偏移的调整步长建议从1ms开始逐步增大。第二步调外参的旋转部分。旋转部分的影响比平移部分大。你可以先调俯仰角和横滚角再调偏航角。每次调整1-2度观察建图质量的变化。第三步调外参的平移部分。平移部分的影响相对较小但如果你的IMU和LiDAR安装距离比较远比如超过20厘米平移部分就不能忽略。第四步调IMU噪声参数。这一步放在最后因为噪声参数的影响比较微妙需要在前三步都调好之后才能看出来。提示每次只调一个参数调完之后重新跑一遍数据记录建图质量的变化。不要一次调多个参数否则你无法判断是哪个参数起了作用。5. 那些让我熬夜的坑和对应的解法5.1 建图飘到怀疑人生的排查链路有一次我标定完之后跑数据建出来的地图飘得完全不能用。排查过程是这样的首先检查时间同步。用rosbag info看了两个topic的时间戳发现IMU的时间戳比LiDAR早了大约50ms。这个偏差在驱动层面没有处理导致LIO-SAM在预积分时用错了时间窗口。然后检查外参。把外参矩阵单独拿出来用MATLAB做了个可视化发现旋转矩阵的行列式是-1说明矩阵填错了正常旋转矩阵的行列式应该是1。最后检查IMU噪声参数。发现imuAccNoise设成了0.001比实际噪声小了10倍导致系统过于信任IMU。这三个问题解决之后建图质量立刻恢复正常。所以排查问题一定要有系统性不要东调一下西调一下。5.2 IMU坐标系定义不一致引发的诡异现象不同厂商的IMU坐标系定义差异很大。有些IMU的X轴向前、Y轴向左、Z轴向上和LiDAR一致有些IMU的X轴向前、Y轴向右、Z轴向下和LiDAR相反。如果你的IMU是后者而你在配置文件里没有做转换建图会出现非常诡异的现象地图在直线行驶时看起来正常但一转弯就完全崩掉。判断方法很简单把IMU静止放置看加速度计的Z轴输出。如果Z轴输出是9.8 m/s²说明Z轴向上如果是-9.8 m/s²说明Z轴向下。根据这个来判断是否需要做坐标转换。5.3 点云运动畸变去除不干净的根因分析LIO-SAM的imageProjection模块负责去除点云的运动畸变。如果外参或者时间偏移有偏差运动畸变去除就会不干净表现为地图边缘模糊或者有重影。我遇到过一次特别隐蔽的情况外参和时间偏移都没问题但运动畸变就是去不干净。后来发现是LiDAR驱动输出的点云时间戳精度不够只精确到毫秒。而LIO-SAM需要微秒级的时间戳来精确计算每个点的运动补偿。换成高精度时间戳的驱动之后问题解决。这个坑的教训是不要忽视驱动层面的细节。很多时候问题不在算法本身而在数据质量。5.4 不同场景下的参数适配经验最后分享一些不同场景下的参数适配经验。室内小场景比如办公室、实验室对参数不敏感默认参数基本能跑。室外大场景比如园区、街道对参数比较敏感需要仔细调historyKeyframeSearchRadius和historyKeyframeFitnessScore。高速运动场景比如无人机、高速车辆对时间同步和外参精度要求极高建议做硬件时间同步并且用高精度的标定方法比如基于优化的手眼标定。低速运动场景比如巡检机器人、AGV对参数要求相对宽松但要注意IMU的零偏稳定性零偏太大的IMU会导致长时间运行后漂移。我个人在实际操作中的体会是标定不是一劳永逸的事情。每次重新安装传感器、每次更换硬件、甚至每次剧烈碰撞之后都需要重新检查标定参数。养成定期验证标定的习惯能帮你省下大量排查问题的时间。
返回列表