3. 无人机动力学模型建立
做飞控这么多年,我越来越觉得——动力学模型是整个控制系统的灵魂。你想想看,连被控对象长什么样都不清楚,怎么设计控制器?说白了,模型就是我们对物理世界的数学抽象。这一章,我们就来聊聊无人机动力学模型的建立过程。
3.1 刚体六自由度运动方程
任何飞行器,不管是四旋翼还是固定翼,在空间中都有6个自由度:三个平动(前后、左右、上下)和三个转动(俯仰、滚转、偏航)。描述这6个自由度的运动,就是刚体六自由度运动方程。
我个人习惯把方程拆成两部分来看:
- 动力学方程:描述力与加速度、力矩与角加速度的关系(F=ma, M=Iα)
- 运动学方程:描述位置与速度、姿态与角速度的关系
完整的六自由度方程长这样:
动力学方程(体坐标系下):
m * (dV/dt + ω × V) = F_ext
I * (dω/dt) + ω × (I * ω) = M_ext
运动学方程:
dP/dt = R * V (位置更新)
dΘ/dt = W * ω (姿态更新,用欧拉角或四元数)
这里有个坑,我在项目中遇到过——欧拉角的万向锁问题。当俯仰角接近±90°时,偏航和滚转会耦合在一起,导致姿态解算失效。所以实际工程中,我建议用四元数来更新姿态,只在最后输出控制量时再转成欧拉角。
核心要点:六自由度方程是所有无人机模型的基础。记住,它描述的是刚体运动,不考虑结构弹性变形。如果你做的是大型固定翼,那还得加上结构动力学。
3.2 四旋翼的简化动力学模型
四旋翼的动力学模型,说白了就是四个电机转速 → 力和力矩的映射关系。我刚开始做四旋翼时,总觉得这玩意儿很复杂,后来发现其实可以简化得很漂亮。
四旋翼的简化假设:
- 机体为刚体,质量分布对称
- 电机响应足够快,忽略动态延迟
- 空气阻力与速度成正比(低速飞行时成立)
- 忽略桨叶之间的气动干扰
基于这些假设,四旋翼的动力学模型可以写成:
总推力:T = b * (ω₁² + ω₂² + ω₃² + ω₄²)
滚转力矩:M_x = l * b * (ω₂² - ω₄²)
俯仰力矩:M_y = l * b * (ω₃² - ω₁²)
偏航力矩:M_z = d * (ω₁² - ω₂² + ω₃² - ω₄²)
其中b是推力系数,d是扭矩系数,l是臂长。嗯,这里要注意——电机编号顺序不同,公式里的正负号会变。我习惯用X型布局,电机1和3逆时针转,2和4顺时针转。
个人经验:实际飞行中,电机响应延迟对控制性能影响很大。我曾经在调试时发现,如果不考虑电机一阶延迟模型(约0.02s的时间常数),高频段的相位裕度会明显不足。建议在模型中加上:τ * dω/dt + ω = ω_cmd
3.3 固定翼的简化动力学模型
固定翼的模型比四旋翼复杂不少,因为多了气动力的非线性。不过,对于控制器设计来说,我们通常只保留主要的气动导数。
固定翼的简化模型通常分为纵向和横航向两部分:
纵向模型(俯仰、速度、高度):
- 升力:L = 0.5 * ρ * V² * S * C_L(α, δ_e)
- 阻力:D = 0.5 * ρ * V² * S * C_D(α)
- 俯仰力矩:M = 0.5 * ρ * V² * S * c * C_m(α, δ_e, q)
横航向模型(滚转、偏航、侧滑):
- 滚转力矩:L = 0.5 * ρ * V² * S * b * C_l(β, δ_a, δ_r, p, r)
- 偏航力矩:N = 0.5 * ρ * V² * S * b * C_n(β, δ_a, δ_r, p, r)
- 侧力:Y = 0.5 * ρ * V² * S * C_Y(β, δ_r)
你可能会问:这么多气动导数,怎么获取?我在项目中常用的方法有两种:
- 风洞实验:最准确,但成本高
- CFD仿真:精度够用,适合前期设计
- 系统辨识:用飞行数据反推,我比较推荐这个
避坑指南:我曾经在固定翼项目中,直接用线性气动模型做控制器,结果在大迎角飞行时炸机了。原因是失速后气动导数变化很大,线性模型完全失效。所以,如果你要做全包线控制,一定要考虑气动参数的非线性变化。
3.4 模型线性化与状态空间表示
非线性模型虽然准确,但控制器设计起来太麻烦。所以工程上,我们通常会在平衡点附近做线性化。说白了,就是用泰勒展开,只保留一阶项。
线性化的步骤:
- 找到平衡点(比如悬停状态、平飞状态)
- 计算雅可比矩阵(对状态量和控制量求偏导)
- 得到线性状态空间方程
状态空间的标准形式:
dx/dt = A * x + B * u
y = C * x + D * u
以四旋翼悬停状态为例,线性化后的状态空间模型:
状态量 x = [φ, θ, ψ, p, q, r, u, v, w, x, y, z]ᵀ
控制量 u = [ω₁², ω₂², ω₃², ω₄²]ᵀ
A矩阵(12×12):
A = [0_3×3 I_3×3 0_3×3 0_3×3;
0_3×3 0_3×3 0_3×3 0_3×3;
0_3×3 0_3×3 0_3×3 g * e_3;
0_3×3 0_3×3 -g * e_3 0_3×3]
B矩阵(12×4):
B = [0_3×4;
inv(J) * B_moment;
0_3×4;
(1/m) * B_force]
嗯,这里要注意——线性化只在平衡点附近有效。如果你飞的是特技动作,那线性模型就不够用了。我一般会在控制器里加增益调度,根据当前飞行状态切换不同的线性模型。
实用建议:对于初学者,我建议先做悬停点的线性化,把PID调稳了,再考虑非线性补偿。别一上来就搞复杂的非线性控制,容易翻车。
3.5 本章知识体系
为了让你更直观地理解本章的知识结构,我画了一张图:
这张图把本章的核心逻辑串起来了:从最底层的刚体六自由度方程出发,分别推导四旋翼和固定翼的简化模型,最后统一做线性化,得到状态空间表示。你顺着这个思路走,就不会乱。
我的习惯:每次做新机型,我都会先把这张图画一遍,把每个模块的公式写清楚。这样后面设计控制器时,心里就有底了。
公众号:蓝海资料掘金营,微信deep3321