第四节:力和力矩建模

各位同学,欢迎来到第四讲。前面我们聊完了运动学和动力学方程,今天要落地了——把那些抽象的力和力矩,一个一个写出来。

说实话,力和力矩建模是整个建模过程中最“脏”的活。为什么?因为真实世界里的力,没有一个是完美线性的。但别怕,我们做工程的人,讲究的是“够用就好”。

今天要覆盖五个核心模型:重力模型、螺旋桨拉力模型、螺旋桨力矩模型、气动阻力模型、陀螺效应。这五个模型,基本覆盖了多旋翼飞行器90%以上的受力情况。

力和力矩建模 重力模型 螺旋桨拉力模型 螺旋桨力矩模型 气动阻力模型 陀螺效应 五个核心模型构成完整的力和力矩系统 每个模型都有明确的物理意义和数学表达

4.1 重力模型——最简单也最不能错

重力,说白了就是地球在拽着你的飞机往下掉。这个模型是所有模型里最简单的,但也是最重要的——你想想看,如果重力算错了,其他模型再精确也没用。

重力在惯性坐标系(地球坐标系)中表达最方便:

F_g = [0, 0, -mg]^T   (惯性系下)

其中 m 是飞行器总质量,g 是重力加速度(约9.81 m/s²)。

但我们的动力学方程是在机体坐标系下写的,所以需要把重力转换到机体系下:

F_g^b = R^b_i * [0, 0, -mg]^T

展开后得到:

F_g^b = [-mg * sin(θ),  mg * cos(θ) * sin(φ),  mg * cos(θ) * cos(φ)]^T

关键点:重力只影响线运动方程,不影响角运动方程。因为重力作用在质心上,不产生力矩。

我的经验:我在做第一个飞控原型时,把重力的符号搞反了。结果飞机一解锁就往地上砸,差点把桨叶打碎。从那以后,我每次写重力模型都会先做一次“悬停测试”——在仿真里把油门设到悬停值,看飞机能不能稳住。

4.2 螺旋桨拉力模型——飞行的核心

螺旋桨拉力,就是让飞机飞起来的力。这个模型我建议你好好理解,因为后面所有的控制分配都基于它。

单个螺旋桨的拉力,可以用一个简洁的公式表达:

T_i = k_T * ω_i²

其中:

  • T_i:第 i 个螺旋桨产生的拉力(N)
  • k_T:拉力系数(N·s²/rad²),由桨叶几何和空气密度决定
  • ω_i:螺旋桨转速(rad/s)

为什么是转速的平方?因为拉力正比于动压,而动压正比于速度的平方。这个关系在低速下非常准确。

对于四旋翼,总拉力就是四个桨的拉力之和:

T_total = k_T * (ω₁² + ω₂² + ω₃² + ω₄²)

注意:拉力方向默认沿机体 z 轴向上。对于“X型”和“十字型”布局,这个方向定义是一样的。

避坑指南:我曾经在项目里直接用电机PWM值代替转速平方,结果模型完全不对。后来才发现,电机从PWM到转速有延迟和死区,必须单独建模。建议你至少加一个一阶低通滤波:ω_actual = (1/(τs+1)) * ω_command。

4.3 螺旋桨力矩模型——控制姿态的关键

螺旋桨不光产生拉力,还会产生力矩。这个力矩有两个来源:

  1. 反扭矩(阻力矩):桨叶旋转时,空气阻力产生的反向力矩
  2. 拉力偏心矩:桨叶中心到飞行器质心的距离产生的力矩

反扭矩的表达式和拉力很像:

Q_i = k_Q * ω_i²

其中 k_Q 是扭矩系数。注意,这个力矩的方向与螺旋桨旋转方向相反。

对于四旋翼,我们通常把力矩分解到三个轴上:

力矩分量 表达式 物理意义
滚转力矩 (L) L = l * k_T * (ω₂² - ω₄²) 左右桨拉力差产生滚转
俯仰力矩 (M) M = l * k_T * (ω₁² - ω₃²) 前后桨拉力差产生俯仰
偏航力矩 (N) N = k_Q * (ω₁² - ω₂² + ω₃² - ω₄²) 反扭矩差产生偏航

其中 l 是臂长(从质心到桨叶中心的距离)。

我个人的习惯:在仿真初期,我会把 k_T 和 k_Q 的比值设为一个固定值(通常 k_Q/k_T ≈ 0.05~0.1)。等有了实际桨叶数据再精确标定。这样能快速跑通控制逻辑。

4.4 气动阻力模型——飞得快了才明显

低速飞行时,气动阻力可以忽略。但一旦速度超过5m/s,阻力就开始“刷存在感”了。

气动阻力通常建模为:

F_drag = -0.5 * ρ * C_d * A * |v| * v

其中:

  • ρ:空气密度(约1.225 kg/m³)
  • C_d:阻力系数(无量纲,通常0.3~0.8)
  • A:迎风面积(m²)
  • v:飞行速度(m/s)

注意这个公式里的 |v| * v,它保证了阻力方向始终与速度方向相反。

在机体坐标系下,我们可以简化为:

F_drag^b = -diag(k_dx, k_dy, k_dz) * [u, v, w]^T

其中 k_dx, k_dy, k_dz 是三个轴上的阻力系数,u, v, w 是机体速度分量。

简化技巧:对于大多数多旋翼,可以假设 k_dx ≈ k_dy(对称性),k_dz 单独标定。我一般用风洞数据或者飞行日志反推来标定这些系数。

我曾经踩过的坑:有一次做高速飞行测试,飞机突然出现剧烈震荡。查了半天才发现,阻力模型里忘了加“速度平方项”,导致高速段模型严重失配。从那以后,我坚持在阻力模型里保留 |v| * v 的形式,而不是简单的线性阻尼。

4.5 陀螺效应——高速旋转的“隐形手”

陀螺效应,说白了就是旋转的螺旋桨“不愿意”改变自己的转轴方向。这个效应在高速机动时特别明显。

陀螺力矩的表达式:

M_gyro = -J_rp * (ω × Ω)

其中:

  • J_rp:螺旋桨和电机转子的转动惯量(kg·m²)
  • ω:飞行器角速度(rad/s)
  • Ω:螺旋桨转速向量(rad/s)

对于四旋翼,展开后得到:

M_gyro_x = J_rp * q * (Ω₁ - Ω₂ + Ω₃ - Ω₄)
M_gyro_y = -J_rp * p * (Ω₁ - Ω₂ + Ω₃ - Ω₄)
M_gyro_z = 0

注意,陀螺效应只影响滚转轴和俯仰轴,不影响偏航轴。为什么?因为偏航运动与螺旋桨旋转方向平行,不会产生陀螺进动。

我的经验:在小型四旋翼(轴距250mm以下)上,陀螺效应几乎可以忽略。但在大型无人机(轴距1m以上)上,这个效应必须建模。我记得有一次做重载无人机,起飞时偏航通道一直有振荡,加上陀螺补偿后立刻稳定了。

4.6 模型汇总

好了,五个模型都讲完了。我们把它们汇总到一张表里:

模型 输入 输出 关键参数
重力模型 姿态角 (φ, θ) 重力在机体系的分量 m, g
螺旋桨拉力模型 转速 ω_i 拉力 T_i k_T
螺旋桨力矩模型 转速 ω_i 力矩 L, M, N k_T, k_Q, l
气动阻力模型 速度 v 阻力 F_drag ρ, C_d, A
陀螺效应 角速度 ω, 转速 Ω 陀螺力矩 M_gyro J_rp

把这些模型代入到上一讲的动力学方程里,你就得到了一个完整的六自由度模型。剩下的工作,就是调参和验证了。

嗯,今天就到这里。这些模型看起来多,但每个都有明确的物理意义。你写代码的时候,建议一个一个加,每加一个就做一次仿真验证。这样出了问题,也知道是哪个模型在“捣乱”。


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