1. 为什么9轴IMU的姿态解算不能只靠单一传感器
很多人第一次接触IMU姿态解算,脑子里想的都是"加速度计能测倾角、陀螺仪能测角速度、磁力计能测航向,那我把三个数据直接读出来不就行了"。我当初也是这么想的,直到真正把传感器数据打到串口上,才发现事情远没有这么简单。
加速度计在静止状态下确实能通过重力分量反推出俯仰角和横滚角,但一旦载体开始运动,比如无人机加速前飞或者机械臂快速摆动,加速度计测到的就不只是重力了,还叠加了运动加速度。这时候你算出来的姿态角会被运动加速度"污染",误差可能高达十几度。陀螺仪的好处是短时间内的角速度积分非常精确,动态响应快,但问题在于积分会累积漂移——零偏哪怕只有0.01度每秒,积分60秒就是0.6度的误差,几分钟下来姿态就完全跑偏了。磁力计能提供绝对航向参考,但它极易受周围铁磁物质和电流产生的磁场干扰,在室内环境下读数可能完全不可用。
所以核心矛盾就出来了:加速度计和磁力计提供长期稳定的绝对参考但有噪声和动态误差,陀螺仪提供短期精确的动态响应但有漂移。卡尔曼滤波器的价值就在于,它用一套严谨的数学框架把这两类互补的信息以最优权重融合起来,既保留陀螺仪的动态性能,又用加速度计和磁力计持续修正漂移。
这里需要先明确一个概念:9轴IMU的卡尔曼滤波姿态解算,本质上是一个状态估计问题。我们要估计的状态量是载体的姿态(通常用四元数表示),观测量是加速度计和磁力计的读数,而陀螺仪的角速度作为状态转移的输入。理解了这一点,后面的算法设计就顺理成章了。
注意:很多人把9轴IMU和AHRS(姿态航向参考系统)混为一谈。严格来说,9轴IMU只是传感器组合,加上姿态解算算法之后才构成AHRS。本文讨论的是从9轴原始数据到姿态输出的完整算法链路。
2. 卡尔曼滤波用于姿态解算的核心原理拆解
2.1 状态方程与观测方程的建立逻辑
卡尔曼滤波的核心思想可以用一句话概括:用上一时刻的最优估计,结合当前时刻的观测,递推得到当前时刻的最优估计。放到姿态解算的场景里,"上一时刻的最优估计"就是上一帧算出来的姿态四元数,"当前时刻的观测"就是加速度计和磁力计的读数。
状态方程描述的是姿态如何随时间演化。对于四元数姿态表示,状态转移矩阵由陀螺仪输出的角速度构建。具体来说,如果陀螺仪在三个轴上的角速度为ωx、ωy、ωz,采样周期为Δt,那么四元数的微分方程可以写成:
dq/dt = 0.5 * q ⊗ ω其中⊗表示四元数乘法,ω是角速度构成的纯四元数(0, ωx, ωy, ωz)。离散化之后,状态转移矩阵F就可以用角速度和采样周期表示出来。这个过程看起来简单,但实际操作中有个容易忽略的点:角速度的积分精度直接决定了状态预测的质量。如果采样率不够高(比如低于100Hz),或者陀螺仪有未补偿的零偏,状态预测就会快速发散。
观测方程描述的是观测量与状态量之间的关系。加速度计的观测模型是:在静止或准静止条件下,加速度计测到的重力方向在载体坐标系中的投影,应该与理论重力方向(由当前姿态四元数旋转得到)一致。磁力计的观测模型类似,它测到的地磁方向在载体坐标系中的投影应该与理论地磁方向一致。这两个观测方程都是非线性的,所以标准卡尔曼滤波不够用,需要用到扩展卡尔曼滤波(EKF)或者无迹卡尔曼滤波(UKF)。
2.2 扩展卡尔曼滤波的线性化处理
EKF的核心操作是对非线性观测方程做一阶泰勒展开,求雅可比矩阵。以加速度计观测为例,设理论重力方向在导航坐标系下为[0, 0, -1](归一化后),当前姿态四元数为q,那么预测的加速度计读数应该是q旋转后的结果。对这个旋转过程关于四元数求偏导,就得到了观测矩阵H。
这里有个实操中很容易踩的坑:雅可比矩阵的推导必须与四元数的定义方式一致。四元数有Hamilton和JPL两种约定,旋转方向有"坐标系旋转"和"向量旋转"两种理解,如果推导时混用了,滤波器会莫名其妙地发散,而且从代码上很难看出来。我的建议是,选定一种约定之后,从状态方程到观测方程到雅可比矩阵全部统一,并且在代码注释里写清楚用的是哪种约定。
另一个关键点是观测噪声矩阵R的调参。R矩阵反映了你对加速度计和磁力计读数的信任程度。R设得太小,滤波器会过度信任观测,导致姿态输出抖动严重;R设得太大,滤波器又过于信任陀螺仪积分,漂移修正会很慢。实际调参时,我通常先把R设为一个中等值(比如加速度计噪声方差设为0.01到0.1之间),然后观察静止状态下的姿态输出是否稳定、动态响应是否跟得上,再逐步微调。
2.3 四元数归一化与零偏补偿的工程细节
理论推导完了,落到代码实现还有几个工程细节必须处理。第一个是四元数归一化。由于数值积分误差,四元数的模会逐渐偏离1,如果不做归一化,姿态旋转矩阵会引入缩放误差。我的做法是每次卡尔曼滤波更新完成后,强制对四元数做归一化,这个操作计算量极小但效果显著。
第二个是陀螺仪零偏的在线估计。高端的做法是把零偏也作为状态量加入卡尔曼滤波器,让滤波器在运行过程中自动估计并补偿零偏。这种做法效果最好,但会增大状态维度和计算量。如果算力有限,可以退而求其次,在静止检测到的时候做零偏校准。具体来说,当加速度计读数模长接近重力加速度、且角速度接近零时,判定为静止状态,此时对陀螺仪输出做滑动平均,更新零偏估计值。
第三个是磁力计的椭圆拟合校准。磁力计在硬铁和软铁干扰下,输出会变成一个偏移的椭球而不是标准球面。如果不做校准,航向角误差可能超过30度。校准方法是在使用前让载体在空间中充分旋转,采集各个方向的磁力计数据,然后拟合椭球参数,得到偏移矩阵和缩放矩阵,后续读数先做校准再送入滤波器。
3. Matlab仿真环境的搭建与传感器数据模拟
3.1 仿真框架的整体设计思路
在真实硬件上调试卡尔曼滤波器之前,我强烈建议先在Matlab里把整个算法链路跑通。原因很简单:真实传感器的噪声特性、零偏特性、干扰特性都是不可控的,你很难判断滤波器发散到底是算法问题还是数据问题。而在仿真环境里,真实姿态已知、噪声可控、干扰可加,你可以精确地定位每一个问题。
我的仿真框架通常包含四个模块:轨迹生成模块负责产生真实的姿态随时间变化曲线;传感器模拟模块根据真实姿态和预设的噪声参数生成加速度计、陀螺仪、磁力计的模拟读数;卡尔曼滤波模块接收模拟读数,输出估计姿态;评估模块对比估计姿态和真实姿态,计算误差曲线。
轨迹生成方面,我一般会设计几段典型的运动模式:静止段用来验证滤波器的稳定性,缓慢旋转段用来验证静态精度,快速摆动段用来验证动态跟踪能力,还有一段包含线性加速度的运动用来验证滤波器对运动加速度的抑制能力。这样一套轨迹跑下来,滤波器的性能基本就摸清楚了。
3.2 传感器噪声与误差的建模方法
传感器模拟的关键在于噪声建模的准确性。陀螺仪的误差主要包括三部分:零偏(常数项)、角度随机游走(积分后变成角度漂移)和速率噪声(白噪声)。在Matlab里,零偏可以设为一个常数加上缓慢变化的随机游走,速率噪声用randn函数生成高斯白噪声即可。
加速度计的误差主要是零偏和白噪声,另外还可以加入尺度因子误差和非正交误差来模拟更真实的情况。磁力计的误差模型最复杂,包括硬铁偏移(常数偏移)、软铁畸变(椭球变形)和白噪声。在仿真中,我通常先不加磁干扰,验证基本算法正确后再逐步加入干扰,观察滤波器的鲁棒性。
这里给出一段典型的传感器模拟代码结构:
% 陀螺仪模拟 gyro_true = omega; % 真实角速度 gyro_bias = 0.01 * ones(3,1); % 零偏,单位度每秒 gyro_noise = 0.05 * randn(3, N); % 白噪声 gyro_meas = gyro_true + gyro_bias + gyro_noise; % 加速度计模拟 acc_true = R_true * [0; 0; -9.81]; % 真实重力在载体坐标系的投影 acc_noise = 0.1 * randn(3, N); acc_meas = acc_true + acc_noise; % 磁力计模拟 mag_true = R_true * [0.3; 0; 0.4]; % 假设的地磁向量 mag_noise = 0.05 * randn(3, N); mag_meas = mag_true + mag_noise;这段代码看起来简单,但有几个参数需要仔细设置。陀螺仪零偏的大小要根据你实际使用的传感器来定,消费级MEMS陀螺仪的零偏通常在0.1到1度每秒之间,工业级的可以低到0.01度每秒。加速度计噪声也要根据实际传感器的噪声密度来换算,不能随便拍一个数。
3.3 真实姿态与估计姿态的对比评估
评估模块的设计直接决定了你能否发现滤波器的潜在问题。我通常从三个维度来评估:姿态角误差的均方根值、误差的收敛速度、动态过程中的最大误差。姿态角误差用四元数误差或者欧拉角误差都可以,但要注意欧拉角在±90度附近有万向锁问题,对比的时候最好用四元数误差或者旋转矩阵的Frobenius范数。
一个实用的技巧是:把真实姿态和估计姿态同时用三维动画显示出来,这样能直观地看到滤波器在哪些时刻跟踪得好、哪些时刻跟踪得差。Matlab的quiver3或者plot3函数配合drawnow就可以实现简单的三维姿态可视化。我当初就是通过可视化发现,滤波器在快速旋转时会有明显的滞后,后来调整了过程噪声矩阵Q才改善。
4. Matlab代码实现中的关键模块与调参经验
4.1 四元数运算工具函数的编写
Matlab本身没有内置的四元数运算函数(旧版本没有,新版本有quaternion类但用起来不够灵活),所以需要自己写一套工具函数。核心函数包括:四元数乘法、四元数共轭、四元数归一化、四元数转旋转矩阵、旋转矩阵转四元数、四元数转欧拉角。
四元数乘法的实现要注意顺序问题。如果定义q = [w, x, y, z],那么q1 ⊗ q2的结果是:
function q = quat_mult(q1, q2) w1 = q1(1); x1 = q1(2); y1 = q1(3); z1 = q1(4); w2 = q2(1); x2 = q2(2); y2 = q2(3); z2 = q2(4); q = [w1*w2 - x1*x2 - y1*y2 - z1*z2; w1*x2 + x1*w2 + y1*z2 - z1*y2; w1*y2 - x1*z2 + y1*w2 + z1*x2; w1*z2 + x1*y2 - y1*x2 + z1*w2]; end这个函数看起来简单,但我在实际使用中发现,四元数乘法的顺序搞反是新手最常见的错误。q1 ⊗ q2和q2 ⊗ q1的结果是不同的,对应的是不同的旋转复合顺序。在姿态解算中,状态转移用的是当前姿态四元数左乘角速度四元数还是右乘,取决于你的四元数是表示"从导航系到载体系的旋转"还是"从载体系到导航系的旋转"。这个必须一开始就定义清楚,不然后面全乱。
4.2 卡尔曼滤波主循环的代码结构
卡尔曼滤波主循环的结构可以概括为"预测-更新"两个步骤的交替执行。预测步骤用陀螺仪数据推进状态,更新步骤用加速度计和磁力计数据修正状态。代码骨架如下:
for k = 2:N % 预测步骤 omega = gyro_meas(:, k-1) - gyro_bias_est; F = build_state_transition(omega, dt); q_pred = F * q_est(:, k-1); q_pred = q_pred / norm(q_pred); P_pred = F * P_est * F' + Q; % 更新步骤(加速度计) [H_acc, y_acc] = build_acc_observation(q_pred, acc_meas(:, k)); S_acc = H_acc * P_pred * H_acc' + R_acc; K_acc = P_pred * H_acc' / S_acc; q_update = q_pred + K_acc * y_acc; P_update = (eye(4) - K_acc * H_acc) * P_pred; % 更新步骤(磁力计) [H_mag, y_mag] = build_mag_observation(q_update, mag_meas(:, k)); S_mag = H_mag * P_update * H_mag' + R_mag; K_mag = P_update * H_mag' / S_mag; q_est(:, k) = q_update + K_mag * y_mag; q_est(:, k) = q_est(:, k) / norm(q_est(:, k)); P_est = (eye(4) - K_mag * H_mag) * P_update; end这段代码里有两个值得展开说的点。第一,加速度计和磁力计是分两步更新的,而不是合并成一个观测向量。这样做的好处是计算量更小(矩阵维度低),而且可以灵活处理某个传感器暂时不可用的情况。第二,每次更新后都要做四元数归一化,这个操作虽然简单但绝对不能省。
4.3 过程噪声与观测噪声矩阵的调参策略
Q矩阵和R矩阵的调参是卡尔曼滤波实际应用中最考验经验的部分。理论上的最优值需要知道系统的真实噪声统计特性,但实际中这些特性往往未知或者时变,所以只能通过试验来调。
我的调参策略是先调R再调Q。R矩阵反映的是观测的可信度,可以先通过静态实验来估计:让传感器静止放置,采集几分钟的加速度计和磁力计数据,计算方差,这个方差就可以作为R的初始值。Q矩阵反映的是过程模型的不确定性,主要来自陀螺仪的噪声和零偏不稳定性。Q设得大,滤波器更信任观测,收敛快但输出抖动大;Q设得小,滤波器更信任模型,输出平滑但动态响应慢。
实际调参时,我会先跑一段包含静止和动态的仿真数据,观察姿态误差曲线。如果静止时误差大,说明R设得太大或者Q设得太小;如果动态时跟踪不上,说明Q设得太小。每次只调一个参数,观察变化趋势,逐步逼近最优值。这个过程可能需要反复几十次,但一旦调好,滤波器的性能会非常稳定。
提示:Q和R的绝对数值并不重要,重要的是它们的比值。如果你把Q和R同时放大10倍,滤波器的行为基本不变。所以调参时可以先固定R,只调Q,或者反过来。
5. 实测中滤波器发散与精度下降的排查链路
5.1 滤波器发散的典型症状与根因定位
滤波器发散是调试过程中最让人头疼的问题。症状通常表现为:姿态估计值逐渐偏离真实值,误差越来越大,最终完全不可用。发散的原因可能有很多,但根据我的经验,90%以上的发散问题可以归结为三类:符号错误、坐标系不一致、噪声参数严重失配。
排查的第一步是检查四元数更新后的模长。如果模长偏离1越来越远,说明状态转移矩阵或者更新步骤有符号错误。第二步是单独运行预测步骤,也就是只用陀螺仪积分,看姿态是否合理。如果纯陀螺仪积分都发散,那问题一定在状态转移矩阵或者四元数乘法上。第三步是单独运行更新步骤,用真实姿态生成观测数据,看滤波器能否收敛到真实姿态。如果更新步骤有问题,那多半是雅可比矩阵推导错了。
我当初遇到过一个很隐蔽的bug:加速度计的观测方程里,重力向量的符号搞反了。结果滤波器在静止时还能勉强工作(因为误差被其他轴吸收了),一旦动态运动就立刻发散。后来我把观测残差的曲线画出来,发现残差一直在增大而不是在零附近波动,才定位到是符号问题。
5.2 动态过程中精度下降的原因分析
即使滤波器没有发散,动态过程中的精度下降也是常见问题。表现是:静止时姿态很准,一旦快速运动,姿态误差就明显增大,运动结束后又慢慢恢复。这种情况通常有三个原因。
第一个原因是加速度计的动态干扰。快速运动时,加速度计测到的不仅是重力,还有运动加速度。如果滤波器把运动加速度也当作重力来修正姿态,就会引入误差。解决办法是根据加速度计读数的模长与重力加速度的偏差来动态调整R矩阵。偏差大时,说明运动加速度大,此时应该增大R,降低对加速度计的信任度。
第二个原因是陀螺仪的尺度因子误差和轴间耦合。消费级MEMS陀螺仪的尺度因子误差可能达到1%到3%,意味着100度每秒的角速度会有1到3度的测量误差。这个误差在积分后会导致姿态误差。解决办法是做转台校准,测量不同角速度下的输出,拟合尺度因子和轴间耦合矩阵。
第三个原因是磁力计的动态干扰。电机、电流、铁磁物质都会产生磁场干扰。解决办法是根据磁力计读数的模长与当地地磁强度的偏差来动态调整R矩阵,偏差大时降低对磁力计的信任度。另外,也可以使用磁力计异常检测,当检测到持续异常时,暂时切换到无磁力计的模式,只靠陀螺仪和加速度计维持姿态。
5.3 静止检测与零偏在线校准的实现
静止检测是提升滤波器长期稳定性的关键手段。原理很简单:当载体静止时,加速度计读数应该等于重力加速度,陀螺仪读数应该接近零。利用这个特性,可以在检测到静止时做两件事:校准陀螺仪零偏和重置姿态误差。
静止检测的判据通常用两个条件:加速度计读数的模长与重力加速度的偏差小于阈值(比如0.1 m/s²),且陀螺仪三个轴的角速度绝对值都小于阈值(比如1度每秒)。为了增强鲁棒性,可以要求连续N个采样周期都满足条件才判定为静止。
零偏校准的做法是:在静止期间,对陀螺仪输出做滑动平均,得到零偏估计值,然后用这个值去修正后续的陀螺仪读数。更精细的做法是用一个低通滤波器持续跟踪零偏,时间常数设得比较大(比如几十秒),这样既能跟踪零偏的慢变化,又不会被短时噪声干扰。
我在实际项目中发现,零偏在线校准对长期姿态精度的影响非常大。没有零偏校准的情况下,即使滤波器参数调得很好,姿态误差也会在几分钟内累积到几度。加上零偏校准后,静止状态下的姿态误差可以长时间保持在0.1度以内。
6. 从仿真到硬件部署的过渡要点
6.1 采样率与实时性的权衡
仿真时采样率可以设得很高(比如1000Hz),但实际硬件上受限于处理器性能和通信带宽,采样率往往要降低。采样率降低会带来两个问题:积分误差增大和滤波器更新频率降低。
积分误差方面,陀螺仪积分用的是矩形近似,采样率越低,近似误差越大。如果采样率从1000Hz降到100Hz,同样的角速度下积分误差会增大10倍。解决办法是使用更高阶的积分方法,比如梯形积分或者Runge-Kutta积分,但计算量也会相应增加。
滤波器更新频率方面,如果采样率太低,滤波器对动态运动的响应会变慢,姿态输出会有明显滞后。我的经验是,对于一般的无人机或机器人应用,采样率至少要在200Hz以上,最好能到500Hz。如果处理器性能不够,可以降低滤波器的更新频率(比如每两个采样周期更新一次),但陀螺仪积分必须每个采样周期都做。
6.2 定点数运算与浮点数运算的选择
嵌入式平台上做卡尔曼滤波,绕不开的一个问题是:用定点数还是浮点数?定点数运算速度快、功耗低,但精度有限,容易溢出。浮点数运算精度高、开发方便,但需要硬件支持或者软件模拟,速度慢。
我的建议是:如果处理器有硬件浮点单元(FPU),毫不犹豫用浮点数。现在很多ARM Cortex-M4/M7系列的MCU都带FPU,浮点运算速度已经很快了。如果没有FPU,可以考虑用定点数,但需要仔细设计定点格式,避免溢出和精度损失。一个折中的方案是:姿态四元数和协方差矩阵用浮点数,中间计算过程用定点数,但这样代码复杂度会高很多。
6.3 传感器校准流程的工程化落地
从仿真到硬件,传感器校准是必须过的一关。加速度计和陀螺仪的校准相对简单,用六面法或者转台法就能搞定。磁力计的校准最麻烦,因为需要采集各个方向的数据。
我的磁力计校准流程是这样的:把传感器固定在一个非铁磁材料的支架上,缓慢地在空间中旋转,覆盖尽可能多的方向。采集数据后,用椭球拟合算法求出硬铁偏移和软铁变换矩阵。拟合的时候要注意,采集的数据要尽量均匀覆盖球面,如果只在某个平面内旋转,拟合出来的参数在垂直于该平面的方向上会有很大误差。
校准完成后,一定要做验证。验证方法是:把校准后的磁力计数据画在三维图上,看是否接近一个标准球面。如果还是椭球,说明校准参数不对。另外,校准参数不是一劳永逸的,如果传感器安装位置变了,或者周围有新的铁磁物质,需要重新校准。
7. 一些让滤波器更稳的实战技巧
7.1 自适应噪声调整的简单实现
前面提到过,动态调整R矩阵可以提升滤波器在运动状态下的表现。实现方法很简单:计算加速度计读数的模长与重力加速度的偏差,偏差越大,R_acc设得越大。具体公式可以写成:
acc_norm = norm(acc_meas); acc_deviation = abs(acc_norm - 9.81); R_acc = R_acc_base * (1 + k * acc_deviation^2);其中k是一个可调系数,控制R随偏差增长的速率。磁力计同理,用磁力计读数的模长与当地地磁强度的偏差来调整R_mag。这个简单的自适应策略在实际中效果很好,而且计算量几乎可以忽略。
7.2 磁力计异常时的降级策略
磁力计受干扰是常态,尤其是在室内或者电机附近。如果滤波器一直信任被干扰的磁力计,航向角会严重偏离。我的做法是设置一个磁力计异常计数器:当磁力计读数的模长与当地地磁强度的偏差超过阈值时,计数器加一;偏差恢复正常时,计数器减一。当计数器超过某个阈值时,判定磁力计异常,此时将R_mag设为一个极大的值(相当于不信任磁力计),滤波器退化为6轴模式,只靠陀螺仪和加速度计维持姿态。
这个降级策略的关键是阈值和计数器的设置。阈值设得太小,磁力计稍微有点干扰就触发降级,航向角会慢慢漂移;阈值设得太大,磁力计被严重干扰时滤波器还在信任它,航向角会突然跳变。我的经验是,阈值设为当地地磁强度的20%到30%比较合适,计数器阈值设为50到100个采样周期。
7.3 姿态输出平滑与延迟的平衡
滤波器输出的姿态角有时候会有高频抖动,直接用于控制会引入噪声。常见的做法是加一个低通滤波器,但低通滤波会引入相位延迟,影响控制系统的稳定性。
我的做法是在卡尔曼滤波器的观测噪声中已经做了平滑,输出端不再额外滤波。如果还是有抖动,说明R设得太小或者Q设得太大,应该从滤波器参数入手解决,而不是在输出端加滤波器。如果确实需要额外平滑,可以用一个截止频率较高的低通滤波器(比如截止频率50Hz以上),这样引入的延迟很小,同时能滤掉高频噪声。
另外,如果应用对姿态延迟特别敏感(比如无人机的高速飞行控制),可以考虑使用预测补偿:根据当前角速度,预测未来一个控制周期的姿态,提前输出。这个技巧在高速控制场景中很有效,但需要仔细标定预测时间,预测过长会导致过冲。
7.4 长期运行中的漂移抑制
即使有零偏校准和磁力计修正,滤波器长时间运行后仍然可能有缓慢漂移。这通常是因为零偏估计不够准确,或者磁力计校准参数随时间变化。
我的做法是定期做一次完整的静止校准:在系统启动时,如果检测到静止状态持续超过一定时间(比如5秒),就执行一次完整的零偏校准和姿态重置。运行过程中,如果检测到长时间静止,也触发一次校准。这样可以把漂移控制在很小的范围内。
另外,如果应用场景中有已知的参考方向(比如太阳方向、已知地标),可以用这些参考来做绝对校准。但这需要额外的传感器和算法,复杂度较高,一般应用中用不到。
8. 写在最后
这套9轴IMU卡尔曼滤波姿态解算的方案,我从最初的理论推导到Matlab仿真,再到实际硬件部署,前后断断续续折腾了大半年。中间踩过的坑包括但不限于:四元数乘法顺序搞反导致滤波器完全发散、加速度计符号错误导致动态时姿态跳变、磁力计未校准导致航向角偏差30度以上、采样率太低导致积分误差累积过快。
如果让我给刚入门的同行一个建议,那就是:先把Matlab仿真跑通,再碰硬件。仿真环境里你可以随意修改参数、注入干扰、对比真实值,这是硬件调试给不了的便利。等仿真里各种工况都跑稳了,再移植到硬件上,你会发现大部分问题已经在仿真阶段解决了。
另外,卡尔曼滤波器的调参没有捷径,就是反复试、反复观察、反复调整。但一旦调好,你会发现它的性能远超互补滤波等简单方法,尤其是在动态性能和长期稳定性上。这也是为什么至今卡尔曼滤波仍然是姿态解算领域的主流方法。