1. 项目概述与整体思路
1.1 为什么把这条链路单独拎出来总结
做惯导这几年,我最深的一个体会是:很多人拿到捷联惯导系统(SINS)的第一反应是去翻姿态更新算法,觉得那才是核心。但实际上,一个完整的惯导工程问题,从来不是某一两个算法能覆盖的,而是从系统上电那一刻起,就进入了一条环环相扣的链路——初始对准告诉你“我在哪、朝哪”,位置标定告诉你“我的起点怎么确认”,INS姿态更新负责“接下来的每一毫秒怎么走”,GPS/INS组合则解决“长时间走偏了怎么拉回来”。任何一个环节出了问题,后面的所有输出都是错的。
这条链路本身,就是一个完整的“捷联惯导从启动到运行”的最小闭环。我这次把四个模块放在一起总结,思路很简单:按系统实际运行的时序来走一遍,从静基座对准开始,一直讲到组合导航输出,把每个阶段的原理、数学基础、工程实现、常见坑全部串起来。这样不管你是刚入门的新人,还是已经跑过一版导航程序的开发,都能找到对自己有用的那一段。
1.2 四个模块如何串成一条闭环
用一句话概括这条链路:初始对准就是给系统一个“初始姿态基准”,位置标定提供“初始位置基准”,姿态更新解算“姿态怎么随时间变化”,GPS/INS组合用外部观测来“修正内部累积误差”。
这四个模块放在一起看,其实对应了一个隐含的逻辑:INS本身是递推系统,任何初始误差和累积误差都会随时间和运动逐级放大,所以“起点准不准”和“过程怎么修”同样重要。我把整个项目拆成这样四个环节,也是按照实际项目排期来的——对准和标定属于准备阶段,姿态更新是主解算阶段,组合是后处理/融合增强阶段。这样一条线走下来,你会发现每个模块的输入输出其实是互相咬合的,而不是孤立的一堆公式。
2. 初始对准:一切误差的起点
2.1 对准的本质:在“不知姿态”的状态下确定初始姿态矩阵
捷联惯导有一个最基本的逻辑:所有加速度计的输出都在载体坐标系(b系),而我们导航需要的是导航坐标系(n系,通常是当地水平东北天坐标系)下的量。要把b系的比力投影到n系,必须有一个姿态矩阵( C_b^n )在手上。但系统刚上电的时候,这个矩阵是个未知数,陀螺还没开始积分,加速度计也只能测到当前的重力分量。所以初始对准的问题,说白了就是:在没有任何历史信息的情况下,仅凭传感器当前输出,把( C_b^n )的初值估出来。
这里要补充一个概念,免得新手被绕晕。对准分两个层次:粗对准和精对准。粗对准解决“大致姿态对不对”的问题,利用的是双矢量定姿原理——在静基座下,重力矢量在n系中是( [0 \ 0 \ g]^T ),而地球自转角速度矢量在n系中是( [0 \ \omega_{ie}\cos L \ \omega_{ie}\sin L]^T )(L为当地纬度),这两个矢量方向固定且不共线;同时加速度计能测到重力在b系上的分量,陀螺能测到地球自转在b系上的分量。于是问题就变成了:已知两个不共线矢量在两套坐标系下的投影,求两坐标系间的旋转矩阵。这就是经典的Vahramov/双矢量定姿。
2.2 静基座粗对准的工程实现与精度评估
粗对准的数学实现,我在项目里用的是直接构造中间坐标系的方法。把重力矢量和地球自转矢量分别记为( g^n=[0\ 0\ -g]^T )、( \omega_{ie}^n=[0\ \omega_N\ \omega_U]^T )(( \omega_N=\omega_{ie}\cos L ),( \omega_U=\omega_{ie}\sin L )),在机体系下测量值分别是( g^b )和( \omega_{ie}^b )。构造两个辅助矢量:
[ V_1^n = g^n,\quad V_2^n = g^n \times \omega_{ie}^n ]
[ V_1^b = g^b,\quad V_2^b = g^b \times \omega_{ie}^b ]
再由( V_3^n = V_1^n \times V_2^n )、( V_3^b = V_1^b \times V_2^b )组成三组不共线的基向量,最终姿态矩阵为:
[ C_b^n = \begin{bmatrix} (V_1^n)^T \ (V_2^n)^T \ (V_3^n)^T \end{bmatrix}^{-1} \begin{bmatrix} (V_1^b)^T \ (V_2^b)^T \ (V_3^b)^T \end{bmatrix} ]
工程上有个细节要注意:陀螺测地球自转角速度,实际上是在“测一个很小的量”。地球自转角速度约( 7.29\times 10^{-5} ) rad/s,MEMS陀螺的零偏通常比这个值大不少,直接用原始数据做双矢量定姿,得到的航向角误差可能到几度甚至十几度。所以粗对准在工程实现时,不能拿一帧数据就解算,一般要取几秒到几十秒的平均值,等效于把白噪声滤掉一部分。我自己的通用做法是:先取30~60秒静态数据,分别对加速度计和陀螺输出做算术平均,再拿这两个平均后的矢量去解算初值。这样粗对准的航向角精度,在光纤陀螺级别器件上可以做到0.1°以内,MEMS级别能做到1°~2°。
提示:粗对准的核心限制不在于算法,而在于传感器对地球自转分量的可观性。纬度越高,水平方向的地球自转分量越小,对准越困难。
2.3 精对准与失准角估计的思路
粗对准给了一个“大概对”的初始姿态,但残存的误差(称为失准角)会引起后续导航误差的持续增长,所以必须做精对准把它进一步压小。我的理解里,精对准在静基座条件下本质上是利用加速度计和陀螺的输出去估计三个失准角,尤其是航向失准角。
精对准的过程,是把系统引入误差状态空间,建立小失准角的线性误差模型。设平台失准角为( \phi=[\phi_E\ \phi_N\ \phi_U]^T ),静基座下速度误差微分方程为:
[ \delta \dot{V}^n = - \phi^n \times f^n + \nabla^n ]
其中( f^n )是比力,( \nabla^n )是加速度计零偏在n系下的投影。再加上失准角误差方程:
[ \dot{\phi} = -\omega_{in}^n \times \phi - \varepsilon^n ]
这两个方程合在一起,再加上位置误差方程,就构成了一个线性时不变系统。工程上我一般取5~10维状态量,包括三个速度误差、三个失准角、三个陀螺零偏和两个水平加速度计零偏,用标准Kalman滤波做估计。量测取速度误差——静基座下理想速度是零,速度计(由加速度计积分而来)的输出就是速度误差,这个误差里包含了失准角的信息。
Kalman滤波的好处是,它不仅能估计失准角,还能顺带估计出陀螺和加速度计的常值零偏。比如水平陀螺零偏和水平失准角之间是耦合的,因为水平陀螺零偏引起的角速度误差,和水平失准角引起的重力分量误差,会同时体现在水平速度误差的加速度中。靠滤波器多长时间的收敛来分辨两者,这就要靠系统本身的可观性了。按我的经验,静基座对准时间在5~10分钟,光纤陀螺系统水平失准角能做到10角秒以内,航向失准角能收敛到0.05°以内,主要由陀螺的方位陀螺零偏决定。
2.4 对准阶段必须注意的几个工程细节
这一节说几个文档里不写,但实际跑系统经常翻车的地方。
第一,静基座对准时加速度计的输出不能直接当作重力矢量用。飞机的振动、风载、平台上空调的震动都会引入高频噪声,甚至低频扰动。我一般会在前端加一个低通滤波器,截止频率设在1~5Hz,把结构振动滤掉,同时对准时间内做“分段平均+剔除粗差”,简单说就是把每段数据算个均值,如果某段均值和整体均值差太多,说明这段时间有冲击或运动,直接剔掉。
第二,粗对准和精对准之间要平滑过渡。粗对准解出来的姿态矩阵和精对准滤波器初值之间,一般会有几个角秒到几十角秒的偏差,如果直接切换,会在这个时刻造成速度误差的跳变,进而影响滤波器收敛。我的做法是,把精对准滤波器的状态初值设置为粗对准结果对应的失准角,这样两个阶段无缝衔接。
第三,“静基座”三个字是有条件的。真实的载体不可能绝对静止,发动机怠速、海浪波动、风载都会造成角运动和线运动。轻微的角运动会让陀螺敏感出角速度,这实际上是载体自身的运动,不是传感器噪声,会让系统误以为在各种转动,进而在速度误差中激励出额外的分量。对于这类环境,要么加长对准时间取平均,要么用更高级的动基座对准方法(比如利用GPS速度信息辅助的OBA对准),这个项目我没展开,但要知道有这条路径。
3. 位置标定:看似简单却容易被忽视的环节
3.1 初始位置误差对后续导航结果的影响
位置标定在惯导系统里,就是上电时给系统装订一个初始的纬度、经度和高度。很多刚接触惯导的人会觉得,不就是设三个数吗,能有什么好讲的?但只要顺着递推方程走一遍,就会发现它的影响比想象中大得多。
惯导的位置是由速度积分得到的,而比力方程里的哥氏项、离心项都和位置(纬度)有关,更重要的是,姿态更新方程里需要用到的地球自转分量、传输角速度分量,也都和纬度直接相关。所以初始纬度误差不只是一个“起点偏了多少”的问题,它会持续地影响后续每一帧的姿态和速度解算,造成一个系统性偏差。我们实际算过一笔账:初始纬度误差1角分(约1.85km),在中等纬度地区,纯惯导解算1小时后,由这个误差引起的水平位置误差粗估在几百米量级,考虑到它还是以振荡形式出现的舒勒周期误差,实际影响会更复杂。
高度误差同样不能忽略。特别是对于飞机这类高动态平台,初始高度误差会直接进入重力模型补偿,而重力补偿偏差会在垂直通道里被正反馈放大——纯惯导垂直通道本质上是不稳定的。所以,位置标定看似是“填三个初始值”,实则直接决定了系统后续所有输出的准确性。
3.2 位置装订的工程细节与注意事项
位置装订在工程实现层面,有几个容易被忽略的坑。
第一个是精度要求。如果你用MEMS惯导做车载导航,GPS给出的位置精度在米级,直接装订就够了,不差这点误差。但在高精度的航空级系统里,初始位置的微小误差会被舒勒振荡放大,所以装订位置最好能达到10米以内,这通常需要借助差分GPS或地面基准站给出。我有时候看到有人直接在代码里写死一个坐标来测试,结果后面导航位置越飞越偏,还以为是姿态算法的问题,实际上从初始位置就开始错了。
第二个是高度通道的处理。纯惯导的高度通道不稳定,很多系统干脆不直接用惯导高度,而是引入气压高度表或GPS高度作为辅助。在位置标定阶段,这就意味着你装订的初始高度最好来自和组合导航相同的高度源,避免两个海拔基准不一致带来跳变。我做过一个项目,GPS高度是基于WGS84椭球的椭球高,而气压高度是修正海压高度,两者之间差一个大地水准面差距,在部分地区能差几十米,如果不做转换直接切换,组合滤波器的位置量测就会产生一个很大的“假误差”。
第三个是单位制和坐标系的统一。经纬度用度还是弧度、高度用米还是英尺、坐标系是WGS84还是CGCS2000(两者椭球参数有微小差异),这些低级错误在工程中是最常见的。我个人的习惯是,在代码里所有内部计算统一用“弧度、米、秒”作为基本单位,接口处再做转换,并且写一个单元测试去验证经纬度转换的往返一致性。这个习惯帮我挡掉过不止一次线上事故。
3.3 位置标定与初始对准的衔接逻辑
位置标定和初始对准在逻辑上是并列的,但在系统流程上是先有位置、后做对准。原因是,对准过程需要用到当地地球自转角速度的分量,而分量大小由纬度决定。所以系统上电后的标准流程是:
- 读取/装订初始位置(纬度、经度、高度);
- 根据纬度计算地球自转角速度在导航系下的投影( \omega_N )、( \omega_U );
- 进入初始对准,用该值参与姿态解算。
有一类系统支持“对准后再改变位置”的操作,但绝大多数座机式系统不支持——因为一旦对准完成,失准角的最优估计与初始位置绑定在一起,中途改位置会破坏滤波器的一致性。所以位置标定一定要在系统进入对准状态之前完成,并且要有一个“位置确认”的人机交互环节,防止装错。
4. INS姿态更新:导航解算的核心引擎
4.1 姿态表示方法与更新方程的选型逻辑
姿态更新是捷联惯导里最核心的模块,它要回答的问题是:给定陀螺输出的角速度,怎么实时更新姿态矩阵( C_b^n )。在正式展开之前,姿态的表示方法得先理清楚。
欧拉角最直观,俯仰、横滚、航向三个参数,人一看就懂,但它有个致命问题:俯仰角接近±90°时会出现万向锁,方程退化。方向余弦矩阵没有奇异问题,但是9个参数、9个微分方程,计算量偏大。四元数用4个参数描述姿态,没有奇异,更新方程只有4个,计算效率高,是目前工程上的绝对主流。我们在项目里选用的是四元数表示+方向余弦矩阵输出的组合方式:内部更新用四元数,输出姿态角时再转换成欧拉角。这样做还有一个好处:四元数本身天然适合做多子样圆锥补偿,因为它是从旋转矢量直接构造出来的。
姿态更新方程的标准形式是:
[ \dot{Q} = \frac{1}{2} Q \otimes \omega_{nb}^b ]
其中( \omega_{nb}^b )是载体相对导航系的角速度在b系的投影。由于( \omega_{nb}^b = \omega_{ib}^b - \omega_{in}^b ),而( \omega_{in}^b = C_n^b \omega_{ie}^n + C_n^b \omega_{en}^n ),分别对应地球自转角速度和载体运动引起的导航系旋转角速度。工程实现时,这两项都要根据当前纬度和速度实时计算,不能省略。如果载体速度很高(比如飞机),( \omega_{en}^n )这一项会明显影响姿态精度,我曾经见过有人为了省事忽略这一项,结果在高速机动时航向误差每分钟多漂了好几倍。
4.2 圆锥运动与等效旋转矢量补偿
四元数更新看起来简单,实际工程里真正的坑是圆锥运动。圆锥运动是一种经典的非交换误差场景:载体的角速度矢量在空间中以圆锥轨迹旋转,尽管每个瞬间的角速度很小,但在一段时间内,姿态的方向变化不等于各个瞬间角速度积分的简单叠加,因为旋转不满足交换律。如果不做补偿,姿态解算会出现一个随时间线性增长的系统性漂移,这就是圆锥误差。
解决思路是用等效旋转矢量。设从( t_{k-1} )到( t_k )的姿态变化可以用一个旋转矢量( \phi )描述,它的微分方程为:
[ \dot{\phi} = \omega + \frac{1}{2}\phi \times \omega + \frac{1}{12}\phi \times (\phi \times \omega) ]
在惯导解算的每一个周期内,如果陀螺采样频率足够高,可以把( \omega )的变化近似为多项式,代入方程积分,得到的( \phi )就包含了圆锥补偿项。工程上最常见的实现是“多子样算法”:在一个解算周期内,采集陀螺的多个角增量样本,用它们的叉积来近似补偿圆锥误差。
以常用的双子样算法为例,设一个姿态更新周期内有相邻的两次角增量采样( \Delta\theta_1 )、( \Delta\theta_2 ),则补偿后的旋转矢量近似为:
[ \Phi = \Delta\theta_1 + \Delta\theta_2 + \frac{2}{3}(\Delta\theta_1 \times \Delta\theta_2) ]
后面这个叉积项就是圆锥补偿项。采样次数越多(三子样、四子样),补偿精度越高,但计算量和延迟也越大。实际工程里,我见过很多系统用200Hz的陀螺采样、100Hz的姿态更新,双子样或三子样,在常规机动的条件下圆锥误差基本能被压到可忽略的水平。但要注意,在振动比较激烈的平台上,圆锥误差依然可能成为主要误差源,那时就需要采用频率更高的陀螺采样甚至专用的抗圆锥算法。
4.3 速度更新的比力方程与划桨补偿
姿态更新解决“往哪转”的问题,速度更新解决“走多快”的问题。捷联惯导的速度解算是基于比力方程:
[ \dot{V}^n = C_b^n f^b - (2\omega_{ie}^n + \omega_{en}^n) \times V^n + g^n ]
这个方程的含义要解释清楚:加速度计测的是比力(载体受到的非引力加速度),要得到真正的导航系加速度,需要扣除哥氏加速度、离心加速度,并加上重力加速度。工程实现时,( f^b )是加速度计输出的比力,( C_b^n )是当前姿态矩阵,( (2\omega_{ie}^n + \omega_{en}^n) \times V^n )这项在低速车载场景里很小,但在高速高机动场景里非常关键。
速度更新同样有“划桨效应补偿”,它和圆锥补偿是“对偶”的:角运动与线运动耦合时,速度的积分也会出现类似的非交换误差。在速度解算周期内,加速度计的输出和陀螺的输出如果不做交叉补偿,速度和位置会累积额外误差。具体的算法实现里,会在一个速度更新周期内取多个加速度计采样值,用加速度增量与角增量的叉积来补偿划桨误差。
4.4 姿态更新流程中的实操要点
写到这里,我要强调一个实现层面的关键点:四元数的归一化。四元数在连续更新过程中,由于计算舍入误差和离散化误差,模值会缓慢偏离1。如果长期不修正,姿态矩阵会渐渐不再正交,造成姿态漂移。所以每完成一步更新,都要做一次归一化:
[ Q = \frac{Q}{|Q|} ]
这个操作非常便宜,但很多人会漏。我接手过一套别人的代码,姿态越飞越偏,查了很久最后发现就是四元数没有归一化,一年多的积累误差让姿态矩阵早已失去正交性。另外,姿态更新周期要固定,否则离散化引入的误差不稳定。我建议用一个定时器中断或者实时操作系统的高精度定时任务来保证更新周期,而不是在主循环里随便调度。
5. GPS/INS组合:用外部信息抑制发散
5.1 松组合系统的整体架构与状态方程
纯惯导的问题,用一句行话讲就是“误差随时间增长”。即使初始对准完美、器件零偏很小,积分一段时间的误差还是会累积。GPS的优点是长期稳定、绝对误差有界,缺点是更新率低(通常1~10Hz)、信号容易受遮挡和干扰。GPS/INS组合就是让两者优势互补:惯导负责高频的、平滑的姿态和位置输出,GPS负责定期“校准”,抑制惯导误差发散。
组合导航的工程选型上,松组合(Loosely Coupled)是应用最广、最容易落地的一种。它把GPS解算出来的位置和速度作为滤波器的观测量,与惯导解算的位置和速度求差,作为卡尔曼滤波器的量测输入。松组合的好处是结构清晰,GPS和INS各自保持独立的解算,互不干扰,故障隔离也容易实现。
我项目里用的松组合滤波器是标准的15维状态量,包括:三个姿态误差(失准角)、三个速度误差、三个位置误差、三个陀螺零偏、三个加速度计零偏。状态方程就是前面章节介绍的误差传播方程的离散化形式,加上陀螺和加速度计零偏的随机游走驱动。这个过程有点繁琐,但每一步都有物理含义:速度误差由失准角和加速度计零偏驱动,位置误差由速度误差积分而来,失准角由陀螺零偏驱动。把这套误差链理解透了,滤波器的设计就成功了一大半。
5.2 量测方程、杆臂补偿与滤波更新策略
松组合的量测方程比较直观。GPS给出的位置和速度,与INS解算的位置和速度直接做差:
[ z_k = \begin{bmatrix} P_{INS} - P_{GPS} \ V_{INS} - V_{GPS} \end{bmatrix} = H x_k + v_k ]
其中量测矩阵H决定了状态到量测的映射关系。这里最常见的问题是“杆臂效应”:GPS天线安装位置和IMU中心之间有一个固定的空间距离,载体在转动或加速时,这个距离会让GPS天线处感受到的速度和位置与IMU中心处不同。如果不补偿这个杆臂,量测值里会引入一个与机动相关的误差,直接干扰滤波器。
杆臂补偿的公式是:
[ V_{GPS} = V_{IMU} + \omega_{nb} \times L ]
其中( L )是GPS天线相对IMU的杆臂矢量在b系下的投影。这个补偿看起来简单,但在实际项目里经常被忽略,或者杆臂矢量测量不准,导致机动时组合结果出现明显跳变。我建议在系统标定时专门拿出一个步骤来测量杆臂矢量,并在滤波器初始化时把它作为一个常量参数传入。
滤波更新策略上,我的经验是:GPS量测的更新率不需要很高,1Hz完全够用;关键是把量测噪声协方差矩阵R设得贴合实际。R设得太大,滤波器不信任GPS,收敛慢;R设得太小,滤波器过度信任GPS,会把GPS的噪声引入惯导输出。实际操作中,我一般用一组静态和动态数据先跑一遍,调R的对角线值,直到组合结果在静态时平滑、动态时跟得上为止。
5.3 GPS/INS组合中的故障检测与信息融合策略
GPS信号并不总是可靠的,城市峡谷、隧道、强电磁干扰都会导致GPS定位结果跳变或丢失。如果不做任何检测,滤波器会把错误信息吸收进去,导致组合结果反而比纯惯导更差。
我在项目里做了一组简单的实时故障检测逻辑:
- 新息检测:计算GPS量测与INS预测之间的差值(即新息),如果新息超过某个阈值(比如3倍新息标准差),认为当前GPS量测可疑;
- 连续丢弃检测:如果连续多帧GPS量测都被拒绝,则暂时切断GPS量测更新,系统自动退化为纯惯导模式,直到GPS重新稳定;
- 稳定性检测:检查GPS定位的协方差输出,如果协方差异常大,说明GPS解算质量差,跳过该帧。
这套逻辑虽然简单,但非常实用。我把它放在组合滤波器的外层,不改变滤波器本身,故障发生时只是控制“量测是否进入更新”,这样实现起来干净利落,也方便后续扩展。
另一个容易踩坑的地方是双天线/多天线GPS系统的时间同步问题。GPS接收机输出数据有一个内部延迟,一般几十到几百毫秒,如果用了很久的报文却不知道这个延迟,量测和惯导解算在时间上就有一个错位,滤波效果会大打折扣。我建议在组合导航模块设计初期就明确时间戳机制,GPS每个量测都要带时间戳,滤波器里做插值或者延迟补偿,让INS和GPS的数据对齐到同一时刻。这个细节在我经历的项目里,几乎每次都能让组合精度提高一个档次。
6. 常见问题与实战排查经验
6.1 静基座对准时间过长或航向不收敛
这个问题在MEMS惯导上特别常见。现象是水平姿态很快就收敛了,但航向角对准时间很长,或者始终在一个范围内波动。
排查思路是分三步走。第一,确认陀螺零偏是否足够小。前面说过,如果方位陀螺零偏大于地球自转角速度的水平分量(中纬度地区大约( 10^{-5} ) rad/s,即每小时零点几度的量级),航向角在精对准阶段几乎不可能收敛到理想值。MEMS陀螺普遍不满足这个条件,所以航向对准性能差是器件层面的天花板,不是算法能完全弥补的。第二,看载体是否真的静止。如果有人在舱内走动、车辆怠速、风吹抖动,系统会把这些运动当成真实的运动,航向对准必然受影响。第三,检查滤波器模型是否正确,尤其是陀螺零偏是否为随机游走而非常值,以及量测噪声是否设置合理。我见过一个案列,滤波器里的陀螺零偏过程噪声设得过大,导致滤波器把常值零偏也当成可变的,航向就始终收敛不到一个稳定值。
6.2 GPS/INS组合后位置输出出现周期性跳变
现象是:组合结果整体平滑,但每隔一段时间(和GPS更新周期一致)就有一次微小跳变;或者是在转弯/加减速时出现明显的瞬时位置偏移。
先说第一种。如果跳变周期和GPS更新周期一致,多半是GPS量测噪声R设置过小,滤波器对每一个GPS位置都过于信任,相当于把GPS的随机噪声直接叠加进了输出。适当调大R或者对输出做平滑滤波,就能缓解。再说第二种。转弯/加减速时出现瞬时偏移,九成是杆臂补偿没做或者做错了。GPS天线在车顶、IMU在车厢中部,转弯时两者速度方向一致但位置不同,车速越高、转弯越急,杆臂效应越明显。解决方法是精确测量杆臂矢量,并检验加速度计和陀螺的轴是否和杆臂矢量的坐标系定义一致。
注意:杆臂补偿的方向要特别小心,符号搞反的话,机动时误差会比不补偿还要大。建议在平整场地做一个匀速直线、加减速、圆周运动的验证实验,用实测数据去校准。
6.3 组合前后姿态突然跳变
这个问题的典型特征是:INS单独解算时姿态一切正常,一旦切入组合导航模式,姿态输出突然出现一个跳变,然后再慢慢回来。
原因通常是组合滤波器的初始失准角状态和INS当前的姿态误差不一致。比如INS已经单独解算了一段时间,积累了姿态误差,但组合滤波器初始化时假设失准角为零,或者把初始协方差设得太小,导致滤波器一开始“不认为”姿态有误差,于是只靠GPS量测慢慢把误差拉回来,在输出的表现上就是一次跳变。解决方法是:组合滤波器初始化时,把初始协方差设置得宽松一些,或者先以纯惯导模式跑一小段时间,等输出稳定后再切入组合模式。另一种情况是时间同步问题——GPS量测携带的时间戳和INS解算时刻不一致,导致滤波器收到一个“未来时刻的观测量”,产生跳变。这个通过实现时间对齐和缓冲即可解决。
6.4 高动态环境下姿态输出振荡
在剧烈机动(比如无人机做翻滚、飞机大过载盘旋、车辆高速过弯)时,姿态输出出现高频振荡,或者姿态误差明显增大。这时候要分清两种可能。
第一种是姿态更新周期内的圆锥补偿子样数不够。机动越剧烈,角速度变化越快,低阶多子样算法的补偿精度就越差。我试过把双子样换成三子样,同样的机动条件下姿态振荡幅度直接降了一半。第二种是加速度计量程饱和。激烈机动时,比力可能超过加速度计量程,输出削顶,速度更新和姿态更新都会受污染。尤其是用偏置较小的加速度计做高机动载体时,这个问题很隐蔽——静态测试完全正常,一做大过载机动就出问题。排查方法是把加速度计的原始输出录下来做回看,看是否触碰量程。
7. 写在最后的工程体会
这套捷联惯导链路的总结,我按“启动—对准—标定—解算—融合”的顺序写了一遍,基本就是我这些年做惯导项目时脑子里固定的思考框架。每次拿到一个新的惯导系统,不管是做车载、航空还是机器人,我都会按这个顺序去检查:初始对准能不能在预期时间内收敛?初始位置装订的精度够不够?姿态更新有没有做圆锥补偿和归一化?GPS/INS组合的杆臂有没有补偿、时间有没有对齐?
真正做工程和在学校推公式最大的不同,在于每一个公式背后都牵着一堆实际约束。双矢量定姿不复杂,但你要想到陀螺测地球自转分量时信噪比很低;四元数更新不复杂,但你必须每步归一化;组合滤波器的方程也不复杂,但杆臂和时间同步才是决定精度的隐藏杀手。这些点单独拿出来都不是难事,难的是把它们串成一个闭环,并且在实际载体上稳定运行几十个小时不漂、不跳、不发散。
最后再分享一个我个人觉得非常有用的习惯:每次做系统集成时,把对准误差、位置误差、姿态误差、组合后的位置误差画在同一个时间轴上做离线分析。算法表现怎么样、误差主要来自哪一个环节、载体的运动环境对哪一项影响最大,时间曲线一摆出来就一目了然。很多时候你以为的“传感器有问题”,拉出来一看其实是杆臂没补、时间没对齐,这种排查效率比对着代码一行行看要高得多。希望这篇总结能帮你少走一些弯路。