1. 四旋翼飞行器建模仿真实验概述
四旋翼飞行器作为典型的欠驱动系统,其建模与控制一直是飞行器控制领域的热点研究方向。这个实验通过Matlab/Simulink平台,完整实现了从动力学建模到控制算法设计的全流程仿真验证。我在实验室带本科生做这个项目时发现,很多同学容易在坐标系转换和力矩计算环节出错,导致后续控制完全失效。本文将结合三届学生的实操经验,详细拆解每个关键环节的实现要点。
四旋翼的独特之处在于它仅通过四个旋翼的转速差就能实现六自由度的运动控制。这种强耦合特性使得其数学模型呈现典型的非线性、多变量特征。实验主要包含三大模块:首先建立包含陀螺效应的完整动力学模型,然后设计基于PID的悬停控制器,最后通过Simulink实现可视化仿真。建议读者准备Matlab R2019b以上版本,并安装Aerospace Toolbox和Simulink 3D Animation工具箱。
2. 四旋翼动力学建模详解
2.1 坐标系定义与转换
建立正确的坐标系是建模的第一步,也是后续所有计算的基础。我们采用以下两种坐标系:
- 机体坐标系(B系):原点在质心,x轴指向机头方向,y轴指向右侧机臂,z轴按右手定则向下
- 地面坐标系(E系):固定于地面的惯性坐标系
坐标转换通过Z-Y-X欧拉角实现,旋转顺序为:
- 偏航角ψ(绕z轴)
- 俯仰角θ(绕y轴)
- 滚转角φ(绕x轴)
对应的旋转矩阵R_B^E为:
matlab复制function R = rotationMatrix(phi, theta, psi)
R = [cos(psi)*cos(theta), cos(psi)*sin(phi)*sin(theta)-cos(phi)*sin(psi), sin(phi)*sin(psi)+cos(phi)*cos(psi)*sin(theta);
cos(theta)*sin(psi), cos(phi)*cos(psi)+sin(phi)*sin(psi)*sin(theta), cos(phi)*sin(psi)*sin(theta)-cos(psi)*sin(phi);
-sin(theta), cos(theta)*sin(phi), cos(phi)*cos(theta)];
end
注意:欧拉角存在万向节死锁问题,当俯仰角θ=±90°时会出现奇异性。实际飞行中应避免大角度机动。
2.2 动力学方程推导
采用牛顿-欧拉法建立六自由度方程:
平动动力学:
m*d²x/dt² = [0; 0; -mg] + R_B^E * [0; 0; ∑F_i]
转动动力学:
I*dω/dt + ω×(Iω) = [L(F2-F4); L(F1-F3); M1-M2+M3-M4]
其中关键参数:
- 旋翼拉力 F_i = k_f * ω_i² (k_f为拉力系数)
- 反扭矩 M_i = k_m * ω_i² (k_m为扭矩系数)
- 机体惯量矩阵 I = diag([Ixx, Iyy, Izz])
在Simulink中建模时,建议将方程拆解为:
code复制┌───────────────┐ ┌───────────────┐
│ 电机转速输入 │───────▶│ 力/力矩计算 │
└───────────────┘ └───────────────┘
▼
┌───────────────┐ ┌───────────────┐
│ 状态反馈 │◀───────│ 动力学方程 │
└───────────────┘ └───────────────┘
3. 定点悬停控制设计
3.1 串级PID控制结构
采用内外环串级控制架构:
code复制位置控制器(外环)
↓
速度控制器
↓
姿态控制器(内环)
↓
角速率控制器
↓
电机混控
具体实现时需要注意:
- 先调内环再调外环
- 角速率环采样周期建议5ms
- 位置环采样周期可放宽到20ms
3.2 参数整定经验
通过Ziegler-Nichols方法初步整定后,建议按以下规则微调:
-
角速率环:
- 增大P直到出现高频振荡
- 加入D抑制振荡
- I项通常设得很小(0.01~0.1)
-
姿态环:
- P值约为角速率环的1/10
- 适当增加I项消除静差
-
位置环:
- 采用PI控制即可
- 注意限制积分饱和
典型参数范围:
| 控制环 | P | I | D |
|---|---|---|---|
| 角速率 | 0.3~0.5 | 0.01 | 0.05~0.1 |
| 姿态 | 3~5 | 0.1~0.3 | 0 |
| 位置 | 1~2 | 0.5 | 0 |
4. Simulink仿真实现
4.1 模型架构设计
推荐采用模块化设计:
code复制Top Model
├── Controller Subsystem
├── Quadrotor Dynamics
├── Environment
└── Visualization
关键配置:
- 求解器:ode4 (Runge-Kutta),固定步长0.005s
- 启用3D Visualization模块时需要安装Simulink 3D Animation
4.2 调试技巧
-
分阶段验证:
- 先验证单个电机模型
- 再测试姿态控制
- 最后验证位置控制
-
信号监测:
matlab复制scope = Simulink.sdi.createRun('Tuning'); Simulink.sdi.addToRun(scope, 'vars', get_param('model','LoggedSignals')); Simulink.sdi.view -
常见问题处理:
- 发散:检查坐标系定义和力矩符号
- 振荡:降低P或增加D
- 静差:适当增加I
5. 实验进阶建议
-
抗风扰测试:
在Environment子系统中添加风场模型:matlab复制function F_wind = windModel(t) F_wind = 0.5 * randn(3,1); % 高斯白噪声 if t > 10 F_wind(3) = F_wind(3) + 2; // 突风 end end -
参数辨识:
通过实测数据辨识惯量参数:matlab复制
[estParams,resnorm] = lsqcurvefit(@quadrotorDynamics, x0, t, measData); -
控制算法升级:
- LQR控制:需要线性化模型
- 滑模控制:增强鲁棒性
- ADRC:不依赖精确模型
我在实验室发现,学生最容易犯的三个错误是:1) 混淆坐标系导致力矩计算符号错误 2) PID参数整定顺序不当 3) 忽略Simulink求解器设置。建议在正式实验前,先用简化的2D模型验证控制逻辑的正确性。
