第二章 基础数学知识回顾(一):向量与矩阵基础、坐标系定义、欧拉角与方向余弦矩阵

各位同学,欢迎来到惯性导航的数学基础课。说实话,很多初学者一上来就被各种坐标系和矩阵运算给绕晕了。我当年刚入行时也是这样,总觉得这些东西太抽象,跟实际工程离得太远。直到有一次在调试某型无人机时,因为坐标系定义搞反了,导致导航数据直接发散,飞机差点失控——嗯,从那以后我再也不敢轻视这些基础了。

这一章我们不讲复杂的公式推导,就聊聊你必须要掌握的几样工具:向量与矩阵、坐标系、以及描述姿态的欧拉角和方向余弦矩阵。这些东西,说白了就是惯导系统的“语言”。你学会了它们,后面理解捷联惯导算法就会轻松很多。

2.1 向量与矩阵基础

先说说向量。在惯导里,向量通常表示一个物理量,比如位置、速度、加速度。它有三个分量,对应三维空间的三个轴。我习惯把向量想象成一支箭——有方向,有大小。

向量的基本运算:

  • 加法/减法:对应分量相加减。比如两个速度向量相加,得到合速度。
  • 点积(内积):结果是一个标量。物理意义是一个向量在另一个向量方向上的投影长度乘积。
  • 叉积(外积):结果是一个向量,方向垂直于原两个向量构成的平面。这个在陀螺仪测量角速度时经常用到。

矩阵呢?你可以把它看作一个“变换器”。一个向量乘以一个矩阵,就得到了另一个向量。在惯导里,矩阵最常见的用途就是描述坐标系的旋转。

我个人习惯:在写代码时,我会把向量定义成列向量(3×1矩阵),旋转矩阵定义成3×3方阵。这样乘法顺序就很清晰:v_new = R * v_old。千万别搞反了,否则结果差很多。

举个例子,假设你有一个向量 v = [1, 0, 0]^T,表示沿X轴的单位向量。如果用一个绕Z轴旋转90度的矩阵去乘它,结果就变成了 [0, 1, 0]^T——向量指向了Y轴方向。你看,矩阵就是这么“转动”向量的。

2.2 坐标系定义

坐标系是惯导系统的“参照系”。你想想看,如果没有一个统一的坐标系,你说“飞机向东飞了100米”,这个“东”是相对于谁定义的?所以,我们必须先约定好几个关键的坐标系。

惯导里常用的坐标系有四个,我按从大到小的顺序给你捋一遍:

坐标系 英文缩写 原点 轴定义 用途
地心惯性系 i系 地心 X指向春分点,Z指向北极,Y按右手定则 牛顿力学定律成立的基准
地球系 e系 地心 X指向本初子午线与赤道交点,Z指向北极,Y按右手定则 描述地球上的位置(经纬度)
导航系 n系 载体所在位置 X指向东,Y指向北,Z指向天(ENU) 导航解算的常用参考系
载体系 b系 载体质心 X指向右,Y指向前,Z指向上(右前上) IMU直接测量的坐标系

注意:不同厂家对载体系轴的定义可能不同。有的用“右前上”,有的用“前右下”。我曾经因为没仔细看IMU手册,把加速度计数据直接套用标准公式,结果解算出来的姿态全是反的。所以拿到一个新IMU,第一件事就是确认它的轴定义。

这四个坐标系之间的关系,可以用下面这张图来理解:

惯性导航常用坐标系关系图 i系 地心惯性系 e系 地球系 n系 导航系 b系 载体系 地球自转 经纬度→ENU 姿态变换 IMU测量值在b系 → 转换到n系进行导航解算 → 最终输出经纬度和姿态 💡 核心思路:所有测量和计算最终都要统一到同一个坐标系下 惯导解算通常在n系进行,但IMU原始数据在b系

2.3 欧拉角与方向余弦矩阵

好了,坐标系定义清楚了,接下来要解决一个问题:怎么描述一个坐标系相对于另一个坐标系的旋转?比如,载体系相对于导航系转了多少?

最直观的方式就是欧拉角。它用三个角度来描述旋转:航向角(ψ)、俯仰角(θ)、横滚角(φ)。你可以想象成飞机在空中:先转航向(左右看),再抬头低头(俯仰),最后侧倾(横滚)。

欧拉角的旋转顺序:Z→Y→X(航向→俯仰→横滚)。这个顺序很重要,不同的顺序会得到不同的结果。我习惯用这个顺序,因为它是航空领域最通用的约定。

但是欧拉角有个大问题——万向锁。当俯仰角接近±90度时,航向和横滚会变得无法区分。这在工程上是致命的。所以实际惯导系统里,我们更多用方向余弦矩阵(DCM)来描述姿态。

方向余弦矩阵,说白了就是一个3×3的旋转矩阵。它的每个元素是两个坐标系对应轴之间的夹角的余弦值。比如,C[1][1] 表示b系X轴与n系X轴夹角的余弦。

从欧拉角到DCM的转换公式如下(ZYX顺序):

C_n^b = 
[ cosθ cosψ,  cosθ sinψ,  -sinθ ]
[ sinφ sinθ cosψ - cosφ sinψ,  sinφ sinθ sinψ + cosφ cosψ,  sinφ cosθ ]
[ cosφ sinθ cosψ + sinφ sinψ,  cosφ sinθ sinψ - sinφ cosψ,  cosφ cosθ ]

看着有点复杂是吧?别担心,实际编程时我们直接用现成的函数库。但你要理解它的物理意义:这个矩阵可以把b系下的向量转换到n系下。

我的一个小技巧:验证DCM是否正确,可以检查它的行列式是否为1(正交性),以及它的逆是否等于它的转置。如果这两个条件不满足,说明你的矩阵有问题。我曾经在代码里写错了一个符号,导致行列式变成了-1,结果导航数据全乱了。

最后说一句,欧拉角和DCM是可以互相转换的。从DCM反算欧拉角时,要注意角度范围的判断。比如航向角通常定义在0~360度或-180~180度,不同应用场景要求不同。

避坑指南:我曾经在某个项目中,直接用了数学库的反正切函数计算航向角,结果没考虑象限判断,导致在航向接近360度时跳变到了0度。后来我加了一个unwrap函数,才解决了这个问题。所以,处理角度时一定要小心边界情况。

好了,这一章的内容就到这里。向量和矩阵是工具,坐标系是框架,欧拉角和DCM是描述姿态的语言。这三样东西,是后面所有惯导算法的基础。你先把它们吃透了,后面学捷联惯导算法时就会觉得顺理成章。


公众号:蓝海资料掘金营,微信deep3321