4. 多旋翼动力学建模:电机推力模型、力矩模型、刚体动力学方程(牛顿-欧拉法)
各位同学,欢迎来到第四章。这一章,我们要啃一块硬骨头——多旋翼的动力学建模。
说实话,很多做飞控的朋友,一上来就调PID参数,模型什么的根本不看。我个人觉得,这其实是个误区。你想想看,MPC控制器的核心就是“基于模型做预测”。模型不准,你的预测就是瞎猜。我在项目里见过太多这样的案例:调了一周参数,换个负载或者换个桨叶,飞机就开始抖。说白了,就是模型没建好。
这一章,我会带着大家把电机推力、力矩、以及刚体动力学方程,一步步拆开。别怕公式,我会用大白话讲清楚每个符号的物理意义。
4.1 电机推力模型
先聊聊最基础的——电机怎么产生升力?
多旋翼的升力,说白了就是螺旋桨旋转,把空气往下推,根据牛顿第三定律,飞机就被往上推了。这个力的大小,跟转速的平方成正比。这是经验公式,也是工程上最常用的模型。
我习惯用下面这个公式:
F_i = C_T * ρ * n_i² * D⁴
其中:
- F_i:第 i 个电机的推力(单位:N)
- C_T:推力系数(无量纲,由桨叶形状决定)
- ρ:空气密度(kg/m³,海拔越高越小)
- n_i:电机转速(rps,转每秒)
- D:螺旋桨直径(m)
嗯,这里要注意,实际工程中我们很少直接用这个公式。为什么?因为C_T和ρ很难精确测量。我一般会把它简化成:
F_i = k_f * ω_i²
这里的k_f是综合推力系数,包含了C_T、ρ、D⁴等所有常数。ω_i是电机的角速度(rad/s)。这个k_f怎么来?很简单,拿个拉力计,测一组转速和推力的数据,拟合一下就出来了。
4.2 力矩模型
电机不光产生推力,还会产生力矩。这个力矩主要来自两个方面:
- 反扭矩:电机旋转时,空气对桨叶的阻力会反作用到电机上,让机身想往反方向转。
- 陀螺力矩:当飞机做俯仰或滚转时,高速旋转的电机和桨叶会产生陀螺效应,阻碍你改变姿态。
先看反扭矩。它的模型跟推力很像,也是跟转速平方成正比:
M_i = k_m * ω_i²
这里的k_m是反扭矩系数。注意,这个力矩的方向跟电机旋转方向相反。所以四旋翼里,我们让相邻两个电机正反转,就是为了抵消反扭矩。
再说陀螺力矩。这个在快速机动时特别明显。我记得有一次做高速避障测试,飞机突然急转弯,结果姿态角超调了20度。查了半天,就是陀螺力矩没补偿好。陀螺力矩的公式是:
M_gyro = J_rotor * (ω_body × ω_rotor)
其中J_rotor是电机转子的转动惯量,ω_body是机体的角速度,ω_rotor是电机的自转角速度。这个叉乘意味着,陀螺力矩的方向总是垂直于机体角速度和电机自转轴。
4.3 刚体动力学方程(牛顿-欧拉法)
好了,有了力和力矩,我们就可以写飞机的运动方程了。这里用的是经典的牛顿-欧拉法。说白了,就是牛顿第二定律的升级版:
- 牛顿方程:描述平动(位置变化)
- 欧拉方程:描述转动(姿态变化)
4.3.1 牛顿方程(平动)
在地面坐标系(惯性系)下,飞机的平动方程是:
m * a = F_gravity + F_thrust + F_drag
展开写就是:
m * d²r/dt² = m * g + R * (ΣF_i) + F_drag
这里:
- m:飞机总质量
- r:位置向量(x, y, z)
- g:重力加速度向量(一般是[0, 0, -9.81])
- R:从机体坐标系到地面坐标系的旋转矩阵(由欧拉角或四元数决定)
- ΣF_i:所有电机推力在机体坐标系下的合力
- F_drag:空气阻力(高速飞行时不能忽略)
你想想看,这个方程告诉我们什么?飞机要往上飞,推力必须大于重力。要往前飞,就得倾斜机身,让推力有个水平分量。这就是多旋翼的基本控制逻辑。
4.3.2 欧拉方程(转动)
转动方程稍微复杂一点。在机体坐标系下,欧拉方程是:
J * dω/dt + ω × (J * ω) = M_total
其中:
- J:飞机的转动惯量矩阵(3x3,一般假设为对角阵)
- ω:机体角速度向量(p, q, r)
- M_total:所有外力矩之和(包括反扭矩、陀螺力矩、控制力矩)
这个方程里,ω × (J * ω)这一项就是陀螺力矩的体现。它让飞机的转动变得耦合——你滚转的时候,俯仰轴也会受影响。
4.4 完整的动力学模型
把上面所有东西整合起来,我们得到多旋翼的完整动力学模型。这里我以四旋翼为例,给出一个常用的状态空间形式:
状态向量:x = [x, y, z, vx, vy, vz, φ, θ, ψ, p, q, r]ᵀ
控制输入:u = [ω₁², ω₂², ω₃², ω₄²]ᵀ
动力学方程:
dx/dt = vx
dy/dt = vy
dz/dt = vz
dvx/dt = (cosφ sinθ cosψ + sinφ sinψ) * (F_total / m)
dvy/dt = (cosφ sinθ sinψ - sinφ cosψ) * (F_total / m)
dvz/dt = cosφ cosθ * (F_total / m) - g
dφ/dt = p + q sinφ tanθ + r cosφ tanθ
dθ/dt = q cosφ - r sinφ
dψ/dt = (q sinφ + r cosφ) / cosθ
dp/dt = (M_x - (J_zz - J_yy) * q * r) / J_xx
dq/dt = (M_y - (J_xx - J_zz) * p * r) / J_yy
dr/dt = (M_z - (J_yy - J_xx) * p * q) / J_zz
这个模型看起来有点吓人,但别慌。我解释一下:
- 前6个方程是平动部分,后6个是转动部分。
- F_total是四个电机推力的合力。
- M_x, M_y, M_z是三个轴上的控制力矩,由四个电机的转速差产生。
- 姿态角(φ, θ, ψ)的微分方程里,有tanθ项。这意味着俯仰角接近90度时,方程会发散。这就是为什么多旋翼一般不做大角度机动。
4.5 知识体系总览
为了让大家更直观地理解这一章的内容,我画了一张图。它展示了从电机到整机动力学模型的完整链路:
这张图把本章的知识点串起来了。从左到右,从电机到整机,每一步都有明确的物理模型。做MPC的时候,我们就是基于这个模型来预测未来状态的。
好了,这一章的内容就到这里。模型是基础,但光有模型还不够。下一章,我们会讨论怎么把这个模型用到MPC控制器里。到时候你会发现,模型越准,控制效果越好,但计算量也越大。怎么平衡,是个技术活。
公众号:蓝海资料掘金营,微信deep3321