1. 惯性导航解算到底在解什么
先说一句可能颠覆认知的话:惯性导航解算,本质上不是在“算导航”,而是在反推一条轨迹。你手里拿到的原始数据只有两类:加速度计测到的比力,陀螺仪测到的角速度。你要做的,是借助这两个信号,一步步得到载体的姿态、速度、位置,最终画出一条完整的运动轨迹来。
我做惯性导航解算这几年,最大的体会是:解算的结果好坏,九成不取决于算法本身,而取决于你对误差的敏感程度。算法只是工具,真正费心思的是怎么处理噪声、偏移、标定误差、积分漂移这些“脏东西”。这也是为什么同样一颗MPU6050,有人能在小车上跑出稳定的姿态角,有人解算出来的角度却像喝醉了酒。
先说清楚这个领域解决的三个层次:
- 姿态解算:由陀螺仪与加速度计(有时加上磁力计)估计载体的横滚角、俯仰角、偏航角。这是整个惯性导航的基石。
- 速度与位置解算:在姿态已知的基础上,把加速度计测量值转换到导航坐标系,剔除重力分量,然后对加速度进行一次积分得到速度,二次积分得到位置。
- 组合导航:将惯导解算结果与GPS、视觉、里程计等外部信息融合,抑制长时间累积误差。卡尔曼滤波是这里的常客。
对刚接触这块的朋友,我的建议是先不要碰组合导航,把前两步吃透。因为前两步才是“惯性导航”区别于其他导航方式的灵魂——它是纯自主的、不依赖任何外部信号的推算过程。理解它的能力和局限,你才能真正理解为什么无人机、导弹、地下矿车都离不开它,也知道为什么它单独跑久了一定会飘。
这篇文章我会从原理一路讲到代码实现,再穿插一些我做项目时踩过的坑,尽量把整个解算链路讲透。
2. 姿态解算:先让“姿态”有数学表达
2.1 坐标系与姿态表达方式
姿态解算的第一步不是写代码,而是选一个姿态表达方式。这在惯性导航解算里是最基础却最容易被新手忽略的决策。常见有三种:欧拉角、旋转矩阵、四元数。
欧拉角最直观,横滚(Roll)、俯仰(Pitch)、偏航(Yaw),人脑能直接理解。但它有一个致命伤:万向锁问题。当俯仰角接近±90°时,横滚和偏航的旋转轴会重合,丢失一个自由度,表现为角度跳变和数值奇异。在无人机、机器人的实际姿态中,俯仰角很可能贴近90°,所以纯用欧拉角做全姿态解算是不安全的。
旋转矩阵用9个元素表达姿态,不存在奇异问题,但计算量和存储开销大,而且矩阵元素之间存在约束,数值漂移后需要重新正交化,比较麻烦。
四元数用4个元素表达姿态,没有奇异,运算量小,数据更新方便,是当前惯性导航姿态解算的事实标准。代价是反直觉,不直观。你需要把四元数当作一个“超级旋转工具”,它内部维护一个四维单位向量,通过四元数乘法完成任意姿态的旋转更新,最终再转换成欧拉角输出给用户。
我的建议很直接:如果你做的是实时性要求高的嵌入式项目,直接用四元数,最后要给人看角度时再转欧拉角。我个人在STM32上做姿态解算时用的就是四元数,后面我给的代码也会围绕它展开。
2.2 从角速度到姿态更新
姿态更新的核心数学关系非常简洁:姿态四元数的微分方程。
假设陀螺仪测到的载体角速度为 ω = [ωx, ωy, ωz],四元数对时间的导数为:
q_dot = 0.5 * q ⊗ ω_q
其中 ω_q = [0, ωx, ωy, ωz] 是角速度的纯四元数形式,⊗ 表示四元数乘法。实际离散实现时常用一阶龙格-库塔更新:
q_new = q_old + q_dot * dt
然后归一化,强制四元数模长等于1。这一步不能省,否则经过多次迭代后四元数的模长会偏离1,导致旋转失真。
但这里有一个致命问题:陀螺仪存在零偏(bias)。就算载体完全静止,陀螺仪输出也不是0,而是一个缓慢漂移的微小值。积分后这个微小值会被不断累积,导致姿态角缓慢旋转。这就是你静止放置设备,但姿态解算出来的角度一直在“跑”的经典现象。要修正它,就需要引入加速度计和磁力计的数据进行融合。
2.3 互补滤波与卡尔曼滤波怎么选
这是一个老生常谈但永远有人问的问题:到底用互补滤波还是卡尔曼滤波?
我直接说结论:两者都能用,互补滤波简单、计算量小、代码量少,适合大多数低成本传感器项目;卡尔曼滤波理论上最优、需要准确的噪声模型,但参数调不好反而比互补滤波更差。
先看互补滤波的思路。陀螺仪动态响应好,短时期内精度高,但长期会漂移;加速度计静态下能测重力方向,长期稳定,但动态时振动噪声大。两者在频域上互补。互补滤波就是用高通滤波处理陀螺仪积分角,用低通滤波处理加速度计估计角,然后融合在一起。
互补滤波的典型形式是:
angle = alpha * (angle + gyro_rate * dt) + (1 - alpha) * accel_angle
这里的 alpha 就是融合系数,本质上决定了对陀螺仪的信任程度。alpha 越大,越信任陀螺仪,动态响应好但漂移明显;alpha 越小,越信任加速度计,抗漂移强但容易受振动干扰。
卡尔曼滤波则把姿态角建模成状态变量,把陀螺仪零偏也放进状态里实时估计,用加速度计作为观测更新。这样做的好处是“自动”估计零偏,不需要手动调 alpha,坏处是要初始化一堆协方差矩阵,而且拿不到准确的噪声参数时,收敛效果可能很差。
我的实践经验是:如果你刚开始做姿态解算,先用互补滤波跑通整个链路,理解每一步在干什么;等系统稳定了,再考虑上卡尔曼滤波去提升动态性能。循序渐进比一步到位稳妥得多。
3. 实战:MPU6050 + STM32的完整解算链路
3.1 硬件准备与连接要点
要做一套完整的惯性导航解算实验,你需要的硬件很简单,也很便宜:
- 主控:STM32F103C8T6 最小系统板
- 传感器:MPU6050 六轴IMU模块(含姿态融合芯片的模块也可以,但我们要自己解算,所以选裸传感器模块)
- 通信接口:I2C,接到主控的 PB6(SCL)、PB7(SDA)
- 调试串口:USART1,用于把解算结果传到电脑上位机显示
- 电源:3.3V,注意MPU6050模块上的稳压芯片会把5V转换成3.3V,但如果模块不带稳压,必须直接供3.3V
- 杜邦线若干、面包板一块
这里有一个非常容易被新手忽略的问题:I2C上拉电阻。STM32的I2C引脚是开漏输出,必须外接4.7kΩ上拉电阻才能稳定工作。很多MPU6050模块上已经带了上拉电阻,但如果你买的是裸芯片模块,一定要自己加上。我最早做实验时没注意这个问题,I2C通信时好时坏,浪费了一个下午排查。
接线表如下:
| MPU6050引脚 | STM32引脚 | 说明 |
|---|---|---|
| VCC | 3.3V | 供电 |
| GND | GND | 共地 |
| SCL | PB6 | I2C时钟 |
| SDA | PB7 | I2C数据 |
| AD0 | GND | 地址选择,接地为0x68 |
| XDA/XCL | 不接 | 扩展接口 |
| INT | 可选 | 数据就绪中断,本项目不用 |
3.2 传感器标定与数据预处理
拿到MPU6050的原始数据后,第一件事不是直接送进姿态解算算法,而是标定。这一点太重要了,我在这个环节吃过太多亏。
首先是零偏标定。让传感器水平静止放置,采集几百组数据,分别求加速度计和陀螺仪的平均值。正常情况下:
- 加速度计三轴输出为 [0, 0, g],g约为9.8(如果设置量程为±2g,则输出约为16384 LSB/g,所以零点漂移值应在±20 LSB以内)
- 陀螺仪三轴输出应接近0,但实际会有几十到几百LSB的零偏
标定后的修正非常简单:
// 陀螺仪零偏修正量,在静止状态下采集500组取均值得到 float gyro_offset_x = -12.35; float gyro_offset_y = 8.42; float gyro_offset_z = -5.87; float gyro_x_corrected = gyro_raw_x - gyro_offset_x; float gyro_y_corrected = gyro_raw_y - gyro_offset_y; float gyro_z_corrected = gyro_raw_z - gyro_offset_z;其次是对加速度计做最小二乘拟合标定。这里的思路是:让传感器在多个姿态下静止,记录加速度计输出和已知重力向量(单位向量),通过最小二乘求取零偏、尺度因子和轴间误差。对初学者来说,如果不需要很高精度,可以只做陀螺仪零偏标定和加速度计零偏标定。下面这段代码展示了最基本的最小二乘标定思路:
// 采集6个姿态的数据,每个姿态静止1秒 // 姿态1: 水平朝上 // 姿态2: 水平朝下 // 姿态3: 竖立X轴朝上 // 姿态4: 竖立X轴朝下 // 姿态5: 竖立Y轴朝上 // 姿态6: 竖立Y轴朝下 // 分别记录ax, ay, az的平均值,然后计算零偏(6个姿态下同一轴输出相加/2) float acc_bias_x = (acc_meas_x_up + acc_meas_x_down) / 2.0f; float acc_bias_y = (acc_meas_y_up + acc_meas_y_down) / 2.0f; float acc_bias_z = (acc_meas_z_up + acc_meas_z_down) / 2.0f;这种六位置标定法虽然不完全,但应对大多数机器人项目足够了。更高精度的标定需要转台,不是一般开发环境能搞定的。
然后是数据预处理。我在真实项目中通常会对加速度计数据做一次滑动平均(窗口大小5-10),对陀螺仪数据不做平滑处理,因为陀螺仪数据进入微分方程后需要快速响应。加速度计平滑过度会导致姿态角跟随变慢,必须在抗噪和响应速度间取舍。
3.3 四元数姿态解算代码实现
有了标定后的数据,就可以进入核心解算环节。我给出一个基于互补滤波的完整代码框架,这个框架我在几个机器人项目中都用过,稳定性和实时性都还过得去。
// 姿态四元数全局变量 float q0 = 1.0f, q1 = 0.0f, q2 = 0.0f, q3 = 0.0f; void AttitudeUpdate(float gx, float gy, float gz, float ax, float ay, float az, float dt) { float norm; float vx, vy, vz; float ex, ey, ez; // 1. 加速度计归一化,得到期望重力方向 norm = sqrtf(ax*ax + ay*ay + az*az); if (norm < 1e-6f) return; // 防止除以0 ax /= norm; ay /= norm; az /= norm; // 2. 由当前四元数估计重力方向向量 vx = 2*(q1*q3 - q0*q2); vy = 2*(q0*q1 + q2*q3); vz = q0*q0 - q1*q1 - q2*q2 + q3*q3; // 3. 叉积计算误差:加速度计测量与估计向量之间的误差 ex = (ay*vz - az*vy); ey = (az*vx - ax*vz); ez = (ax*vy - ay*vx); // 4. 误差经过PI控制器后补偿到陀螺仪 // 比例系数Kp控制收敛速度,积分系数Ki控制零偏消除 float Kp = 1.2f; float Ki = 0.05f; static float exInt, eyInt, ezInt; exInt += ex * Ki * dt; eyInt += ey * Ki * dt; ezInt += ez * Ki * dt; gx += Kp*ex + exInt; gy += Kp*ey + eyInt; gz += Kp*ez + ezInt; // 5. 一阶龙格-库塔法更新四元数 float q0_dot = 0.5f*(-q1*gx - q2*gy - q3*gz); float q1_dot = 0.5f*(q0*gx + q2*gz - q3*gy); float q2_dot = 0.5f*(q0*gy - q1*gz + q3*gx); float q3_dot = 0.5f*(q0*gz + q1*gy - q2*gx); q0 += q0_dot * dt; q1 += q1_dot * dt; q2 += q2_dot * dt; q3 += q3_dot * dt; // 6. 四元数归一化,防止模长偏离1 norm = sqrtf(q0*q0 + q1*q1 + q2*q2 + q3*q3); q0 /= norm; q1 /= norm; q2 /= norm; q3 /= norm; }这段代码的核心逻辑是:用陀螺仪积分更新姿态,同时用加速度计测量值对积分结果进行“纠偏”。纠偏的原理是通过叉积计算两个重力向量之间的误差,然后利用PI控制器把误差反馈到陀螺仪角速度上。这个“互补”思想贯穿整个算法。
参数Kp和Ki的选择需要注意。Kp越大,从加速度计纠偏的速度越快,但过大会引入振动噪声;Ki太小零偏消除效果差,过大会导致角度过冲。我调参的经验是:先设Ki为0,调Kp到姿态响应稳定;再从小到大加Ki,直到静止时角度不再漂移。这个方法屡试不爽。
如果你要做偏航角(Yaw)的估计,仅仅靠加速度计还不够,因为加速度计只能纠正横滚和俯仰,无法提供偏航参考。必须在系统中加入磁力计(如HMC5883L),用地球磁场方向作为偏航角的参考。这条路我建议先把横滚俯仰做扎实了再走,不然一次引入三个轴的数据融合,排查问题的难度会直线上升。
最后,四元数转换为欧拉角输出:
float roll = atan2f(2*(q0*q1 + q2*q3), 1 - 2*(q1*q1 + q2*q2)); float pitch = asinf(2*(q0*q2 - q1*q3)); float yaw = atan2f(2*(q0*q3 + q1*q2), 1 - 2*(q2*q2 + q3*q3)); // 结果为弧度,转换为角度需要乘以57.29578这里要注意 asinf 的输入范围是[-1, 1],一旦四元数没有归一化完全,可能出现超出范围导致返回NaN的情况,所以在转换前一定要确保四元数是单位四元数。我在早期调试时就遇到过pitch角突然变成“nan”的问题,调试了很久才发现是四元数模长漂移导致的。
3.4 速度与位置解算的一次积分与二次积分
姿态解算完成后,下一步是速度与位置解算。这一步原理很简单,但工程实现上有不少讲究。
基本原理是:把加速度计测量值经过姿态矩阵变换到导航坐标系(这里以东北天坐标系为例),减去重力加速度,得到载体运动的真实加速度。然后再一次积分得到速度,二次积分得到位置。
用公式表示:
- 加速度计测得的是“比力”f = a - g(即传感器感受到的力/质量),需要加回重力才能得到真实加速度 a
- 把 a 转换到导航坐标系(通常是水平坐标系): a_n = R * a_b,其中 R 是姿态旋转矩阵
- 剔除重力分量:a_n[2] -= g
- 积分速度:v += a_n * dt
- 积分位置:p += v * dt
代码可以这样写:
// 假设已经得到四元数,先构造旋转矩阵 float r11 = 1 - 2*(q2*q2 + q3*q3); float r12 = 2*(q1*q2 - q0*q3); float r13 = 2*(q1*q3 + q0*q2); float r21 = 2*(q1*q2 + q0*q3); float r22 = 1 - 2*(q1*q1 + q3*q3); float r23 = 2*(q2*q3 - q0*q1); float r31 = 2*(q1*q3 - q0*q2); float r32 = 2*(q2*q3 + q0*q1); float r33 = 1 - 2*(q1*q1 + q2*q2); // 将加速度计测量值(单位 g)转换到导航坐标系 // 首先需要把原始ADC值转换为g:acc_g = raw / 16384.0f float acc_nx = r11*acc_gx + r12*acc_gy + r13*acc_gz; float acc_ny = r21*acc_gx + r22*acc_gy + r23*acc_gz; float acc_nz = r31*acc_gx + r32*acc_gy + r33*acc_gz; // 剔除重力分量(假设导航坐标系z轴向上,正常的东北天坐标系) acc_nz -= 1.0f; // 因为加速度计以g为单位,重力在z轴分量为1g // 一次积分求速度 vel_x += acc_nx * dt; vel_y += acc_ny * dt; vel_z += acc_nz * dt; // 二次积分求位置 pos_x += vel_x * dt; pos_y += vel_y * dt; pos_z += vel_z * dt;这里有一个关键陷阱:位置二次积分是灾难性的。加速度计即使只有很小很小的零偏残余,二次积分后误差会随时间的三次方增长。举个例子,假设加速度计零偏只有0.01g,10秒后位置误差大约会达到5米左右。这就是为什么纯惯性导航定位只能维持很短暂的时间,必须借助外部信息修正。
因此,在实际工程中,我几乎从不对位置做长时间纯积分。常见的做法是:
- 在短时间内(几秒钟)用惯导积分结果作为位置估计
- 利用零速修正(ZUPT)——当检测到载体静止时,把速度强制归零,同时重新估计加速度计零偏
- 融合外部传感器如GPS、里程计、视觉,用卡尔曼滤波来抑制漂移
如果你是拿惯性导航做轮式机器人,那位置解算还有一个更好的替代方案:底盘运动学解算。下面章切接上来聊这个问题,因为很多初学者把这两个概念混在一起。
4. 一个容易混淆的延伸:惯性导航与轮式底盘运动解算
4.1 麦克纳姆轮运动学解算
在网络搜索热词里,“麦轮运动解算”和“全向轮底盘解算”都出现了。很多做机器人的朋友会把这些和惯性导航混为一谈,我得说清楚:这是个完全不同的解算问题。
麦克纳姆轮运动学解算解决的是:已知底盘目标速度(vx, vy, 角速度ω),如何计算四个轮子的转速。它属于运动学正解/逆解问题,与惯性导航的“姿态解算+积分定位”有着本质区别。惯性导航告诉你车在哪里、朝向哪里,底盘解算告诉你每个轮子转多快才能到达那里。
麦克纳姆轮底盘的逆运动学公式是这样的,设底盘中心速度为(vx, vy, ω),四个轮子转速分别为:
w1 = (vx - vy - (Lx + Ly)*ω) / r w2 = (vx + vy + (Lx + Ly)*ω) / r w3 = (vx + vy - (Lx + Ly)*ω) / r w4 = (vx - vy + (Lx + Ly)*ω) / r这里的 Lx 是底盘中心到轮子前后距离的一半,Ly 是左右距离的一半,r 是轮子半径。注意不同麦轮安装方式(X型或Y型)符号会不同,需要根据实际装法调整正负号。常见的方法是:定义底盘右前方轮子为1号轮,顺时针编号,按一定的辊子方向确定每个轮子的公式。
我遇到的初学者最常见的错误是:拿着公式直接套用,结果发现“前进”变成了“横移”。这是因为麦轮安装方向判断错误。判断方法很简单:拿起一个麦轮,观察辊子(小滚轮)轴线方向,如果辊子轴线指向底盘中心,则该轮为左旋轮,另一个方向为右旋轮。安装时左旋轮和右旋轮的布局决定了解算公式的正负号。
4.2 全向轮底盘解算
全向轮(Omni-wheel)与麦克纳姆轮原理类似,但布局不同。典型的三轮全向轮底盘,三个轮子互成120°分布,逆运动学公式也不一样:
w1 = (-0.5*vx + 0.866*vy + L*ω) / r w2 = (-0.5*vx - 0.866*vy + L*ω) / r w3 = (vx + L*ω) / r这里的坐标定义和轮子的位置方向有关。三轮全向轮最大的优点是结构简单、控制方便,但每个轮子的负载能力不如麦轮。四轮全向轮则可以提供更好的稳定性,但控制系统会更复杂一些。
回到本章的主题:为什么要讲这些?因为在实际项目中,惯性导航与运动解算是配合使用的关系。我举一个实际的场景:一台装了麦克纳姆轮的AGV小车,要精确运动到指定位置并保持姿态。导航决策层输出目标速度(vx, vy, ω),底盘运动学解算把这组速度转换为四个轮子的目标转速,底层PID控制每个轮子达到目标转速,最后惯性导航模块实时反馈小车当前的位置和姿态,形成闭环。整个过程缺一不可。
5. 常见问题排查:我踩过的坑,你大概率也会遇到
5.1 静止时角度漂移严重怎么办
这是最常见的问题。现象是:把传感器放在桌面上,姿态角一直在缓慢飘,虽然幅度不大,但根本无法用于精确控制。
我按可能性从高到低排查:
陀螺仪零偏没有对准。零偏不是固定不变的,它随温度漂移,标定时20度的零偏,到35度可能就变了。解决方法:如果项目允许,开机后静止1-2秒,实时采样计算零偏,再进入导航模式。
互补滤波的参数Ki太小。积分项Ki的作用就是消除稳态零偏误差,如果Ki为0,陀螺仪零偏完全没被补偿,自然一直飘。增大Ki到合适值,角度漂移会明显改善。
四元数更新频率太低。我见过有人用10Hz的更新频率做姿态解算,陀螺仪数据延迟太大,积分误差累积严重。建议解算频率至少100Hz,陀螺仪原始采样频率至少要1kHz(MPU6050的ODR设到1kHz)。
5.2 动态运动时角度抖动大
如果静止时姿态很稳,一动起来角度就乱跳,多半是加速度计噪声被放大进来了。加速度计在剧烈振动环境下,输出噪声很大,如果互补滤波的alpha值偏小(即更信任加速度计),那么姿态角就会跟着振动抖。
解决方案有两类:
- 降低alpha中加速度计的比重,比如从0.95升到0.98,让陀螺仪积分主导姿态更新。
- 对加速度计数据做滤波处理,滑动平均或低通滤波都行。但要注意:滤波会引入相位延迟,造成动态响应迟钝。可以在陀螺仪路径做高通补偿,来抵消滤波带来的滞后感。
5.3 卡尔曼滤波发散
很多人在姿态解算稳定后,想把互补滤波换成卡尔曼滤波。结果一跑就发散——角度变成NaN,或者状态估计完全偏离真实值。
我排查这类问题的经验顺序是:
- 检查状态转移矩阵和观测矩阵是否写对,尤其是离散化处理,这一步最常见出错。
- 检查过程噪声协方差Q和测量噪声协方差R的比值。Q/R过大,滤波器过度信任陀螺仪,发散;Q/R过小,过度信任加速度计,噪声大。一般从 Q/R = 0.01 开始调。
- 检查初始化状态是否合理,P矩阵初始化过大或过小都会影响收敛,一般设为单位阵乘以一个合适的量级即可。
卡尔曼滤波不是“装上就能用”的黑盒,它对你的模型准确度非常敏感。我见过有人只改了Q矩阵的一个元素,整体效果就完全不同。
5.4 位置积分结果根本没法看
如果你尝试用纯惯性导航积分位置,大概率会得到“位移越算越大,最后飘到不知道哪里去了”的结果。这不是你的代码问题,这是纯惯导的本质缺陷。
我的建议是:
- 永远不要试图用纯惯导积分位置超过10秒。超过后误差会大到无法使用。
- 如果需要定位,请立刻引入外部辅助信息,比如轮式里程计、GPS、UWB、视觉SLAM。
- 在室内机器人场景,我的做法是:惯导提供高频姿态和短时位移增量,轮式里程计提供长时间稳定位移,两者通过卡尔曼滤波融合。效果远比单独用任何一方要好。
6. 从解算到系统:一次完整的惯性导航集成体验
写到这里,我想把手头一个实际项目的完整流程串一遍,方便你理解前面这些东西是如何配合工作的。
我之前做过一个室内巡检机器人,底盘是四轮麦克纳姆轮,主控用STM32F427,IMU用MPU9250(MPU6050的升级版,多了磁力计),还配了编码器。整个导航架构是这样的:
- 底层:电机PID控制,用编码器反馈实现精准转速闭环。
- 运动学层:接收上位机目标速度(vx, vy, ω),通过麦轮逆运动学公式解算出四个轮子的目标转速。
- 姿态层:MPU9250的陀螺仪和加速度计经过标定、互补滤波(后来换成了卡尔曼滤波),输出机器人的roll, pitch, yaw。roll和pitch用于检测机器人是否倾斜,如果过大就触发急停;yaw用于闭环控制机器人转向。
- 定位层:轮式里程计根据四个轮子的转速推算位移,IMU融合到里程计数据中,抑制打滑引起的误差。
- 导航层:定位结果送给路径规划模块,规划模块输出目标速度,形成完整闭环。
在这个系统中,姿态解算的质量直接影响整个系统的稳定。我记得有一次调试,机器人转向时yaw角度响应太慢,导致转向过冲严重。排查发现是互补滤波的Kp调小了,姿态更新跟不上实际转动。把Kp从0.8升到1.5后,转向响应立刻改善。这个细节让我印象很深:滤波参数调优,不能只看静止效果,必须动态测试。
另外,这个项目里最折磨我的一个问题是磁力计的硬磁干扰校准。MPU9250的磁力计在室内环境中受到电机磁场和钢板结构的影响,yaw角度会随机器人的位置不同而偏向。我花了整整两天做硬磁校正和椭球拟合,最终才保证yaw误差在±3度以内。如果项目对偏航角精度要求高,磁力计标定这一关是绕不开的。
经验分享到这里,最后说一点个人体会吧。惯性导航解算这个领域,看着数学公式多、理论门槛高,但实际上手之后你会发现,真正难的不是算法推导,而是对误差的理解和对数据质量的把控。同一个算法,数据标定做得好不好、采样时序稳不稳,输出质量可以天差地别。所以如果你的解算效果不理想,先别急着换算法,回头检查一下传感器的原始数据质量,往往问题就出在源头上。