1. 坐标系与刚体运动基础
各位同学好,我是你们这门课的主讲。今天咱们来聊聊多旋翼建模最基础、也最绕不开的一块——坐标系和刚体运动。
说实话,我刚开始做飞控那会儿,觉得坐标系这东西太简单了,不就是几个箭头嘛。结果第一次调参炸机,查了半天才发现是坐标系定义搞反了。嗯,从那以后,我再也不敢小看这个基础了。
1.1 为什么需要坐标系?
你想想看,无人机在天上飞,它得知道自己「在哪儿」、「朝哪儿」、「怎么动」。这些信息必须有个参考基准。就像你说「我在你前面3米」,这个「前面」得有个定义对吧?
在多旋翼建模里,我们主要用两套坐标系:
- 惯性坐标系(也叫地面坐标系、世界坐标系)—— 固定在大地上的参考系
- 机体坐标系 —— 固定在无人机身上的参考系,跟着飞机一起转
这两者之间的转换关系,就是整个建模的核心。
1.2 惯性坐标系(I系)
我习惯用 OI - XIYIZI 来表示。原点选在地面某点,比如起飞点。
- XI 轴:指向正北(或者任意固定方向)
- YI 轴:指向正东(右手定则确定)
- ZI 轴:指向地心(也就是「向下」)
这里有个坑,我踩过。很多教材用「北东地」坐标系,但有些飞控用「东北天」。你写代码的时候一定要看清楚,不然姿态解算出来全是反的。
1.3 机体坐标系(B系)
机体坐标系用 OB - XBYBZB 表示。原点在飞机的重心。
- XB 轴:指向机头方向
- YB 轴:指向飞机右侧
- ZB 轴:指向飞机下方(符合右手定则)
说白了,你坐在飞机驾驶舱里,往前看是XB,往右看是YB,脚底下是ZB。这个定义在大部分开源飞控里都是通用的。
1.4 欧拉角定义
欧拉角是用来描述「机体坐标系相对于惯性坐标系」的姿态的。三个角度:
| 角度 | 符号 | 定义 | 范围 |
|---|---|---|---|
| 横滚角 | φ (phi) | 绕XB轴旋转的角度 | -π ~ π |
| 俯仰角 | θ (theta) | 绕YB轴旋转的角度 | -π/2 ~ π/2 |
| 偏航角 | ψ (psi) | 绕ZB轴旋转的角度 | -π ~ π |
这里有个关键点:旋转顺序。我习惯用 Z-Y-X 顺序(先偏航、再俯仰、最后横滚)。为什么?因为这是航空航天领域的惯例,也是大部分飞控的默认顺序。
1.5 旋转矩阵推导
旋转矩阵说白了,就是把一个向量从机体坐标系「翻译」到惯性坐标系(或者反过来)。
咱们先看绕单个轴的旋转矩阵:
// 绕Z轴旋转 ψ 角
R_z(ψ) = [cosψ -sinψ 0]
[sinψ cosψ 0]
[0 0 1]
// 绕Y轴旋转 θ 角
R_y(θ) = [cosθ 0 sinθ]
[0 1 0 ]
[-sinθ 0 cosθ]
// 绕X轴旋转 φ 角
R_x(φ) = [1 0 0 ]
[0 cosφ -sinφ]
[0 sinφ cosφ]
按照 Z-Y-X 顺序,从机体到惯性的旋转矩阵就是:
R_IB = R_z(ψ) * R_y(θ) * R_x(φ)
展开后:
R_IB = [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θ ]
这个矩阵你最好手推一遍。我当年就是偷懒直接抄公式,结果有一次需要转置的时候搞混了,又炸了一架机。
1.6 四元数基础
欧拉角有个致命问题——万向锁。当俯仰角θ接近±90°时,横滚和偏航就分不清了。你想想看,飞机垂直朝上飞的时候,你还能分清「横滚」和「偏航」吗?
所以实际飞控里,我们更常用四元数。
四元数长这样:
q = q0 + q1*i + q2*j + q3*k
其中:
q0^2 + q1^2 + q2^2 + q3^2 = 1 (归一化条件)
i^2 = j^2 = k^2 = i*j*k = -1
用四元数表示旋转,其实就是绕某个轴转某个角度。假设绕单位向量 u = (ux, uy, uz) 旋转 θ 角:
q = [cos(θ/2), u_x*sin(θ/2), u_y*sin(θ/2), u_z*sin(θ/2)]
四元数转旋转矩阵的公式:
R(q) = [1-2(q2^2+q3^2) 2(q1q2-q0q3) 2(q1q3+q0q2) ]
[2(q1q2+q0q3) 1-2(q1^2+q3^2) 2(q2q3-q0q1) ]
[2(q1q3-q0q2) 2(q2q3+q0q1) 1-2(q1^2+q2^2)]
1.7 本章知识体系总览
下面这张图,是我自己梳理的本章知识结构。你把它存下来,后面学动力学和控制的时候,随时回来对照。
这张图把本章的核心逻辑串起来了:从两套坐标系出发,到三种姿态描述方法,最后落到实际应用。你学完后面几章再回来看这张图,会有更深的理解。
好了,坐标系和刚体运动的基础就讲到这里。这些东西看着简单,但真到了写代码、调参数的时候,每一个细节都可能让你栽跟头。我建议你:
- 自己手推一遍旋转矩阵
- 写个四元数归一化的小函数
- 在仿真里试试欧拉角在俯仰90°时的表现
这些基本功打扎实了,后面学动力学和控制才会顺手。