2. 动力学基础:多旋翼刚体动力学模型、横滚力矩与推力关系、坐标系定义与转换

各位同学,欢迎来到第二章。

上一章我们聊了飞控的整体架构,算是打了个底。这一章,咱们得把「地基」夯实了。说白了,就是搞清楚飞机为什么会动,怎么动。

我个人习惯,做任何控制算法之前,先把物理模型吃透。你想想看,连飞机怎么转的都不知道,你怎么去调PID?

2.1 坐标系定义与转换

做飞控,第一件事就是定坐标系。没有坐标系,你连「往哪飞」都说不清楚。

两个核心坐标系:

  • 地球坐标系(NED):北-东-地。原点在地面,X轴指北,Y轴指东,Z轴指向地心。这是我们的「绝对参考系」。
  • 机体坐标系(Body):原点在飞机重心,X轴指向机头,Y轴指向右翼,Z轴指向下。这是飞机的「自身视角」。

嗯,这里要注意:所有传感器(IMU、磁力计)测量的数据,都是在机体坐标系下的。但你控制飞机往北飞,得用地球坐标系。所以,坐标转换是绕不开的坎。

核心转换工具:旋转矩阵

从机体坐标系到地球坐标系,通常用欧拉角(横滚φ、俯仰θ、偏航ψ)构建旋转矩阵。顺序是:Z-Y-X(偏航→俯仰→横滚)。

我记得刚入行时,有一次把旋转顺序搞反了,结果飞机一解锁就往地上栽。从那以后,我每次写坐标转换代码,都会在注释里把顺序写清楚。

欧拉角旋转矩阵(Z-Y-X顺序):

R = Rz(ψ) * Ry(θ) * Rx(φ)

其中:
Rz(ψ) = [cosψ  -sinψ  0;  sinψ  cosψ  0;  0  0  1]
Ry(θ) = [cosθ   0   sinθ;  0     1    0; -sinθ  0  cosθ]
Rx(φ) = [1    0      0;  0  cosφ -sinφ;  0  sinφ  cosφ]

避坑指南:我曾经在STM32上直接算浮点矩阵,结果CPU占用率飙到80%。后来改用四元数,计算量直接降了一半。如果你的MCU性能有限,建议用四元数代替欧拉角做姿态解算。

2.2 多旋翼刚体动力学模型

搞清楚了坐标系,咱们来看看飞机怎么动。

多旋翼可以看作一个六自由度刚体:三个平动(X、Y、Z方向移动),三个转动(横滚、俯仰、偏航)。

动力学方程(牛顿-欧拉形式):

平动方程:
m * a = F_gravity + F_thrust + F_drag

转动方程:
I * ω_dot = M - ω × (I * ω)

这里:

  • m:飞机质量
  • I:惯性张量(3x3矩阵)
  • ω:角速度(机体坐标系下)
  • M:外力矩(横滚、俯仰、偏航力矩)

说白了,平动方程告诉你「推油门飞机就往上走」,转动方程告诉你「给横滚力矩飞机就侧倾」。但实际飞起来,这两个是耦合的——你横滚时,升力方向变了,飞机也会水平移动。

注意:惯性张量I不是对角矩阵!虽然我们通常假设飞机是对称的,但实际装配时,电池、相机等负载会导致重心偏移。我见过一个项目,因为没校准重心,横滚响应总是慢半拍,调了三天PID都没用。

2.3 横滚力矩与推力关系

终于到重点了。横滚控制,说白了就是让飞机绕X轴(机头方向)旋转。

横滚力矩怎么来的?

对于四旋翼(X型布局),横滚力矩由左右两侧电机的推力差产生:

M_roll = L * (T_right - T_left)

其中:

  • L:电机到重心的力臂长度
  • T_right:右侧两个电机的总推力
  • T_left:左侧两个电机的总推力

你想想看,右侧推力大,左侧推力小,飞机自然就往左侧滚。就这么简单。

推力与PWM的关系:

电机推力与PWM占空比近似成二次关系:

T = k * (PWM - PWM_min)²

这里的k是电机-桨叶组合的效率系数。不同桨叶、不同电机,k值都不一样。

实际工程中的坑:

我曾经用同一款电机配不同品牌的桨叶,结果k值差了15%。这意味着同样的PWM输出,实际推力不一样。所以,每换一次桨叶,都要重新标定推力曲线

2.4 知识体系总览

为了让大家更直观地理解本章的知识结构,我画了一张图:

多旋翼动力学基础 - 知识体系 坐标系定义与转换 刚体动力学模型 横滚力矩与推力 NED坐标系 机体坐标系 旋转矩阵 平动方程 转动方程 惯性张量 推力差计算 力臂长度 PWM-推力曲线 核心逻辑:坐标系转换 → 动力学方程 → 力矩生成 → 姿态控制 所有控制算法都建立在这个基础之上 图1:多旋翼动力学知识体系结构图

2.5 实际工程中的注意事项

理论讲完了,咱们聊聊实际干活时要注意什么。

  1. 坐标系方向要统一:我见过有人把Z轴朝上定义,结果加速度计数据符号全反了。建议全团队统一用NED坐标系。
  2. 力臂长度L要实测:别用CAD图纸上的理论值。实际装配后,电机位置可能有偏差。我习惯用卡尺量三次取平均。
  3. 推力曲线要分段拟合:低油门和高油门的k值不一样。我一般分三段(0-30%,30-70%,70-100%)分别拟合,精度能提高不少。
  4. 惯性张量可以估算:如果没条件实测,可以用SolidWorks等软件估算。但记得加上电池、相机等负载的重量分布。

一个小技巧:调试时,可以用「悬停测试」来验证动力学模型。让飞机悬停,记录各电机PWM值。如果左右两侧PWM差超过5%,说明重心偏了或者力臂不对称。

好了,这一章的内容就到这里。动力学基础是飞控的「内功」,练好了,后面调PID、做轨迹规划才能得心应手。


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