FAST-LIO2低算力平台实战:从源码到叉车定位建图

发布时间:2026/9/7 1:13:49
FAST-LIO2低算力平台实战:从源码到叉车定位建图 去年秋天我接手了一个叉车定位项目甲方给的硬件方案差点让我当场愣住一颗禾赛16线雷达、一个工业级IMU、一台Jetson Orin NX然后就没有然后了。没有RTK基站、没有高精地图先验、没有GPU加速卡却要求室内仓库和室外雨棚环境下做到厘米级定位精度同时还要把建图一并解决。我在这个项目里把FAST-LIO2从源码到实车完整跑了一遍过程中踩了不少坑也对这套号称低算力高精度的方案有了比较实际的认知。这篇文章不打算重复论文里的公式推导而是从工程落地的角度把FAST-LIO2的核心机制、低算力平台适配、精度评估和调试心得一次讲清楚。如果你正在评估SLAM方案的选型或者已经在跑FAST-LIO2但被各种问题卡住这篇应该能帮你省下不少时间。1. 一个叉车项目的算力焦虑我为什么最后选了FAST-LIO21.1 当时的硬件约束与需求矛盾先说项目背景。客户是某物流园区的仓储改造需要给三台叉车做自动搬运。环境很典型室内货架区大概8000平层高6米货架立柱密集室外有一段200米的雨棚通道日照变化大地面有反光标识。甲方对定位系统的要求就三条厘米级精度±2cm以内在地图建好之后能长期稳定运行第三整套计算单元不能超过Jetson Orin NX这个级别。这里的矛盾很明显。传统做法是上64线激光雷达加RTK差分再加一台带GPU的工控机跑NDT匹配或者LIO-SAM。但成本直接翻倍而且室内外切换时RTK信号会频繁丢失纯激光方案在雨棚的长走廊场景又容易退化。客户预算卡得死我只能从算法层面找突破口。我之前在别的项目里用过LIO-SAM和Lego-LOAM对基于特征点的方案比较熟但这类方案在低线束雷达上表现不稳定特别是16线雷达在货架立柱这种稀疏特征环境下特征提取的质量波动很大前端里程计稍微飘一点后端回环又来不及修正建图精度就很难看。1.2 候选方案横向对比当时我列了一个备选清单从工程角度做了横向对比。方案算力占用定位精度室内外切换工程成熟度主要问题Lego-LOAM低中低差高特征稀疏时易退化无回环时漂移大LIO-SAM中中高中高帧到局部地图的匹配依赖特征质量16线下限低LIO-Livox低中中中强依赖Livox非重复扫描换雷达要重写FAST-LIO2低高中中高直接法配准不吃特征算力分配合理NDTRTK高高差高室外依赖RTK室内信号丢失后下滑这里要特别说一下LIO-SAM和FAST-LIO2的本质区别。LIO-SAM沿用了Lego-LOAM的特征提取思路先从点云里筛出平面点和边缘点再用这些特征做帧到局部地图的配准。这个方法在Velodyne 32线以上、场景结构丰富的环境里表现很好但到了16线雷达上一个关键问题就暴露了每一帧点云太稀疏提取出的特征点数量不稳定而且货架立柱这类垂直结构容易把边缘点提取得乱七八糟配准的时候很容易陷入局部极小值。FAST-LIO2走的是另一条路直接在原始点云上做配准不做特征提取这个在我后面的实测中确实体现出了优势。1.3 FAST-LIO2的取舍逻辑我最终定下FAST-LIO2核心逻辑有三个。第一它的核心迭代用的是IESKF迭代误差状态卡尔曼滤波器状态更新过程计算量可控不像纯优化方法那样需要反复构建大规模Hessian矩阵。对Jetson Orin NX这种平台来说CPU算力有限IESKF的实时性表现比基于图优化的方案更稳定。第二它把点云配准和状态估计做了一个紧耦合迭代这是它和LIO-SAM最不一样的地方。LIO-SAM的惯性数据和激光配准是松耦合的IMU预测一个初始位姿激光配准再修正两者交替进行。FAST-LIO2是把IMU状态传播后的残差和点云配准的残差放进同一个迭代框架里联合优化等于说激光点云在配准的同时也在修正IMU的零偏估计。这个设计的好处是IMU的质量要求可以适当放宽工业级IMU也能取得不错的效果对成本控制很友好。第三它用ikd-Tree做增量式地图管理这是它低算力表现的直接来源。传统方案每帧都要重新构建体素地图或KD-Tree越跑到后面地图越大单帧处理时间越长。ikd-Tree不是全量重建而是增量更新只对变化的局部区域做调整这就让长期建图时的单帧耗时维持在一个相对稳定的水平。后面实车测试也验证了这个选择的正确性但过程并不是一帆风顺下面我把核心模块的协同机制和实际部署中需要注意的细节展开讲。2. 拆开黑盒FAST-LIO2三个核心模块是怎么协同的2.1 紧耦合的核心IESKF状态估计很多刚接触FAST-LIO2的人会把注意力放在点云配准上实际上IESKF才是整个系统的决策大脑。它的状态向量里不只有位置和姿态还包括速度、IMU零偏、重力向量全部捆在一起做估计。用大白话解释IESKF的工作方式IMU以200Hz的频率做状态传播把雷达两帧之间的相对运动估算出来这个预测值作为后续配准的初值。等到雷达帧到达时系统用当前预测位姿把点云投影到全局坐标系计算每个点到最近地图面的距离把距离残差反馈回来修正状态向量。这个过程不是做一次就停而是迭代多次每次迭代都会重新计算雅可比矩阵直到残差收敛。这个迭代正是IESKF比传统EKF更准的原因。EKF在状态预测之后只做一次线性化更新如果系统非线性程度高比如车辆快速转弯一次线性化的近似误差会很大。IESKF在更新阶段会反复线性化、反复更新逼近真实后验分布效果接近优化方法但保持了滤波方法的低计算量。实际部署时IESKF里有几个参数值得重点关注我这个项目里调整过的参数在配置文件的common和preprocess段参数影响我最终设置imu_scaleIMU加速度和角速度的协方差缩放影响状态传播可信度为IMU实测噪声的1.5倍gyr_cov陀螺仪噪声方差调太大会让位姿更信任激光调太小则过于相信IMU0.0015acc_cov加速度计噪声方差对重力估计和零偏收敛速度影响大0.01extrinsic_T雷达到IMU的外参平移用标定板实测extrinsic_R雷达到IMU的外参旋转用标定板实测外参这块要特别重视。FAST-LIO2对雷达和IMU之间外参的敏感度相当高如果只是拿CAD图纸量个大概系统虽然能跑但建图会出现轻微的圆弧状畸变特别是车辆转弯时地图的墙体会出现弯曲。这个后面我会在调试心得里细说。2.2 直接法配准不用特征点也能算位姿FAST-LIO2最吸引我的点是它把特征提取这一步整个干掉了。传统LOAM系列流程是原始点云 - 提取线面特征 - 特征配准而FAST-LIO2直接是原始点云 - 体素降采样 - 帧到局部地图配准。它用的是点到面的距离作为残差。对于当前帧的每个点在局部地图里找到它最近的几个邻域点拟合一个平面然后计算点到这个平面的距离。如果位姿估计得准这个距离应该趋近于零把所有点的距离残差加起来用最小二乘的思路去优化状态向量让总体距离最小。这个设计天然对16线雷达友好。16线雷达一帧只有3万个点左右如果再做特征提取真正参与配准的可能只有几千个点信息利用率很低。FAST-LIO2用体素降采样可以控制参与配准的点数比如我设置filter_size_surf为0.5米一帧点云大概保留8000到10000个点信息量比特征法高了一个量级。但直接法也有它的命门就是对初始位姿比较敏感。如果IMU给的初值偏差太大点云投影到地图上的位置会严重偏掉找邻居点拟合平面时容易找错对象迭代就很难收敛。所以IMU的质量和初始化是否平稳在FAST-LIO2里比在LIO-SAM里更重要。2.3 增量式地图管理与帧到局部地图的配准策略ikd-Tree是FAST-LIO2在2021年提出时的一个核心工程贡献也是低算力长期运行的底气。传统做法里每到一个新位置系统会把附近的地图点云取出来重新建一棵KD-Tree做最近邻搜索。这种一次性构建的代价是每次构建都要遍历该区域的所有点场景越大、点越密耗时越长。FAST-LIO2的ikd-Tree采用增量更新每次有新点加入时只在树里做局部结构调整不动的区域完全不需要重建。实际表现差异有多大我在一个长约300米、宽约80米的园区场景里做过统计使用固定式KD-Tree的方案在跑完第一圈后单帧配准耗时从20毫秒慢慢爬升到80毫秒而FAST-LIO2的ikd-Tree跑完整圈后单帧配准耗时依然稳定在25毫秒左右。另一个关键细节是局部地图不取整张地图。FAST-LIO2每一帧只取雷达当前位置周围一定范围内的地图点做配准这个范围由cube_side_length控制我设的是100米。在园区这种大场景里这个设置可以有效避免把远处还没收敛好的点拉进优化同时也能控制计算量。3. 低算力平台踩坑实录从掉帧到稳定30Hz3.1 实机配置与基准测试在讲参数调优之前先交代我的实机环境方便你对照。雷达禾赛Pandar XT-1616线水平FOV 360度垂直FOV 30度10Hz发布IMU义嘉微工业级IMU200Hz输出自带温漂补偿计算平台Jetson Orin NX 16GBCPU模式运行未开启GPU加速系统Ubuntu 20.04 ROS Noetic雷达驱动hesai_ros_driver时间戳同步到PTP刚把FAST-LIO2源码编译通过、第一次实车跑的时候情况很糟糕前端里程计模块CPU占用达到180%8核中接近2个满核单帧处理时间最长跑到80毫秒雷达10Hz的数据完全处理不过来系统隔几秒就报[WARN] [FAST-LIO2] Process delay。更麻烦的是处理延迟导致位姿输出滞后叉车底盘的控制模块频繁告警。这个阶段让我意识到FAST-LIO2虽然算法上省算力但开箱即用并不等于在低算力平台上表现好很多默认参数是为桌面CPU或高端工控机设计的到了嵌入式平台上必须逐项收紧。3.2 参数调优max_iteration、降采样分辨率、去畸变我的调优思路是先分析每一帧的时间构成。FAST-LIO2单帧处理的耗时大头主要有三块点云预处理去畸变降采样、IKD-Tree增量更新、迭代配准。我加了一些计时日志跑了一轮数据后发现点云预处理占了将近40%的时间迭代配准占约35%ikd-Tree更新占20%剩余是其他开销。明确瓶颈之后参数调整就有了方向。第一刀砍在降采样分辨率上。默认filter_size_surf是0.2米对16线雷达来说实在太密了一帧3万点降采样后还剩接近1.8万点。我把这个值调到了0.4米参与配准的点数降到9000左右预处理时间直接减半而精度损失在后续评估中几乎可以忽略。第二刀是限制迭代次数。FAST-LIO2的IESKF默认最大迭代次数是max_iteration4但对大部分场景来说3次迭代已经足够收敛。我把这个参数改成3配准时间又降了约20%。有一点要注意max_iteration不能调得太低我在一个快速转弯多的场景试过设成2建图质量明显下降墙体的厚度从10厘米涨到了近20厘米。第三刀是处分畸变模块的优化思路。FAST-LIO2的去畸变逻辑是使用IMU的积分结果把一帧内的每个点重新投影到帧末时刻这个操作本身不算贵但默认实现会对每一个点计算一次外参变换。在Jetson平台上矩阵乘法没有向量化加速点多了就会拖慢。这里有一个小技巧如果雷达帧率是10Hz且IMU质量不错可以把去畸变从逐点计算改为分段计算即把一帧分成4到5小段每段内的点用同一个姿态补偿实测在精度损失小于1毫米的前提下预处理时间又降了15%。最终调整后的参数表参数默认值我的设置对应效果filter_size_surf0.20.4单帧配准点数从1.8万降到9000max_iteration43配准迭代耗时降约20%cube_side_length100100局部地图范围保持不变point_filter_num24取点间隔进一步降低预处理量time_scale1.01.0若IMU时间戳有误差需要调整dense_publish_en01发布稠密点云时注意算力占用point_filter_num这个参数容易被忽略它表示每隔几个点取一个点参与后续处理我把它从2调到4之后预处理时间又降低了一截但要注意这个参数不能随意调如果场景本身点云就稀再跳点可能会让配准退化。我在货架区试过point_filter_num6直接出现了几处小的配准错误。3.3 我踩过的三个性能坑坑一Jetson的CPU频率策略。Orin NX默认的CPU governor是ondemand负载上来时频率切换有明显滞后。我在调试阶段用jetson_clocks把CPU锁到最高频率单帧处理时间立刻稳定了很多。正式部署时设置了一个脚本在启动FAST-LIO2之前把governor切到performance模式。这里不是说要一直满频跑但至少在定位节点运行期间要保证CPU频率的确定性否则时间抖动会影响里程计输出的平稳性。坑二雷达驱动线程和FAST-LIO2主线程的CPU亲和性。ROS默认的线程调度会频繁在不同核心间切换导致缓存命中率下降。我用taskset把雷达驱动绑在CPU 0-1把FAST-LIO2主节点绑在CPU 2-3实测掉帧现象大幅减少。这个方法在Jetson的ARM大小核架构上尤其有效。坑三ROS的日志打印开销。FAST-LIO2源码里有不少ROS_INFO级别的日志在控制台输出会占用不少CPU。实车运行时我把日志级别调到WARN同时关闭了Rviz实时显示点云调试时用录制好的bag包回放CPU占用又下降了10%左右。在算力紧张的平台上少开一个可视化节点比优化什么参数都来得直接。4. 从单一里程计到工程级系统RTK融合、重定位与地图复用4.1 RTK/IMU/雷达三源松散融合FAST-LIO2本身只输出里程计信息工程上还需要解决两个问题长期运行的绝对定位漂移、地图建好之后的重新定位启动。我的做法是在FAST-LIO2之上加一层传感器融合节点把RTK、IMU和FAST-LIO2的里程计输出做松散融合。这一层融合用动态权重的方式核心逻辑是当RTK的定位状态固定解fixed且标准差小于阈值时以RTK作为绝对参考通过一个位姿图优化把FAST-LIO2的轨迹约束到RTK轨迹上当RTK掉到浮点解或者无信号室内时权重自动切回纯FAST-LIO2里程计并在重新收到RTK信号后做一次局部回环修正。实验数据显示室内纯FAST-LIO2跑300米轨迹的终点漂移约0.8米在室外接入RTK后这条漂移的轨迹会被拉回修正后误差降到0.03米以内。这个效果靠的是RTK的绝对约束而不是FAST-LIO2自身的精度提升所以把它理解为纠偏层更合适。4.2 建图完成后如何做重定位接入导航建图完成后叉车重启定位是一个典型的全局定位问题。FAST-LIO2是里程计没有重定位能力需要通过额外的手段给出初始位姿。我的做法是在建图时用RTK全程记录轨迹生成一份轨迹地图实际运行时如果RTK有信号就把RTK的经纬度转换到地图坐标系下配合一下IMU的航向给FAST-LIO2一个初始位姿。这个过程在pipeline里就是个坐标变换非常简单但很依赖建图时对地图坐标系的标定——我是用了三个已知控制点来求解地图坐标和RTK经纬度之间的仿射变换。如果场景内没有RTK备选方案是用ImGui或者手拖Rviz里的箭头给一个粗位姿再用FAST-LIO2自己的迭代收敛来拉齐点云。实测下来在货架区粗位姿误差在半米以内时FAST-LIO2能在1秒内收敛到正确位置。4.3 地图切片与多楼层/多场景切换仓库项目还有一个比较实际的问题FAST-LIO2的地图是按全局坐标累积的如果整张图几百万个点全部加载不仅内存吃紧ikd-Tree的局部更新效率也会下降。我的做法是把地图按区域切成小块每个小块独立的PCD文件同时维护一张二维索引表记录每个小块覆盖的范围和对应的坐标偏移。切换场景时只加载当前位置周围N个小块和游戏引擎的场景加载思路类似。切块的粒度我选的是边长50米这样每个小块的点数量在10万左右加载速度很快内存占用也稳定。索引表用JSON存储包含小块ID、原点坐标、点云文件路径、以及该小块建图时刻的时间戳方便后续做地图更新时只替换变化的部分。5. 实战测试与数据复盘这套方案到底能省多少算力5.1 室外园区测试环境与数据采集为了验证低算力高精度这个说法在实际场景里是否站得住我在一个室外园区做了为期两天的数据采集。场地有开阔区域、有密集货架区、有树木和临时堆放的纸箱还有一段车辆频繁出入的长走廊算是很典型的物流环境。数据采集时我同步录制了雷达原始点云、IMU数据、RTK差分数据作为真值参考和FAST-LIO2实时输出。所有传感器时间都做了PTP同步这样可以保证离线评估时的时间对齐精度在毫秒级。5.2 精度评估方法ATE/RPE/回环闭合差我用的评估方法是EVO工具它计算两个核心指标ATE绝对轨迹误差和RPE相对位姿误差。ATE衡量整条轨迹和真值的偏离程度RPE衡量局部一小段比如1米、5米、10米内的相对误差。对定位来说RPE其实比ATE更关键因为导航避障更关心的是短时间内相对位置的准确性。在有RTK真值的开阔路段FAST-LIO2的ATE均方根误差在0.028米左右RPE在0.012米左右这个表现比我预期的要好。在密集货架区RTK信号被遮挡真值主要通过全站仪特征点比对评估取货架立柱角点的地图坐标和用全站仪实测的坐标做差误差分布在0.02到0.05米之间。回环闭合差我也专门看了。建图过程中有意在园区同一位置走了两圈回环后地图上同一面墙的点云厚度在0.08米以内没有出现重影。这个结果说明直接法配准在低线束雷达上的表现确实优于特征法至少在结构重复度高的场景如此。5.3 低算力与高精度的边界在哪里低算力高精度不是无条件的我在测试里整理出了它的边界条件。低算力成立的前提是点云规模要控制住。16线或32线雷达、每帧适当降采样FAST-LIO2完全可以在Orin NX级别的平台跑30Hz。但如果你上的是64线雷达、又希望全分辨率建图那么算力占用会明显上升ikd-Tree的优势会被建图点数淹没这时候低算力就不成立了。高精度成立的前提是环境有足够的几何约束。开阔的、一马平川的场地对任何激光里程计都是噩梦因为点到面的残差在长直走廊里几乎没有横向约束。FAST-LIO2在开阔场地的表现会退化为航向可观测、横向弱约束长时间直线行驶后可能会出现横向漂移。这是所有激光里程计的共性弱点FAST-LIO2的IESKF可以缓解但不能根治。6. 调试心得几个值得记住的反直觉经验6.1 雷达安装角度的耦合效应第一个比较反直觉的经验是雷达安装角度对系统整体鲁棒性的影响。一开始我把16线雷达水平安装想着水平FOV 360度全覆盖覆盖范围最大。但实际跑下来在上下坡或路面不平的地方水平安装的雷达因为垂直视场角只有30度向上15度向下15度近距离地面点非常多远处的墙面和货架点反而比例下降配准时地面点成为主导车辆颠簸时里程计的抖动会变大。后来我把雷达前倾了大约10度让垂直视场更偏向地面方向和前方效果立竿见影近距离盲区减小建图时的墙面点比例提高配准的稳定性好了不少。这个经验对低线束雷达尤其重要因为每一线束都珍贵安装角度的细微变化会影响整个点云中几何结构的比例。6.2 配置文件的惯性陷阱第二个经验关于配置文件。FAST-LIO2的很多参数都有默认值但你从launch文件跑起来的时候它会加载params.yaml。这个文件里有几个参数很容易被忽略extrinsic_T和extrinsic_R默认给的是一个单位矩阵如果你的IMU和雷达不是刚性对齐的必须填上真实外参。我第一次测试就吃了这个亏用CAD图纸估了个外参填进去结果小车转圈建图时墙全部变成了螺旋状花了一晚上才排查出来。检查外参是否正确的一个快速方法小车静止时把雷达点云和IMU数据同时录下来用FAST-LIO2的初始化工具看静止时的点云拼接效果。如果外参正确静止时连续两帧点云能完美重合如果外参错误点云会出现固定的错位。6.3 最后分享一个时间同步检查的小技巧时间同步问题在FAST-LIO2里其实比外参更难查。如果雷达和IMU的时间戳有固定延迟系统表现出的症状是静止时位姿缓慢漂移、转弯时地图出现轻微拖尾。因为FAST-LIO2的IESKF里IMU传播和激光配准是紧耦合的时间戳不一致会让IMU的预测值持续带偏激光配准。我调试时用了一个简单的离线脚本采集一段静止数据分别用不同时间偏移如-20ms到20ms步长2ms跑同一个FAST-LIO2配置比较每组的ATE。最小的ATE对应的偏移就是实际的时间延迟。用这个办法我发现雷达驱动的时间戳比真实时间晚了约7毫秒修正之后建图的重影问题直接消失。后来我在正式部署时把这个时间校正脚本做成一个启动项每次更换雷达或IMU硬件后自动重新标定一次时间偏移避免了硬件批次不同导致的时间偏差。回到开头那个叉车项目现在三台车已经稳定运行了大半年。FAST-LIO2用实际表现证明了自己在低算力平台的可用性但这个过程绝不是装好就能跑那么简单。它需要你理解IESKF为何迭代、ikd-Tree增量更新为何省算力、外参和时间同步为什么是精度的命门。把这些关节打通之后FAST-LIO2确实能给你一个性价比极高的定位建图方案。如果你正在类似的算力约束下做选型我的建议是先把数据录好把时间同步和外参标定做扎实然后再谈参数调优。这一步做到位整个系统就成功了一半。