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怎么来?很简单,拿个拉力计,测一组转速和推力的数据,拟合一下就出来了。

我的经验: 做实验标定k_f时,记得把桨叶装好,别用手捏着电机。我曾经有个学生,用手捏着电机测拉力,结果数据全是乱的。因为手在抖,桨叶的入流条件变了。老老实实做个台架,数据才靠谱。

4.2 力矩模型

电机不光产生推力,还会产生力矩。这个力矩主要来自两个方面:

  1. 反扭矩:电机旋转时,空气对桨叶的阻力会反作用到电机上,让机身想往反方向转。
  2. 陀螺力矩:当飞机做俯仰或滚转时,高速旋转的电机和桨叶会产生陀螺效应,阻碍你改变姿态。

先看反扭矩。它的模型跟推力很像,也是跟转速平方成正比:

M_i = k_m * ω_i²

这里的k_m是反扭矩系数。注意,这个力矩的方向跟电机旋转方向相反。所以四旋翼里,我们让相邻两个电机正反转,就是为了抵消反扭矩。

再说陀螺力矩。这个在快速机动时特别明显。我记得有一次做高速避障测试,飞机突然急转弯,结果姿态角超调了20度。查了半天,就是陀螺力矩没补偿好。陀螺力矩的公式是:

M_gyro = J_rotor * (ω_body × ω_rotor)

其中J_rotor是电机转子的转动惯量,ω_body是机体的角速度,ω_rotor是电机的自转角速度。这个叉乘意味着,陀螺力矩的方向总是垂直于机体角速度和电机自转轴。

避坑指南: 我曾经在仿真里忽略了陀螺力矩,结果仿真数据跟实飞数据对不上。后来加上这个模型,误差从15%降到了3%。所以,如果你做的是高速机动或者大角速度运动,千万别省这个模型。

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 * ω)这一项就是陀螺力矩的体现。它让飞机的转动变得耦合——你滚转的时候,俯仰轴也会受影响。

核心要点: 牛顿-欧拉法把多旋翼的运动拆成了两个独立的子系统:平动和转动。平动由推力控制,转动由力矩控制。但两者通过旋转矩阵R耦合在一起。这就是为什么你倾斜机身(转动)就能改变飞行方向(平动)。

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度时,方程会发散。这就是为什么多旋翼一般不做大角度机动。
我的建议: 做MPC控制器时,不要直接用这个非线性模型。太复杂,计算量太大。我一般会把它线性化,或者用“微分平坦”的方法简化。后面章节我会详细讲怎么处理。

4.5 知识体系总览

为了让大家更直观地理解这一章的内容,我画了一张图。它展示了从电机到整机动力学模型的完整链路:

多旋翼动力学建模知识体系 电机推力模型 F_i = k_f * ω_i² 力矩模型 M_i = k_m * ω_i² 陀螺力矩 M_gyro = J × (ω_body × ω_rotor) 合力 F_total ΣF_i = [0, 0, ΣF_i]ᵀ 合力矩 M_total M_x, M_y, M_z 刚体动力学方程(牛顿-欧拉法) 平动:m * d²r/dt² = m*g + R*F_total + F_drag 转动:J * dω/dt + ω × (J*ω) = M_total 状态向量:[x, y, z, vx, vy, vz, φ, θ, ψ, p, q, r]ᵀ 注:箭头表示数据流向,从电机模型到整机动力学

这张图把本章的知识点串起来了。从左到右,从电机到整机,每一步都有明确的物理模型。做MPC的时候,我们就是基于这个模型来预测未来状态的。

好了,这一章的内容就到这里。模型是基础,但光有模型还不够。下一章,我们会讨论怎么把这个模型用到MPC控制器里。到时候你会发现,模型越准,控制效果越好,但计算量也越大。怎么平衡,是个技术活。


公众号:蓝海资料掘金营,微信deep3321