3、单机动力学建模:牛顿-欧拉方程、四旋翼空气动力学、电机与螺旋桨模型
好,咱们进入正题。单机动力学建模,说白了就是搞清楚无人机为什么会飞、怎么控制它飞。我当年刚接触四旋翼时,总觉得这东西玄乎,后来发现,核心就三块:刚体运动、空气动力、电机响应。今天咱们一个一个啃。
3.1 牛顿-欧拉方程:刚体运动的“宪法”
四旋翼在空中,本质上是个刚体。刚体怎么动?牛顿第二定律管平动,欧拉方程管转动。合起来就是牛顿-欧拉方程。
先看平动部分。地面坐标系下,无人机的位置是 [x, y, z]^T。牛顿第二定律说:
m * a = F_gravity + F_thrust + F_drag
其中 m 是质量,a 是加速度。重力向下,推力向上,阻力跟速度有关。我习惯把推力从机体坐标系转到地面坐标系,用旋转矩阵 R 搞定:
m * [x_ddot, y_ddot, z_ddot]^T = [0, 0, -mg]^T + R * [0, 0, T_total]^T + F_drag
这里 T_total 是四个螺旋桨的总推力。嗯,这里要注意,旋转矩阵 R 由欧拉角(横滚 φ、俯仰 θ、偏航 ψ)决定。我见过不少新手直接把推力当标量用,结果模型怎么调都不对——其实就是忘了方向。
再看转动部分。欧拉方程描述角运动:
I * ω_dot + ω × (I * ω) = τ
I 是惯性张量,ω 是角速度,τ 是外力矩。四旋翼的力矩主要来自螺旋桨的升力差和反扭矩。我当年做第一个飞控时,把 ω × (I * ω) 这一项忽略了,结果仿真里飞机转得飞快,实际根本稳不住。后来才明白,陀螺效应不能省。
核心要点:牛顿-欧拉方程把力和力矩映射到加速度和角加速度。这是所有控制算法的基础。你写代码时,一定要把旋转矩阵和惯性张量算对,否则后面全是白搭。
3.2 四旋翼空气动力学:力从哪来?
四旋翼的力,说白了就是螺旋桨转起来,把空气往下推,自己往上走。但实际没那么简单。
每个螺旋桨产生的推力 F_i 和反扭矩 Q_i 可以近似为:
F_i = k_f * ω_i^2
Q_i = k_q * ω_i^2
其中 ω_i 是螺旋桨转速,k_f 和 k_q 是常数,跟桨叶形状、直径、空气密度有关。我建议你拿到实物后,先做个拉力测试台,实测一下 k_f 和 k_q。为什么?因为厂家给的参数往往偏理想,实际装上去,桨叶有公差、电机有差异,差个10%很正常。
四个螺旋桨的布局决定了控制分配。以常见的“X型”布局为例:
- 总推力:
T = F1 + F2 + F3 + F4 - 横滚力矩:
τ_φ = l * (F2 - F4)(l是臂长) - 俯仰力矩:
τ_θ = l * (F1 - F3) - 偏航力矩:
τ_ψ = Q1 - Q2 + Q3 - Q4
你想想看,偏航力矩靠的是反扭矩差。如果四个桨转速一样,反扭矩互相抵消,飞机就不转。想让它转,就得让对角桨转速不同。我在项目中遇到过一个问题:偏航响应特别慢,查了半天发现是 k_q 设得太小,导致力矩不够。后来把 k_q 调大了一倍,偏航立马跟手了。
避坑指南:我曾经在仿真里用理想模型跑得好好的,一上真机就炸。后来发现,空气动力学模型里没加“桨叶入流速度”效应。简单说,飞机往前飞时,前方桨叶的来流速度大,推力会变化。建议在模型里加上速度修正项,比如 F_i = k_f * ω_i^2 * (1 + α * v_z),其中 v_z 是垂直速度,α 是经验系数。
3.3 电机与螺旋桨模型:从PWM到拉力
电机和螺旋桨是执行器。飞控输出PWM信号,电机转起来,带动螺旋桨产生拉力。这个环节有延迟,也有非线性。
电机模型常用一阶惯性环节:
ω_dot = (1 / τ_m) * (ω_cmd - ω)
τ_m 是电机时间常数,ω_cmd 是目标转速。我习惯把 τ_m 设成 0.02~0.05 秒,具体看电机型号。小电机响应快,大电机慢一些。
从PWM到目标转速,一般有个映射关系。我见过两种做法:
- 线性映射:
ω_cmd = k_pwm * PWM + b。简单,但低速段不准。 - 查表法: 实测不同PWM下的转速,做成表格。精度高,但麻烦。
我个人推荐第二种。为什么?因为电机和电调有死区,线性映射在低油门时可能根本转不起来。我曾经用线性映射,结果飞机起飞时总往一边偏,查了半天发现是四个电机的死区不一致。换成查表法后,问题就解决了。
螺旋桨模型除了推力公式,还得考虑“桨叶惯性”。螺旋桨本身有转动惯量 J_p,转速变化时会产生额外的力矩。这个在快速机动时不能忽略。完整的电机-螺旋桨模型可以写成:
J_total * ω_dot = τ_motor - τ_load - τ_friction
其中 J_total = J_motor + J_prop,τ_motor 是电机输出力矩,τ_load 是螺旋桨反扭矩,τ_friction 是摩擦力矩。我一般把 τ_friction 近似成 k_fric * ω,简单够用。
注意事项:电机和螺旋桨的模型参数一定要实测。别信数据手册!我遇到过标称5000KV的电机,实测只有4500KV。还有,螺旋桨的 k_f 和 k_q 会随转速变化,建议在多个转速点标定,然后插值使用。
3.4 完整模型:把碎片拼起来
好了,现在我们把所有碎片拼成一个完整的单机动力学模型。状态量通常选:
状态向量 = [x, y, z, φ, θ, ψ, u, v, w, p, q, r]
其中 u, v, w 是机体坐标系下的速度,p, q, r 是角速度。微分方程如下:
位置微分: [x_dot, y_dot, z_dot] = R * [u, v, w]
姿态微分: [φ_dot, θ_dot, ψ_dot] = 欧拉角运动学方程
速度微分: [u_dot, v_dot, w_dot] = (1/m) * F_body - ω × [u, v, w]
角速度微分: [p_dot, q_dot, r_dot] = I^{-1} * (τ - ω × (I * ω))
再加上电机模型,把PWM映射成转速,转速映射成推力和力矩,整个模型就闭环了。
我建议你写个MATLAB或Python脚本,把模型跑起来。先做开环仿真,看看给一个固定PWM,飞机怎么动。然后加个简单的PID,试试能不能悬停。这一步走通了,后面编队控制才有基础。
总结一下:单机动力学建模是编队控制的基石。牛顿-欧拉方程管运动,空气动力学管力,电机模型管执行。三者缺一不可。我当年花了两周才把模型调通,但一旦通了,后面编队算法就顺风顺水了。
好,这一章就到这。下一章咱们聊控制分配——怎么把期望的力和力矩,分配到四个电机上。到时候我会讲一个我踩过的坑,跟混控矩阵有关,挺有意思的。