第一章 惯性导航概述

各位同学好,我是老张。在惯导这行摸爬滚打了十几年,今天咱们来聊聊捷联惯导系统的基础。说实话,每次带新人,我都是从这一章讲起。别看它基础,但理解不透彻,后面算法推导你会越看越迷糊。

1.1 惯性导航基本原理

惯性导航,说白了就是「猜」出来的导航。你想想看,它不依赖任何外部信号,全靠自己身体里的加速度计和陀螺仪来推算位置。我刚开始接触时也觉得挺神奇的——一个黑盒子扔到地下,它居然能知道自己在哪。

基本原理其实很简单:

  • 加速度计测量载体受到的比力(也就是除了重力以外的加速度)
  • 陀螺仪测量载体的角速度(转得有多快、往哪个方向转)
  • 对加速度积分一次得到速度,再积分一次得到位置
  • 对角速度积分得到姿态角(俯仰、横滚、航向)

嗯,这里要注意:积分会累积误差。我在项目里见过一个案例,某型无人机起飞时陀螺零偏只差了0.01度/秒,飞了10分钟后位置误差直接漂了上百米。这就是惯导的「原罪」——误差随时间增长。

核心公式(导航方程):

位置更新:    p(t) = p(0) + ∫v(t)dt
速度更新:    v(t) = v(0) + ∫[f(t) - g]dt
姿态更新:    C(t) = C(0) · exp(∫ω(t)×dt)

其中 f 是比力,g 是重力,ω× 是角速度的反对称矩阵。

我的经验:实际工程中,千万别直接用连续积分。一定要用离散化方法,比如四阶龙格-库塔或者双子样算法。我曾经在某个项目中直接用梯形法积分,结果姿态发散得一塌糊涂。

1.2 捷联惯导系统组成

捷联惯导和平台惯导最大的区别是什么?平台惯导有物理平台,陀螺和加速度计装在一个稳定平台上,平台始终跟踪导航坐标系。而捷联惯导呢?传感器直接「绑」在载体上,没有物理平台,全靠计算机算出一个「数学平台」。

一个典型的捷联惯导系统包含以下组件:

组件 作用 我踩过的坑
三轴陀螺仪 测量载体角速度 光纤陀螺对温度敏感,开机需要预热
三轴加速度计 测量载体比力 石英加速度计零偏稳定性最好
导航计算机 运行解算算法 算力不够时,降采样会丢信息
电源管理模块 提供稳定供电 纹波太大会引入噪声

我个人习惯把捷联惯导系统分成三个层次来看:

  1. 传感器层:IMU(惯性测量单元),包含陀螺和加速度计
  2. 算法层:姿态解算、速度位置更新、初始对准
  3. 应用层:组合导航、误差补偿、输出接口

你想想看,这三个层次中哪个最关键?我个人的看法是算法层。传感器再差,好的算法能救回来;传感器再好,算法烂照样发散。我在某次船载试验中就深有体会——同样的IMU,换了套解算算法,定位精度从几百米提升到了几十米。

注意:捷联惯导的「捷联」二字,意味着传感器和载体是刚性连接的。安装时一定要保证IMU的坐标系和载体坐标系严格对齐。我曾经见过一个案例,安装偏了0.5度,结果航向角误差直接导致飞行器偏航。嗯,后来我们专门设计了安装基准面和校准流程。

1.3 坐标系定义与转换

坐标系这东西,说简单也简单,说复杂也复杂。我刚开始学的时候,被各种坐标系绕晕过。其实你只要记住:所有坐标系都是人为定义的,目的是方便描述运动

惯导中常用的坐标系有这几个:

  • 地心惯性坐标系(i系):原点在地心,轴指向恒星。理论上惯性传感器测量值是在这个系下的,但实际工程中我们很少直接用。
  • 地球坐标系(e系):原点在地心,Z轴指向北极,X轴指向本初子午线。这个系跟着地球转。
  • 导航坐标系(n系):通常取「东北天」或者「北东地」。我习惯用东北天,因为高度向上为正,符合直觉。
  • 载体坐标系(b系):原点在载体质心,X轴指向载体前方,Y轴指向右方,Z轴指向下方(右前下)。

坐标系之间的转换,核心就是旋转矩阵。比如从b系到n系的转换矩阵 C_b^n,它包含了载体的姿态信息:

C_b^n = [cosθcosψ,  sinφsinθcosψ-cosφsinψ,  cosφsinθcosψ+sinφsinψ]
        [cosθsinψ,  sinφsinθsinψ+cosφcosψ,  cosφsinθsinψ-sinφcosψ]
        [-sinθ,      sinφcosθ,                cosφcosθ           ]

其中 φ 是横滚角,θ 是俯仰角,ψ 是航向角。

避坑指南:我曾经在某个项目中,把旋转矩阵的转置搞反了。明明传感器输出的是b系下的角速度,我直接用C_b^n去转换,结果姿态解算完全反了。记住:向量从b系转到n系,用C_b^n;从n系转到b系,用(C_b^n)^T

实际工程中,我们通常用四元数来代替旋转矩阵。为什么?因为四元数没有万向锁问题,而且计算量小。我建议你一开始就养成用四元数的习惯,后面做组合导航时你会发现方便很多。

四元数 q = [q0, q1, q2, q3]^T 和旋转矩阵的关系:

C_b^n(q) = [q0²+q1²-q2²-q3²,  2(q1q2-q0q3),      2(q1q3+q0q2)]
           [2(q1q2+q0q3),      q0²-q1²+q2²-q3²,  2(q2q3-q0q1)]
           [2(q1q3-q0q2),      2(q2q3+q0q1),      q0²-q1²-q2²+q3²]

嗯,这里要注意:四元数的归一化。每次更新完四元数后,一定要做归一化处理。否则随着时间推移,四元数的模会偏离1,导致姿态误差。我见过有人忘了这步,结果解算出来的姿态角越来越离谱。

我的小技巧:在代码里,每次姿态更新后都加一行 q = q / np.linalg.norm(q)。养成习惯,能省去很多调试时间。

最后说一句,坐标系转换是惯导的「基本功」。你如果能把坐标系转换搞明白,后面姿态解算、初始对准、组合导航都会轻松很多。我当年就是花了整整一周时间,手推了所有坐标转换公式,才真正理解了惯导的本质。

好了,第一章的内容就到这里。下一章我们开始讲姿态解算的具体算法,到时候会用到今天讲的坐标系知识,记得复习一下。