3. 坐标系与姿态表示:导航坐标系、载体坐标系、姿态角(欧拉角)、四元数基础、旋转矩阵的物理意义
做惯性导航这些年,我最大的体会就是:坐标系搞不清楚,后面全是白搭。你想想看,IMU 输出的数据是相对于它自己身体的,而我们要算的是它在世界里的位置。这中间差了啥?就差一个坐标系变换。
这一节,咱们就把坐标系和姿态表示彻底聊透。我会把我在项目里踩过的坑、总结的经验都倒出来。
3.1 导航坐标系 vs 载体坐标系
先说两个最基础的坐标系。说白了,就是「我在哪看」和「我在哪动」的问题。
3.1.1 导航坐标系(n系)
导航坐标系,也叫参考坐标系。它是个固定不动的坐标系,用来描述物体的位置和姿态。我个人习惯用 NED(北-东-地)坐标系:
- X轴:指向北
- Y轴:指向东
- Z轴:指向地心(向下)
当然,也有用 ENU(东-北-天)的,比如 GPS 常用这个。但做惯导,NED 更顺手。我在做无人机项目时,一开始用了 ENU,结果和飞控的坐标系对不上,折腾了两天才发现是坐标系定义不一致。嗯,从那以后我统一用 NED。
3.1.2 载体坐标系(b系)
载体坐标系是固定在运动物体上的。通常这样定义:
- X轴:指向载体前进方向(前)
- Y轴:指向载体右侧(右)
- Z轴:指向载体下方(下)
IMU 的加速度计和陀螺仪,输出的就是相对于这个坐标系的数据。所以,我们要做的就是把 b 系的数据转换到 n 系去。
核心思想:IMU 测量的是「载体自己」的运动,而我们关心的是「载体在世界里」的运动。坐标系变换就是连接这两者的桥梁。
3.2 姿态角(欧拉角)
欧拉角是最直观的姿态表示方法。它用三个角度来描述载体相对于导航坐标系的旋转:
- 横滚角(Roll, φ):绕 X 轴旋转
- 俯仰角(Pitch, θ):绕 Y 轴旋转
- 航向角(Yaw, ψ):绕 Z 轴旋转
旋转顺序很重要!我一般用 Z-Y-X 顺序(先航向,再俯仰,最后横滚)。为什么?因为这是航空航天领域的惯例,而且能避免一些奇异性问题。
避坑指南:欧拉角有个著名的「万向锁」问题。当俯仰角接近 ±90° 时,横滚和航向会耦合在一起,丢失一个自由度。我曾经在四轴飞行器上遇到过这个问题,飞控直接失控。所以,如果你要做全姿态运动,别只用欧拉角。
3.3 旋转矩阵的物理意义
旋转矩阵,说白了就是一个 3x3 的矩阵,它能把一个向量从一个坐标系旋转到另一个坐标系。比如,从 b 系到 n 系的旋转矩阵记作 C_b^n。
它的物理意义是什么?我举个例子你就明白了:
假设载体坐标系里有一个向量 v_b(比如加速度计测到的重力加速度),那么它在导航坐标系里的表示就是:
v_n = C_b^n * v_b
这个矩阵的每一列,其实就是导航坐标系的基向量在载体坐标系里的投影。反过来,每一行是载体坐标系的基向量在导航坐标系里的投影。
我记得有一次做标定,需要验证旋转矩阵的正确性。我直接把矩阵的列向量拿出来看,发现它们不正交,就知道标定出问题了。这个小技巧,你可以记一下。
3.4 四元数基础
四元数,很多人一听就头大。其实它没那么复杂。四元数是一个四维复数,形式是:
q = w + xi + yj + zk
其中,w 是实部,x、y、z 是虚部。它用来表示旋转,比欧拉角更优雅,没有万向锁问题,而且计算效率高。
四元数和旋转矩阵可以互相转换。比如,从四元数到旋转矩阵的公式是:
C = [[1-2(y²+z²), 2(xy-wz), 2(xz+wy)],
[2(xy+wz), 1-2(x²+z²), 2(yz-wx)],
[2(xz-wy), 2(yz+wx), 1-2(x²+y²)]]
看着复杂?其实你不需要背。我写代码时都是直接调库,但理解原理很重要。
我的习惯:在 IMU 数据融合(比如卡尔曼滤波)中,我全部用四元数做状态量。只在最后输出给用户时,才转成欧拉角。这样既避免了万向锁,又方便调试。
3.5 知识体系总览
下面这张图,是我自己总结的坐标系与姿态表示的知识结构。你看一眼,就能明白它们之间的关系:
3.6 实战中的选择建议
说了这么多,到底该用哪种?我根据经验给你个参考:
| 场景 | 推荐表示 | 原因 |
|---|---|---|
| 人机交互(如遥控器) | 欧拉角 | 直观,容易理解 |
| 姿态控制(如飞控) | 四元数 | 无万向锁,计算快 |
| 坐标变换(如导航解算) | 旋转矩阵 | 方便向量运算 |
| 数据融合(如卡尔曼滤波) | 四元数 | 状态量连续,无奇异性 |
总结一下:坐标系是基础,姿态表示是工具。搞懂了它们,IMU 的数据才能变成有用的导航信息。我刚开始做惯导时,花了一周时间才彻底搞明白坐标系变换。别急,慢慢来,这些概念会越来越清晰的。
公众号:蓝海资料掘金营,微信deep3321