2. 多旋翼飞行器运动学建模

多旋翼的位置与姿态控制,本质上是在两个坐标系之间来回换算:一个是固定在地面上的惯性坐标系(也称世界系、导航系),另一个是固连在机体上的机体系。控制器读到的传感器数据、输出的电机指令,最终都要落到这两个坐标系的关系上。如果坐标系定义、旋转方向、欧拉角顺序没有统一,后面的姿态解算和位置控制一定会出现符号错误或耦合异常。因此本节先把“怎么定义、怎么变换、怎么建立运动学方程”讲清楚。

一、坐标系定义与约定

采用右手坐标系,并统一约定如下:

  • 惯性系 OeXeYeZe:原点取起飞点,Xe 指向东,Ye 指向北,Ze 垂直向上(ENU,东北天)。重力矢量在惯性系中为 [0, 0, −g]T。
  • 机体系 ObXbYbZb:原点取机体几何中心(重心),Xb 指向机头,Yb 指向机体右侧,Zb 沿机体垂直向上。
  • 姿态角:滚转角 φ 绕 Xb,俯仰角 θ 绕 Yb,偏航角 ψ 绕 Zb。正方向均按右手定则,即从轴的正向看去逆时针为正。

这套约定与 PX4、ArduPilot 常用的 ENU/FRD 体系在符号上略有差异,但只要全文一致,推导结果就自洽。后续所有公式均以本节约定为准。

二、旋转矩阵与坐标变换

绕单轴的旋转矩阵为:

R_x(φ) = [1, 0, 0; 0, cosφ, -sinφ; 0, sinφ, cosφ]
R_y(θ) = [cosθ, 0, sinθ; 0, 1, 0; -sinθ, 0, cosθ]
R_z(ψ) = [cosψ, -sinψ, 0; sinψ, cosψ, 0; 0, 0, 1]

从机体系到惯性系的旋转矩阵按 Z–Y–X 顺序复合:

R_be = R_z(ψ) · R_y(θ) · R_x(φ)

展开后可得:

R_be =
[ cψcθ,  cψsθsφ - sψcφ,  cψsθcφ + sψsφ ]
[ sψcθ,  sψsθsφ + cψcφ,  sψsθcφ - cψsφ ]
[ -sθ,   cθsφ,           cθcφ          ]

其中 c 表示 cos,s 表示 sin。该矩阵是正交矩阵,满足 RTR = I,因此从惯性系到机体系的变换就是 R_eb = R_beT。任意矢量 v 在两个坐标系间的换算为:

v_e = R_be · v_b
v_b = R_be^T · v_e

例如机体系下测得加速度 ab = [0.2, 0.1, 9.7]T m/s²,若当前 φ=5°、θ=3°、ψ=30°,代入 R_be 即可得到惯性系下的加速度分量,用于位置估计。

三、欧拉角与万向节死锁

欧拉角直观、便于人机交互,但存在两个问题:一是万向节死锁,当 θ = ±90° 时,φ 与 ψ 的旋转轴重合,姿态自由度退化;二是三角函数运算量大。因此欧拉角适合作为显示和输入接口,不适合作为内部姿态积分的主状态量。

欧拉角变化率与机体角速度 p、q、r 的关系为:

[φ̇]   [1, sinφ·tanθ, cosφ·tanθ] [p]
[θ̇] = [0, cosφ,      -sinφ     ] [q]
[ψ̇]   [0, sinφ/cosθ, cosφ/cosθ] [r]

可见当 θ 接近 ±90° 时 tanθ 与 1/cosθ 发散,这正是死锁在数学上的体现。

四、四元数姿态表示

四元数用四个参数 q = [q0, q1, q2, q3]T 表示姿态,其中 q0 为标量部分,[q1, q2, q3] 为矢量部分,满足单位约束 q0² + q1² + q2² + q3² = 1。其优势是无死锁、运算量小、便于插值。

由欧拉角构造四元数(Z–Y–X 顺序):

q0 = c(φ/2)c(θ/2)c(ψ/2) + s(φ/2)s(θ/2)s(ψ/2)
q1 = s(φ/2)c(θ/2)c(ψ/2) - c(φ/2)s(θ/2)s(ψ/2)
q2 = c(φ/2)s(θ/2)c(ψ/2) + s(φ/2)c(θ/2)s(ψ/2)
q3 = c(φ/2)c(θ/2)s(ψ/2) - s(φ/2)s(θ/2)c(ψ/2)

四元数微分方程为:

q̇ = 0.5 · q ⊗ [0, p, q, r]^T

其中 ⊗ 表示四元数乘法。数值积分时通常采用一阶欧拉法或四阶龙格–库塔法,并在每步后重新归一化,抑制漂移。

五、位置与姿态运动学方程

设惯性系下位置为 P = [x, y, z]T,速度为 V = [vx, vy, vz]T,机体系下速度为 Vb,则位置运动学为:

Ṗ = V = R_be · V_b

姿态运动学用四元数表示为:

q̇ = 0.5 · q ⊗ ω_b

其中 ωb = [0, p, q, r]T。这两组方程共同构成多旋翼的六自由度运动学模型:位置由速度积分得到,姿态由角速度积分得到,而速度与角速度来自动力学与控制器输出。运动学只描述几何关系,不涉及力和力矩,因此它是动力学模型的前置基础。

多旋翼运动学建模:坐标系、姿态表示与变换关系 惯性系 Oe-XeYeZe (ENU) Ze (天) Xe (东) Ye (北) 位置 P=[x,y,z]ᵀ 机体系 Ob-XbYbZb Zb (上) Xb (机头) Yb (右) 速度 Vb=[u,v,w]ᵀ 旋转矩阵 R_be R_be = Rz(ψ)·Ry(θ)·Rx(φ) 正交矩阵 RᵀR = I v_e = R_be · v_b v_b = R_beᵀ · v_e 变换 变换 欧拉角表示 (φ, θ, ψ) • 直观,适合人机交互与显示 • 存在万向节死锁:θ = ±90° • 三角函数运算量大 • 角速率关系含 tanθ、1/cosθ • 适合作为输入/输出接口 • 不适合内部姿态积分主状态 四元数表示 q=[q0,q1,q2,q3]ᵀ • 无死锁,全姿态连续 • 运算量小,便于插值 • 单位约束 q0²+q1²+q2²+q3²=1 • 微分方程 q̇ = 0.5·q⊗ω_b • 每步积分后需重新归一化 • 适合作为内部姿态主状态 位置运动学:Ṗ = R_be · V_b | 姿态运动学:q̇ = 0.5 · q ⊗ ω_b

六、建模实践要点

在实际飞控代码中,姿态解算通常以四元数为内部状态,以欧拉角作为对外接口。一个典型的实现流程是:读取陀螺仪角速度 (p, q, r),用四元数微分方程积分更新 q,归一化后转换为旋转矩阵 R_be,再用于将机体系加速度转换到惯性系进行位置积分。若需要显示姿态角,再由 q 反解 φ、θ、ψ。

需要注意的工程细节包括:

  • 符号一致性:陀螺仪安装方向、旋转矩阵定义、欧拉角正方向必须与本文约定一致,否则会出现“滚转反向”或“偏航耦合”现象。
  • 归一化频率:四元数积分每步都应归一化,否则数值误差累积会导致旋转矩阵不再正交。
  • 死锁规避:当 θ 接近 ±90° 时,避免直接使用欧拉角微分方程,改用四元数或旋转矩阵更新。
  • 单位统一:角速度用 rad/s,角度用 rad 参与运算,仅在显示时转换为度。
建议在代码中把 R_be 的展开式写成独立函数,并用单位测试验证:当 φ=θ=ψ=0 时 R_be 应为单位阵;当 ψ=90° 时,机体系 Xb 应映射到惯性系 Ye 方向。

掌握以上坐标系定义、旋转矩阵、欧拉角与四元数的关系,以及位置与姿态运动学方程,就为后续的动力学建模、姿态控制器设计和位置控制器设计打下了统一的数学基础。下一阶段将在此基础上引入力与力矩,建立完整的六自由度动力学模型。