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_fk_q 是常数,跟桨叶形状、直径、空气密度有关。我建议你拿到实物后,先做个拉力测试台,实测一下 k_fk_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到目标转速,一般有个映射关系。我见过两种做法:

  1. 线性映射: ω_cmd = k_pwm * PWM + b。简单,但低速段不准。
  2. 查表法: 实测不同PWM下的转速,做成表格。精度高,但麻烦。

我个人推荐第二种。为什么?因为电机和电调有死区,线性映射在低油门时可能根本转不起来。我曾经用线性映射,结果飞机起飞时总往一边偏,查了半天发现是四个电机的死区不一致。换成查表法后,问题就解决了。

螺旋桨模型除了推力公式,还得考虑“桨叶惯性”。螺旋桨本身有转动惯量 J_p,转速变化时会产生额外的力矩。这个在快速机动时不能忽略。完整的电机-螺旋桨模型可以写成:

J_total * ω_dot = τ_motor - τ_load - τ_friction

其中 J_total = J_motor + J_propτ_motor 是电机输出力矩,τ_load 是螺旋桨反扭矩,τ_friction 是摩擦力矩。我一般把 τ_friction 近似成 k_fric * ω,简单够用。

注意事项:电机和螺旋桨的模型参数一定要实测。别信数据手册!我遇到过标称5000KV的电机,实测只有4500KV。还有,螺旋桨的 k_fk_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,试试能不能悬停。这一步走通了,后面编队控制才有基础。

总结一下:单机动力学建模是编队控制的基石。牛顿-欧拉方程管运动,空气动力学管力,电机模型管执行。三者缺一不可。我当年花了两周才把模型调通,但一旦通了,后面编队算法就顺风顺水了。

好,这一章就到这。下一章咱们聊控制分配——怎么把期望的力和力矩,分配到四个电机上。到时候我会讲一个我踩过的坑,跟混控矩阵有关,挺有意思的。