简介:资源为《GNSS与惯性及多传感器组合导航系统原理》电子版,面向导航、测绘、自动驾驶等领域的学习者与工程技术人员。内容聚焦GNSS与惯性导航的集成方法,系统讲解卡尔曼滤波、数据融合、多传感器协同定位等核心理论,并配有MATLAB代码实例,便于读者将原理转化为实际算法验证。压缩包大小13.15MB,适合作为专业教材或技术参考。已有1700人学习,资源整体紧凑实用,对理解组合导航系统设计、提升多源融合算法开发能力具有直接帮助。
1. 组合导航:为什么丢星之后,位置还在往前走
开车进隧道,导航信号条全部变灰,地图上的箭头却没有原地发呆,而是沿着隧道方向继续平滑移动。等你出隧道重新收到卫星信号,箭头位置和真实出口几乎没差太多。这不是手机厂商做了什么玄学预测,而是组合导航系统里惯性传感器在顶班。更反直觉的是:GNSS单点定位误差通常有几米,消费级惯性器件一分钟就能漂出上百米,两个“都不完美”的传感器融合在一起,反而能把定位误差压到比任何一个单独使用都更低。这个机制就是组合导航领域最核心的命题:怎么用互补的误差特性,换来超越单个传感器的精度与连续性。
要搞懂这件事,只看滤波公式是不够的。卡尔曼滤波只是个数值工具,真正决定系统能不能收敛、会不会发散的,是对误差模型的理解、耦合架构的选择、时间同步的处理,以及一堆容易被忽略的坐标约定。这就是值得从底层拆一遍的原因——组合导航看似是“GNSS加IMU”,实际上是一整套关于误差如何在状态空间中传播、观测、修正的工程体系。
2. 互补的误差:为什么两个都不完美的传感器,融合起来反而更精确
2.1 误差的“性格”:一个有界一个无界
GNSS和惯性导航的误差特性几乎完全相反。GNSS定位误差不随时间累积,只要卫星信号正常,这次解算的位置误差和上次没有关联,从统计上看是有界误差;但它的输出频率低,典型消费级接收机只有 10Hz,在城市峡谷或隧道里还会直接失锁。惯性导航(INS)相反,陀螺仪和加速度计的误差会通过积分不断累积,姿态误差导致加速度投影错误,速度误差再积分成位置误差,所以位置误差随时间三次方增长,无界且发散。但它内部不依赖任何外部信号,输出频率可以做到 200Hz 以上甚至 1kHz,短期精度极好。
把这两个传感器放在一起,本质上是让“短期准、长期漂”的惯导去填补“长期准、短期差”的 GNSS 在时间上的空隙。两者的误差频谱天然互补:GNSS 在低频段信息质量好,惯导在高频段跟踪动态更可靠。组合导航的滤波器做的就是一件事——在频域上把两个信号按置信度加权合并,得到一条既平滑又不发散的轨迹。
下表是两类传感器误差特性的简化对比,读者在看完后面滤波器的设计后会明白,这些特性直接决定了状态向量里每一项噪声协方差的取值范围。
| 特性维度 | GNSS | 惯性导航(IMU) |
|---|---|---|
| 误差随时间变化 | 有界,不累积 | 无界,姿态、速度、位置逐级积分放大 |
| 输出频率 | 低频(典型 10Hz) | 高频(200Hz 以上) |
| 短期动态响应 | 差,存在解算延迟 | 好,能精确跟踪高频运动 |
| 环境敏感性 | 受遮挡、多路径影响大 | 不受外部环境影响 |
| 长期稳定性 | 好 | 差 |
2.2 卡尔曼滤波的本质:不是“平均”,而是按不确定性加权
许多入门解释把卡尔曼滤波讲成“预测和测量取平均”,这个说法容易误导。真正的机制是两个独立信息来源的方差合并。假设当前惯导递推了一个位置估计,方差较大;GNSS 观测了一个位置,方差较小。卡尔曼滤波计算最优估计时,不是简单平均,而是按方差的反比加权:方差小的信息来源获得更高权重,最终后验方差比两个来源各自的方差都小。
后验方差可以直观地写成一个并联电阻的形式:
- 如果两个来源的噪声独立,合并后的方差 = σ1² * σ2² / (σ1² + σ2²)
- 当任何一个来源方差趋近无穷大时,合并后方差趋近另一个来源的方差
- 当两个来源方差相同时,合并后方差是单个方差的一半
这意味着融合系统总是自动倾向于信任更准的信息源,而不会让坏数据把好数据拖下水。从设计取舍上看,这就是组合导航系统“为什么能 work”的第一层答案:两个误差特性互补的系统,在滤波器里根本不需要人为判断该信谁,协方差矩阵会做这件事。
不过这里有一个前提容易被忽略:两个来源的误差必须统计独立。如果 GNSS 多路径误差和惯导误差存在相关性但没建模,卡尔曼滤波的最优性就被破坏了,会出现系统过自信、输出发散的问题。这个坑在后面避坑章节会展开讲。
2.3 数据融合的流程骨架:递推与修正
组合导航系统的软件框架几十年来基本没变过,是一条简洁的循环:
- 高频机械编排:每次拿到新的 IMU 数据,就用上一时刻的姿态、速度、位置,加上当前测得的角速度和加速度,积出新的姿态、速度、位置。这一步叫机械编排(mechanization)。
- 低频量测更新:每次拿到 GNSS 定位结果或原始伪距,就把“惯导当前外推出来的对应虚拟观测值”和“GNSS 实际观测值”做差,得到残差。
- 误差修正:把残差乘上卡尔曼增益,得到对姿态误差、速度误差、位置误差以及传感器零偏等状态量的修正量,注入标称状态。
这个循环里没有一步是“看心情切换传感器”的。GNSS 信号丢失时,循环只是跳过量测更新,机械编排继续跑,位置向外漂;GNSS 恢复后,滤波器根据当前协方差状态决定给新观测多大信任,如果惯导已经漂了很久、位置协方差很大,GNSS 观测会被给予高权重,迅速把轨迹拉回来。这就是组合导航能跨越信号中断的核心机制——系统一直知道自己“有多不确定”,恢复时能自动校正。
3. 耦合架构:松耦合、紧耦合、深耦合到底在耦合什么
3.1 松耦合:把两个黑匣子接到一起
最早也最直观的组合方式,是在系统级做融合。GNSS 接收机独立解算输出位置和速度(PVT 解),IMU 的机械编排输出自己的位置和速度,两组数值直接送到滤波器里做残差。这套架构叫松耦合,它的好处是模块化清晰,GNSS 接收机内部的跟踪环路不受影响,两边可以当作独立的黑匣子对接。
但松耦合有个结构性缺陷:它要求 GNSS 必须已经完成完整解算才能参与融合。在高楼峡谷或树荫遮挡下,可见卫星数量降到三四颗时,接收机内部的解算已经不可靠,松耦合系统只能选择丢弃这些观测,或者把充满误差的定位结果送进滤波器,污染整个状态估计。这是松耦合天然的短板,它的信息瓶颈不在滤波器,而在 GNSS 接收机的前端解算这一步。
3.2 紧耦合:在伪距层面就融合起来
紧耦合改变了融合发生的位置。GNSS 接收机不再输出最终定位结果,而是把原始的伪距、伪距率观测值直接给滤波器。滤波器内部维护对“接收机位置-卫星位置”距离的预测,和实际伪距测量值做差生成残差。即使可用卫星只有一颗,紧耦合系统依然可以把它当作一个约束条件来修正状态,不会因为“解算不出位置”就把信息白白丢弃。
从设计动机上看,紧耦合相比松耦合的收益非常直接:在遮挡环境下可用性显著提升。代价是状态向量里必须维护接收机时钟误差及其漂移率,因为伪距观测里混入了接收机钟差;同时计算量增加,系统调试难度也上一个台阶。
3.3 深耦合:把惯性信息送进跟踪环路
深耦合走出了另一个方向:把惯性导航估计出的动态信息反馈到 GNSS 接收机内部的载波跟踪环路。GNSS 接收机在强动态环境下失锁的根源,是环路带宽跟不上载波多普勒的剧烈变化。带宽调宽能锁住动态但噪声变大,调窄则动态下失锁,这是环路设计里的天然矛盾。
深耦合架构用惯导测得的载体速度去推算多普勒频移,把接收机环路的中心频率从纯信号跟踪的结果改成“惯导预测+残余跟踪”,这样环路既不必盲目加宽带宽,又能在大机动下保持锁定。它的价值在强动态场景(如无人机急转弯、车载弹射起步)中体现得最明显。实现上通常需要直接访问接收机基带芯片的原始接口,工程复杂度相当高,因此也是三种架构里最不常见、但对系统性能上限提升最显著的一种。
下面用一张表把三种架构的核心差异放在一起:
| 耦合方式 | 融合数据层面 | 对原始数据需求 | 遮挡环境表现 | 典型应用 |
|---|---|---|---|---|
| 松耦合 | 位置/速度解 | 无 | 卫星不足时性能下降 | 车机导航、无人机初级组合 |
| 紧耦合 | 伪距/伪距率 | 有 | 少量卫星仍能修正状态 | 城市峡谷导航、高精度测绘 |
| 深耦合 | 跟踪环路内部 | 需要基带接口 | 强动态下不失锁 | 高动态飞行器、精确制导场景 |
三种架构不是迭代关系,而是不同取舍下的产物,选择哪一级取决于传感器硬件能开放到什么程度、算力余量有多少、以及最终场景对“遮挡可用性”要求有多高。
4. 误差状态卡尔曼滤波器:组合导航真正的引擎长什么样
4.1 为什么用误差状态而不是全状态
组合导航里最常见的滤波器形式是误差状态卡尔曼滤波器(ESKF)。它把真实状态拆成两部分:标称状态(大幅值、非线性演化)和误差状态(小幅值、近似线性)。为什么这么拆,可以从三个层面理解。
第一是线性化精度。全状态滤波要求把姿态、速度、位置的非线性方程在估计值附近做泰勒展开,如果状态量偏差较大,一阶近似的误差就会被放大。而误差状态的值通常极小,线性假设很贴合实际,系统的二阶项可以安全忽略。
第二是数值稳定性。旋转表示无论是欧拉角还是四元数,在滤波更新里都面临一个尴尬:欧拉角在俯仰接近 90 度时奇异,四元数更新需要维持单位模长约束,强行把误差加到四元数上会破坏归一化。误差状态把姿态误差表示成小角度旋转向量,维数低且不存在冗余参数,规避了整个奇异问题。
第三是物理意义清晰。误差状态里的每一个元素都直接对应一个可解释的物理量:姿态误差角、速度误差、位置误差、陀螺零偏误差、加速度计零偏误差。调试时看每个协方差对角元,能直接知道系统当前对哪个量最不确定,便于定位发散来源。
4.2 预测步:机械编排与误差协方差递推
预测步的前半部分是纯运动学过程:把 IMU 的角速度和比力积分进标称状态。这里的关键点在于,角速度积分要处理旋转的非交换误差,通常用等效旋转矢量或四元数微分来完成。后半部分才是滤波器的核心差距所在:误差状态的协方差怎么往前推。
误差状态的转移矩阵 F 是由惯导误差方程推导出来的,它把上一时刻的姿态误差、速度误差、位置误差与陀螺零偏误差、加速度计零偏误差如何互相耦合的过程全部建模出来。写出来是一套 15 维以上的线性系统方程,姿态误差是“积分”出速度误差的源头,速度误差又是位置误差的积分源头,零偏误差本身被建模为随机游走过程。这个过程里最值得注意的参数是过程噪声矩阵 Q,它代表 IMU 噪声和零偏随机游走在每个周期内注入系统的“不确定量”,直接决定滤波器信任惯导输出的程度。
4.3 更新步:残差、增益与注入机制
当 GNSS 观测到达时,滤波器执行标准卡尔曼更新,但只对误差状态实施。整个主循环可以浓缩成下面这段结构性的伪代码,逻辑上就是紧耦合系统中量测更新的骨架:
# 误差状态卡尔曼滤波主循环(GNSS 伪距/位置量测可选接入) def eskf_predict(x_nom, dx, P, gyro, accel, dt): # 1. 标称状态机械编排:输入角速度和比力,更新姿态/速度/位置 x_nom = mechanization(x_nom, gyro, accel, dt) # 2. 计算误差状态转移矩阵 F 与过程噪声矩阵 Q F = build_error_transition(x_nom, gyro, accel, dt) Q = assemble_process_noise(x_nom, imu_noise_params, dt) # 3. 误差状态协方差递推(标准卡尔曼预测) P = F @ P @ F.T + Q return x_nom, P def eskf_update(x_nom, dx, P, satellite_measurements): # 1. 用标称状态预测卫星伪距,得到观测残差(紧耦合入口) z = satellite_measurements - predict_pseudoranges(x_nom, satellites) # 2. 量测模型:伪距对误差状态的雅可比矩阵 H = build_measurement_jacobian(x_nom, satellites) # 3. 计算创新协方差与卡尔曼增益 S = H @ P @ H.T + R K = P @ H.T @ inv(S) # 4. 更新误差状态和协方差 dx = K @ z P = (I - K @ H) @ P # 5. 关键步骤:将误差状态注入标称状态,然后清零误差状态 x_nom = inject(x_nom, dx) dx = zero() return x_nom, dx, P这段代码里最有设计意味的是最后一步:注入后必须把误差状态清零。原因是误差状态在滤波器内部被建模为小量,如果注入后不清零,下一时刻的转移方程会同时考虑一个已经被修正过的历史误差,导致重复修正,滤波器会逐渐出现收敛过头甚至发散。在工程上漏写这一步是第一个隐蔽的崩溃点。
4.4 噪声参数的真实物理含义
过程噪声 Q 和量测噪声 R 是滤波器里最容易被乱调的两个矩阵。Q 的物理来源是 IMU 的测量噪声功率谱密度和零偏随机游走系数,不同等级的器件差别巨大,消费级 MEMS 陀螺零偏不稳定性可能在几十度每小时,光纤陀螺则在零点几度每小时。而 R 对应 GNSS 伪距的观测噪声标准差,城市环境下被多路径干扰时可以放大到正常空旷环境的数倍。
这两个矩阵的平衡决定了滤波器是在“信惯导”还是“信 GNSS”。Q 调得比实际小,滤波器会对惯导过度自信,GNSS 修正作用被削弱,轨迹平滑但长期漂移大;R 调得比实际小,滤波器会过度跟踪 GNSS 噪声,输出轨迹抖动明显但在真实位置附近振荡。一手调 Q 一手调 R,是组合导航工程里最耗时的部分,也是后面要专门避坑的一个重灾区。
5. 避坑指南:时间同步、杠杆臂和坐标系约定的血泪经验
5.1 时间同步错位导致融合结果缓慢发散
- 现象:滤波输出在动态场景下位置误差逐渐增大,车辆直线行驶还好,一旦转弯或加减速就出现明显跳变,静止时又恢复正常。
- 原因:GNSS 观测对应的时刻和 IMU 机械编排对应的时刻不一致。GNSS 接收机从信号接收到串口输出有几十到几百毫秒的延迟,IMU 的采样时间戳也有自己的参考时钟。滤波器把两个不同时刻的量放在同一个状态上进行残差计算,动态越大误差越大。
- 解决:优先启用硬件级别的 PPS 秒脉冲和时间同步机制,让接收机和 IMU 采样对齐到同一个时钟源;软件方案则需要对 GNSS 观测做延迟补偿,在量测更新时用一个“过去时刻”的状态去计算残差,或在状态转移时把观测外推到当前时刻。我一般会先打印时间戳差值分布曲线,确认延迟是稳定的还是波动的,再决定用查表补偿还是动态估计延迟。
5.2 杠杆臂未补偿导致转弯时位置甩出去
- 现象:车辆急转弯时,融合后的位置轨迹明显朝弯道外侧偏离,弯道半径越小偏差越大,直线段无此问题。
- 原因:GNSS 天线相位中心和 IMU 几何中心不在同一个物理点,两个中心的距离被称为杠杆臂。车辆转弯时这个距离乘以旋转角速度会得到一个相当大的线速度差,如果不补偿,相当于在残差里引入一个随姿态变化的虚假速度误差,滤波器就会把位置往错误方向修正。
- 解决:精确测量天线与 IMU 之间的三维距离,在滤波器状态或量测方程中补偿。杠杆臂通常被当成待估参数放在状态向量里持续在线估计,也可以在安装时手工量测后写死。注意这个量在温度、结构形变下可能变化,高精度场景建议在线估计。
5.3 坐标系约定不一致导致姿态正确但速度持续漂移
- 现象:GNSS 观测看起来正常,姿态角也稳定,但融合后的东向或北向速度有一个恒定偏置,位置随时间缓慢漂开。
- 原因:GNSS 输出的位置是在地心地固坐标系或地理坐标系下表示的,IMU 的加速度积分建立在导航系到机体系的旋转矩阵上,二者之间的基准不能错。常见的约定坑包括“东北天”和“北东地”坐标系混用,旋转矩阵的左右乘顺序不一致,以及位置采用经纬高、但在滤波器内部却用平面坐标而没有做曲率修正。
- 解决:在系统初始化的配置文件里把坐标系定义、旋转顺序写死,并把传感器输出的坐标转换统一到导航系。调试时做一个静态测试:把载体旋转 90 度,看滤波器里的速度方向是否同步旋转 90 度,如果不一致,一定是坐标约定问题而不会是滤波参数问题。
5.4 GNSS 多路径故障导致位置瞬间跳变几十米
- 现象:高楼或高架桥下融合位置突然跳到路边甚至道路另一侧,然后慢慢拉回来,期间协方差输出明显缩小过。
- 原因:GNSS 在多路径环境下观测存在很大的非高斯误差,但卡尔曼滤波假设量测噪声服从高斯分布。个别伪距观测被建筑物反射面污染后形成巨大残差,如果滤波器没有对新息做异常检测,这个坏量测会被当作有效信息强行修正状态。
- 解决:对新息向量做卡方检验,一旦检测到超阈值就丢弃该量测或增大对应 R 值;进一步的做法是维护滑动窗口内的残差统计,自适应调整 R。工程上常用 3σ 门限来做初步甄别,但城市峡谷中要针对多路径做更精细的统计模型。
5.5 噪声协方差调参全凭手感导致滤波器隐性失效
- 现象:滤波器“看起来收敛”——状态曲线平滑、不发散,但把输出和真值对比时定位误差明显偏大,而且调整 Q、R 数值后发现结果几乎不变。
- 原因:这是最隐蔽的一种配置陷阱,通常因为 Q 和 R 之间量级失衡,滤波器已经进入“只信惯导、完全不听 GNSS”或者相反的模式。协方差矩阵经过几十次迭代后已经无法反映真实的不确定度,状态估计变成了一个既不是最优也不至于发散的折中值。
- 解决:调参之前先用 Allan 方差标定 IMU 噪声参数,从中得到陀螺和加速度计的噪声密度与随机游走系数,作为 Q 的初始值;R 则用长时间静态数据统计伪距残差的标准差来推导。调完后做一段有真值参考的动态测试,检查新息序列的均值是否接近零、新息方差是否和理论计算 S 矩阵一致,这两项指标能一票否决一个看似正常的滤波器。
6. 设计取舍:为什么误差状态而不是全状态滤波
如果完全从估计理论的角度看,全状态卡尔曼滤波也可以完成同样的任务,状态向量直接装姿态、速度、位置和零偏,量测更新直接把修正量加在状态上。两种方案的差别要在数值边缘才暴露出来。
第一个是旋转表示的奇异性问题。全状态滤波如果选择欧拉角状态,俯仰角接近 ±90 度时表达方式退化解体;选择四元数状态则必须额外处理模长约束,否则归一化误差会逐步累积。误差状态把姿态误差拆成小角度旋转向量,这个向量在任何姿态下都存在且无冗余,数值上是安全的。第二个是线性化精度问题。全状态滤波的状态预测是非线性方程,量测更新却假设线性化在估计点附近始终成立,车辆做极限机动时状态偏差渐大,一阶近似失真就越明显;误差状态因为自身量值小,线性化误差始终可控。第三个是工程调试问题,误差状态滤波分离了“高频运动学”和“低频误差修正”,它们可以独立验证,机械编排输出不对和滤波修正不对能直接区分开。全状态滤波把两者混在一起,出了问题很难判断是预测错还是更新错。
从工程角度讲,误差状态卡尔曼滤波还规避了一个经典的全状态方案隐藏问题:数值精度。全状态滤波在长期运行时,位置等大数值量进入矩阵运算,协方差矩阵容易出现条件数过大的情况,导致滤波精度退化;误差状态中需要维护的是小量误差的协方差,数值上更稳定。代价则是每次量测更新后要多做一次注入操作,并严格保证随后清零误差状态,这个半步逻辑就是要多维护的复杂度。
做组合导航系统的这些年,我踩过最深的坑不是公式不会推,而是公式都对了、状态还是发散——后来几乎全是时间同步、坐标约定这类不在滤波器公式里出现的东西。从那以后我每次搭建新系统,都强制自己先写一份坐标约定和时延台账,再碰任何滤波参数。很多组合导航做不出来的场景,翻车点就在这里。希望帮到你。
本文还有配套的精品资源,点击获取