拓冰建站拓冰建站
首页 / 资讯中心 / 正文

多传感器融合定位:从GNSS/IMU到卡尔曼滤波与因子图的工程实践

1. 为什么我劝你不要迷信任何一种单一传感器做定位做到第三年的时候我第一次在真实场景里同时跑起激光雷达、IMU、RTK和轮速计。那辆改装过的测试车绕着园区转了三圈屏幕上轨迹稳定得让人想截图发朋友圈但第四圈刚拐进一栋钢结构仓库背后时RTK信号图标闪烁了三下直接变灰激光雷达的点云里全都是扬尘IMU因为车辆在搓板路上持续颠簸加速度计数值一路狂飙——这时候我意识到所谓定位本质上不是“哪个传感器更准”的问题而是“当所有传感器都不可信时你还能不能保持稳定”。多传感器融合定位简单说就是把多个来源的定位信息组合在一起通过算法取长补短得到一个比任何一个单独传感器都更可靠、更连续、更高精度的位置估计。它解决的核心痛点是现实中没有任何一种定位手段能在所有环境下保持同一水平的精度和可靠性。GNSS在开阔地带能到厘米级但进了隧道就是废铁IMU不依赖外部信号但漂移是它的宿命激光雷达在结构化环境建图效果一流可遇到动态障碍物密集的闹市区匹配失败是家常便饭。融合的本质就是用“互补”去压制“短板”。这篇内容适合三类人一是刚进入自动驾驶、机器人、无人系统领域的工程师需要对整个融合定位的大框架有清晰认知二是已经在做感知或建图想把定位链路从单传感器升级到多传感器方案的研发人员三是准备做技术选型的管理者或架构师需要搞明白融合定位在真实项目中到底能带来什么又需要付出什么代价。这里先给你们一颗定心丸融合定位没有想象中那么高不可攀但也没有Demo里那么光鲜亮丽。工程落地的难点通常不在算法公式本身而在数据同步、时空对齐、异常处理这几个“脏活”上。后面我会把这几个点逐一拆开讲。2. 先把家底摸清三大类传感器各自的脾气和边界2.1 GNSS与RTK精度高但极其“看脸色”GNSS全球导航卫星系统在融合定位里的角色通常是提供全局绝对位置约束。消费级模块精度在米级配合RTK实时动态载波相位差分技术后可以达到厘米级。这里想多说一句RTK的原理基准站把载波相位观测值和坐标通过差分数据链发给移动站移动站利用双差模型消掉卫星钟差、电离层延迟等大部分公共误差然后通过整周模糊度固定来求解精确位置。听起来很顺滑但RTK有一个致命前提——必须连续锁定足够的卫星并且基准站与移动站之间的差分改正数链路要稳定。我实测过的典型场景是城市高架桥下方、两侧高楼林立的窄街、隧道入口处以及山区树荫遮挡严重的盘山公路。这些地方RTK的固定率会断崖式下降甚至直接浮点解、单点解定位输出跳变几厘米到几十厘米不等。如果你只看RTK输出的经纬度不做任何状态判断融合系统很容易被带偏。2.2 IMU无外部依赖但误差随时间滚雪球IMU惯性测量单元由加速度计和陀螺仪组成通过对加速度两次积分得到位移对陀螺仪积分得到姿态。它最大的价值是高更新率常见200Hz-1000Hz和短时高精度在两帧GNSS或激光雷达之间提供密集的位姿增量。但它的核心问题是误差累积——陀螺仪零偏、加速度计零偏、比例因子误差、温度漂移、安装失准角这些误差每一项单独看都是“小问题”可一旦积分就会变成随时间膨胀的位置漂移。一个典型的MEMS级IMU静止放置10分钟纯惯性推算出来的位置可能漂到几百米甚至几公里外。在融合定位架构里IMU一般不直接作为位置信息来源而是作为**“运动模型”和帧间传递的桥梁**。它告诉你“这一小段时间内系统是怎么动的”至于“动到了哪里”由其他传感器来纠正。2.3 激光雷达与相机能定位但离不开环境特征激光雷达通过扫描周围环境获取三维点云配合高精地图或实时局部地图匹配比如NDT、ICP算法能构建出厘米级的位姿估计。相机的视觉定位VIO/Visual SLAM则通过特征点提取与匹配实现相对定位对纹理丰富的环境适应良好且设备成本比激光雷达低一个数量级。这两类传感器本质上都是“特征依赖型”激光雷达在几何特征明显的场景隧道、地下车库、厂房表现惊艳但在空旷道路或雨雪天气下点云退化、噪点激增匹配精度急剧下降相机在白天纹理丰富的场景表现不错可一旦逆光、夜晚、白墙走廊或者快速运动造成运动模糊特征数量不够位姿解算直接就崩了。2.4 额外补充轮速计与地图匹配的“潜在成员”除了上述几类工程上常用的还有轮速计编码器。它通过车轮转数和轮径模型推算车速和航向增量在低速、无滑移的室内移动机器人上是稳定支柱但在高速变道、轮胎打滑时模型误差会显著放大需要融合系统实时评估其置信度。在车规级融合定位里地图匹配跟高精地图里的车道线、杆状物、路沿进行匹配也常作为一项独立输入参与融合。它是视觉/激光定位的“结构化变体”能把定位结果从“点在哪”进一步约束到“车在哪条车道哪条轨迹上”对车道级导航意义重大。3. 融合定位的底层逻辑从“投票表决”到“状态估计”3.1 为什么简单的加权平均不是好方案很多人刚开始接触融合定位时第一反应是既然GNSS准一点、IMU稳一点那我加权平均一下不就行了问题是你这个权重怎么定不同环境下传感器精度动态变化——GNSS在开阔地可能误差2cm进了城区就变成50cm甚至更大IMU静止时的短时推算非常准但跑起来之后误差随距离增长激光雷达在隧道里一切正常但如果旁边开过一辆大货车半个点云都是动的匹配出来的位姿可能会有一个瞬间的大跳变。静态权重根本表征不了这种动态变化的置信度。所以多传感器融合定位真正的核心是状态估计而不是简单的加权平均。它把定位问题建模成一个概率问题我们有一组状态量位置、速度、姿态、甚至传感器零偏有一组观测方程把传感器读数映射到这些状态量上融合算法要做的是在噪声模型通常是高斯的假设下寻找最有可能的状态序列。3.2 松耦合、紧耦合和半紧耦合到底指什么先理清几个高频词松耦合Loosely Coupled每个传感器先独立计算出定位结果比如GNSS输出经纬度视觉定位输出位姿IMU输出增量融合算法在这些“结果层”进行组合。优点是结构清晰、模块解耦、计算量小、容错性强缺点是误差已经经过了前端处理信息损失较大而且单个传感器前端一旦输出异常值融合层必须自己想办法识别。紧耦合Tightly Coupled融合算法直接使用传感器的“原始观测”或准原始观测比如GNSS的伪距、载波相位视觉的特征点重投影误差IMU的原始加速度/角速度在同一个优化问题里联合估计状态。精度上限更高尤其在卫星信号部分遮挡或视觉特征短暂缺失的场景下紧耦合可以更好利用残存信息撑住系统。但代价是复杂度、计算量、调试难度显著上升。半紧耦合介于两者之间常见做法是GNSS使用RTK解算出的位置作为观测同时保留伪距/多普勒等中间量或者IMU与GNSS做紧耦合而视觉/激光在结果层融合进去。工程实践里我给你们的建议是没有绝对的最优架构只有和你的算力水平、传感器质量、现场环境最匹配的架构。最开始做原型验证时先用松耦合打通链条把数据同步、传感器标定、异常处理这些基本功练好再逐步演进到紧耦合。一上来就怼紧耦合很多时候不是死在算法上而是死在棘手的数据对齐和噪声建模上。4. 从贝叶斯滤波到因子图——核心算法族谱融合定位并非一个算法通吃所有场景核心算法大致可以分成三支以卡尔曼滤波为代表的贝叶斯滤波家族、以图优化因子图为代表的批量优化家族、以机器学习为代表的数据驱动方法。4.1 卡尔曼滤波一切从“高斯线性”起步卡尔曼滤波KF的适用前提是系统方程和观测方程都是线性的噪声服从高斯分布。它维护一个均值向量和协方差矩阵通过预测利用运动模型和更新融合观测两步迭代递推。优点是非常轻量、计算量极小、适合嵌入式实时运行。但真实定位系统的状态方程和观测方程几乎都是非线性的。于是有了扩展卡尔曼滤波EKF——在估计值附近做一阶泰勒展开把非线性方程线性化。EKF是当前工业界落地最广的融合方案大多数车规级组合导航产品GNSSIMU内部跑的就是误差状态卡尔曼滤波ES-EKF。它的优点是对算力要求低、能较好处理IMU和GNSS的组合缺点是线性化误差在意外的强非线性场景下会放大以及需要手动推导雅可比矩阵维护成本不低。4.2 无迹卡尔曼滤波不线性化直接用采样逼近无迹卡尔曼滤波UKF通过选取一组sigma点将非线性函数直接作用于这些采样点用采样均值/协方差近似真实后验分布的概率统计信息。它不需要算雅可比矩阵对非线性程度较高的模型精度优于EKF。代价是计算量大约是EKF的2-3倍在实际工程中完全可接受。我个人的经验是如果目标平台算力富余比如工控机或带NEON指令集的ARM处理器UKF是一个替换EKF的低风险升级项如果算力极其紧张比如几美元MCU还是老老实实EKF毕竟那套代码经过多年打磨数值稳定性有保障。4.3 粒子滤波非线性非高斯的通用解但别乱用粒子滤波通过一组带权重的随机粒子逼近任意分布。它对系统没有任何线性/高斯约束在强非线性环境比如严重多径、非高斯噪声下表现优于卡尔曼家族。但粒子滤波的粒子数量随状态维度呈指数级增长——三维空间位置可能需要几千个粒子六自由度位姿速度零偏这幅状态向量动辄十几个维度粒子数根本扛不住计算量爆炸。更别提粒子退化问题迭代几轮后大部分粒子权重趋近于零需要重采样而重采样又会带来粒子耗尽问题。所以在多传感器融合定位里粒子滤波通常用于极少见的场景比如室内定位中直接用UWB锚点做全局定位的初始收敛或者在全局定位丢失后的全局重定位。常规连续跟踪定位我更推荐卡尔曼家族或因子图。4.4 因子图优化把“一段轨迹”作为整体来求解与滤波递推式估计不同因子图Factor Graph把多个时刻的位姿和观测建模成图每一个节点是待估计状态每一个因子是传感器观测对状态的约束然后通过非线性最小二乘求解整个状态序列的最大后验估计MAP。它的优势在于利用了历史的约束信息不像滤波器那样“只回头看一帧”方便做滑动窗口保持计算量可控在关键帧之间增加回环检测因子后能修正历史漂移。代价是计算量比滤波大一个量级实时性取决于图的大小、稀疏程度和求解器效率g2o、GTSAM、Ceres都是成熟选择。在实际系统中浪雷达SLAM、视觉惯性系统VI-SLAM甚至车规级融合定位里的“全局轨迹平滑”环节用的都是这类方案。4.5 多传感器融合定位中怎么选先给结论连续实时跟踪首选EKF或UKF需要高精度全局优化或SLAM建图选因子图GNSS/IMU/轮速组合导航EKF是成熟稳妥之选视觉/激光与IMU的紧耦合前端因子图是主流。打个比方卡尔曼滤波像你在开车时只盯着前方5米的那条分道线一步步修正方向盘图优化像你在出门前规划整条路线并且每开过一段路就回头调整一下之前所有路段的路线。一个实时性好但前瞻性弱一个计算量大但全局一致性强。5. 时间同步、坐标系转换和残差建模——必须硬啃的三个细节这部分是教科书讲得最少、却是工程踩坑最多的部分。5.1 时间同步所有传感器必须准确对应到同一时刻一个残酷的现实是GNSS输出是整秒脉冲对齐的IMU输出有固定的高更新率200Hz激光雷达点云是一次扫描一个时间段内按顺序打出来的相机曝光时刻则与触发信号有一定延迟。如果时间戳不严格对齐你融合的“同一时刻”数据实际来自不同时刻位置偏差会直接放大。常见的做法是使用PTP精确时间协议或GNSS的PPS脉冲为全系统提供统一授时基准对每个传感器维护硬件/软件时间戳并记录触发延迟在观测方程里对“时间偏置”进行在线估计或者干脆把每个观测的离散时间插值到主滤波周期上。我在现场曾经因为激光雷达的时间戳是“整包接收时刻”而不是“扫描结束时刻”导致低速转弯时融合轨迹有约0.3米的周期性误差。排查了两天才发现原因是那台雷达扫描周期100ms车速6m/s时0.1秒误差对应0.6米的偏差而我的融合滤波里没有做时间补偿。细节见真章。5.2 坐标系融合前必须先统一“参考系”所有传感器的定位输出都是相对于自身坐标系。GNSS是地心地固系ECEF转经纬度或UTMIMU是机身坐标系激光雷达和相机安装在车体不同位置有自己的外参轮速计的转角是相对前轮或后轴中心。融合之前必须做好三件事确定统一的参考坐标系通常用ENU或UTM作为全局系用IMU/车体坐标系作为机身系标定所有传感器相对机体的外参位置安装矩阵姿态角通常是6自由度把外参标定误差纳入融合系统因为外参误差会直接成为系统误差滤波再高级也无法消除。很多团队在这块吃过闷亏视觉SLAM和GNSS融合时即便时间戳完全对齐由于外参初始值不准确融合结果反而比单一视觉定位还要漂。最终只能用离线标定靶场做一遍完整外参标定再在运行时对少量外参残差做在线估计才解决。5.3 观测残差与异常值处理融合算法不会自己识别传感器是否失效——它只会把观测带到滤波器里如果观测和状态预测差异巨大一个错误观测足以把整个估计拉飞。因此必须在融合之外设置一层“观测质检”包括但不限于合理性检查位置跳变阈值、速度阈值、姿态角变化率阈值残差卡方检验当观测残差的马氏距离超过一定阈值时降低该观测的权重或直接剔除传感器状态源感知使用GNSS定位时判断解状态是固定解/浮点解/单点解/无效解只对固定解赋予高置信度鲁棒核函数在因子图优化中使用Huber核或Cauchy核而不是二次损失防止一组大残差主导全局优化。这些异常处理逻辑是融合系统“从能用变好用”的关键。没有任何一个Demo会展示这一点但现场环境里数据源50%时间都处于“不太健康”的状态。6. 典型应用场景与系统架构实例6.1 车载组合导航高精度地图采集高精地图采集车是典型的“重传感器”平台高精度RTK/INSGNSS光纤陀螺IMU、激光雷达、全景相机、轮速计、甚至多频多星座板卡堆叠。融合定位在其中的核心任务是在开阔路段依靠RTK把位置锁定到厘米级进入隧道/桥梁区域后切换为INS轮速激光里程计持续递推同时全局优化器保留多年的历史轨迹约束使得车辆整段行程维持在分米级甚至更高精度。具体架构上我一般会把系统拆成两层前端的紧耦合组合导航GNSS/IMU/轮速负责高频位姿输出后端的因子图优化负责整段轨迹平滑与历史纠偏。两层的输出互相校核前端报告残差异常时触发重优化。6.2 地下车库自主泊车视觉IMU轮速UWB地下车库没有GNSS信号但结构化特征丰富。典型的方案是相机VIO提供视觉里程计IMU提供高频运动约束轮速计辅助低速情况下的里程模型车位附近的UWB锚点提供全局位置修正。整个系统的关键是“到处都有锚点”在没有UWB信号时系统依靠VIO和IMU持续推算当检测到UWB测距信号时融合算法将全局位置约束加进来既修正了累积漂移又给规划模块提供了可信任的绝对坐标。这套系统我在实际项目中验证过融合到位后泊车入位停止点的横向误差可以稳定控制在10cm左右。但如果VIO在无纹理白墙区域退化UWB又只有两个锚点可见无法三角定位系统会退化到轮速IMU“盲推”误差会随着行驶距离持续增加。这就是融合系统必须做“退化检测”的典型场景。6.3 仓储移动机器人激光IMU二维码/反光板仓储机器人更务实不大可能上RTK通常用2D激光雷达IMU轮速计做基本定位在地面贴二维码或反光板做绝对修正。融合算法把轮速计和IMU的一致性作为短期趋势激光SLAM匹配作为中期趋势反光板/二维码识别作为长期绝对修正。三者融合后即使二维码间隔10米甚至更远机器人在两站之间的轨迹尾部偏差也控制在几个厘米内到达二维码后可一次性修正为零。这种场景里反光板识别结果被视为“强观测”但必须防“误检”地面水渍、金属门框都可能被识别成反光板。因此我会在反光板匹配环节加一个“距离连续性检查”和一个“几何分布检查”——只有多个反光板的相对几何关系与地图一致时才采纳否则直接丢弃。7. 融合定位系统的调试顺序先跑通再调优新手入门时最容易犯的错是一上手就同时在时间同步、外参标定、滤波类型选择三件事上纠结。结果往往是系统崩了根本不知道是哪里出来的问题。我的建议是严格按下面的顺序推进先单人复盘与离线数据回放把每个传感器数据分别录一段包先离线绘制各自的轨迹。如果某一路径单独画出来就明显不对那融合之前先把这一条链路修好。仅用其中一个主传感器跑通基准定位比如先只用GNSS或激光匹配输出位置为整个系统打下框架。逐步加传感器一款一验加入IMU时重点观察高频轨迹的平滑性再加入轮速计时重点观察车辆静止时的位置收敛最后加入视觉/激光。调参数但不要靠猜把Q和R矩阵从“直觉初值”开始先记录滤波残差和协方差的统计特征再根据实际残差的均值和协方差去反推噪声参数。不要迷信论文里的参数那些是在特定传感器上标定的数字搬到你的场景里通常不适用。8. 集成传感器建一个应用场景Demo做完了理论理解最快速验证的方法是拿手头现有的ROS 2机器人平台跑一个极简多传感器融合。我建议的配置是一个GNSS模块哪怕低成本Ublox、一个消费级IMU如MPU6050或ISM330、一台2D激光雷达跑一个松耦合的EKF融合。用robot_localization包中的EKF把GNSS位置、IMU姿态/角速度、雷达里程计/轮速计作为观测输入先设置一个较大的观测噪声让滤波收敛平滑然后观察三种传感器信号交替缺失时系统输出是否稳定再逐步收紧观测噪声提高对高精度传感器的信任度观察系统是否会出现跳变。这个Demo能让你用一天时间真正理解“融合”的意义比自己啃三个月滤波器理论要直观得多。9. 从纸面到量产给融合定位新手的三个重点建议最后把我这几年实践下来最深的体会送给你。第一先做退化边界测试再谈精度。每一个融合定位系统都有它的极限GNSS丢失多长时间还能维持精度视觉特征缺失多少、持续多少秒还能不漂多快的动态下IMU线性化还成立这些边界条件应该在系统交付前摸清楚写成文档。因为现场之所以有80%的问题都是因为系统被推到了边界之外而架构上并没有应对措施。第二数据日志是排障神器。所有传感器的原始数据、时间戳、解状态、融合输出的中间残差都应该以二进制或高效格式记录下来。生产环境里抱着雷达和模组到处打日志不太现实但核心数据回环一定要保留。现场一个棘手的问题往往要通过数据包离线复盘才能定位原因而不是盯着实时画面猜测。第三不要把融合算法本身当成灵丹妙药。传感器硬件质量、安装精度、数据采集质量这三点决定了融合系统的上限。算法只是“在合理边界内帮你逼近这个上限”的工具。你花一万块钱高精度IMU用EKF能跑出漂亮轨迹你花十块钱MPU6050就算上因子图、神经网络也一样是玩具。传感器选型与融合算法设计是同等级的事情甚至前者更优先。多传感器融合定位不是某一个天才公式的堆叠而是一位工程师和一群互不信任的传感器之间一场反复沟通和妥协的艺术。你越早接受“误差是常态”越早把精力放到数据质量、时间空间对齐、异常处理这些“脏问题”上你的系统就会越快从能跑变成能跑好——那一天你回头看第一章会发现真正让你进步的并不是最深奥的那条公式而是你对每一个误差来源的敬畏。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门