第二章 基础数学知识回顾(一):向量与矩阵基础、坐标系定义、欧拉角与方向余弦矩阵
各位同学,欢迎来到惯性导航的数学基础课。说实话,很多初学者一上来就被各种坐标系和矩阵运算给绕晕了。我当年刚入行时也是这样,总觉得这些东西太抽象,跟实际工程离得太远。直到有一次在调试某型无人机时,因为坐标系定义搞反了,导致导航数据直接发散,飞机差点失控——嗯,从那以后我再也不敢轻视这些基础了。
这一章我们不讲复杂的公式推导,就聊聊你必须要掌握的几样工具:向量与矩阵、坐标系、以及描述姿态的欧拉角和方向余弦矩阵。这些东西,说白了就是惯导系统的“语言”。你学会了它们,后面理解捷联惯导算法就会轻松很多。
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,第一件事就是确认它的轴定义。
这四个坐标系之间的关系,可以用下面这张图来理解:
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