四旋翼无人机的运动本质上是刚体在三维空间中的六自由度运动。我们需要建立两组核心方程:
平动动力学方程:
math复制m\ddot{\mathbf{r}} = m\mathbf{g} + \mathbf{R}\mathbf{F}
其中旋转矩阵R是关键桥梁,它将机体坐标系下的升力转换到世界坐标系。这个矩阵的构造非常精妙:
matlab复制R = [cosθ*cosψ, sinφ*sinθ*cosψ-cosφ*sinψ, cosφ*sinθ*cosψ+sinφ*sinψ;
cosθ*sinψ, sinφ*sinθ*sinψ+cosφ*cosψ, cosφ*sinθ*sinψ-sinφ*cosψ;
-sinθ, sinφ*cosθ, cosφ*cosθ];
转动动力学方程:
math复制\mathbf{I}\dot{\boldsymbol{\omega}} + \boldsymbol{\omega}\times\mathbf{I}\boldsymbol{\omega} = \boldsymbol{\tau}
这里出现的科里奥利力项(ω×Iω)是姿态控制中容易忽视的非线性耦合项。
实际建模时要注意:转动惯量矩阵I必须基于无人机的实际几何形状计算。对于常见的十字型四旋翼,可以简化为三个主轴惯量构成的对角矩阵。
完整的仿真模型应包含以下子系统:
控制输入模块:
多环PID控制器:
控制分配模块:
matlab复制% 典型的控制分配矩阵
mix_matrix = [1, 1, 1, 1;
1, -1, -1, 1;
-1, -1, 1, 1;
-1, 1, -1, 1];
电机模型:
环境扰动模块:
采用从内到外的分层整定策略:
每个环路的调试要点:
| 控制环 | 主要影响 | 典型KP范围 | 典型KI范围 | 典型KD范围 |
|---|---|---|---|---|
| 角速率 | 响应速度 | 0.1-1.0 | 0-0.1 | 0.01-0.1 |
| 姿态 | 稳态精度 | 3.0-6.0 | 0-0.5 | 0.3-1.0 |
| 位置 | 轨迹跟踪 | 0.5-2.0 | 0.1-0.3 | 0.2-0.8 |
高度控制环:
matlab复制% 保守起调的参数
KP_z = 0.5; % 初始值取目标高度的1/2
KI_z = 0.02; % 初始设为KP的1/25
KD_z = 0.2; % 初始设为KP的1/2
调试步骤:
姿态控制环:
matlab复制% 典型参数配置
KP_angle = 4.5; % 需要比位置环更激进
KI_angle = 0.0; ! 姿态环通常不加积分
KD_angle = 0.6; % 提供必要的阻尼
关键发现:姿态动力学本身具有积分特性(角度是角速率的积分),额外积分项会导致系统不稳定。
Simulink中常见的代数环错误:
code复制Error: Algebraic loop detected at 'quad_model/Attitude Controller/Sum'
解决方案:
模型离散化:
代码生成优化:
matlab复制% 在Model Configuration中设置:
SolverType = "Fixed-step";
Solver = "ode4 (Runge-Kutta)";
FixedStep = "0.02"; % 50Hz
子系统封装:
风场建模:
matlab复制% 简化的阵风模型
gust = gust_amp * (1 - exp(-t/gust_tau));
wind = [gust; 0; 0]; % 仅X方向
扰动观测器设计:
基于模型参考自适应控制(MRAC)的方案:
matlab复制% 自适应律示例
gamma = 0.1; % 自适应增益
theta_dot = -gamma * e * w;
其中e为跟踪误差,w为回归量。
开环测试:
频域分析:
matlab复制% 获取线性化模型
[A,B,C,D] = linmod('quad_model');
sys = ss(A,B,C,D);
bode(sys);
时域测试:
参数整定口诀:
典型问题排查表:
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无人机缓慢漂移 | 积分项不足/传感器零偏 | 校准IMU/适当增加KI |
| 高频抖动 | 微分增益过大/噪声未滤波 | 降低KD/添加低通滤波器 |
| 发散失控 | 代数环/参数极性错误 | 检查信号流向/参数符号 |
Quad_v20230715_PIDtuned.slx在完成第23次参数迭代后,我的模型终于能在5级风扰动下保持±0.1m的位置精度。这个过程让我深刻体会到,好的控制算法就像优秀的骑手,既能让马儿快速奔跑,又能在急停时保持优雅姿态。最后分享一个实用技巧:调参时把Scope窗口的History Limit设为5000以上,这样能完整记录整个 transient过程,方便分析超调量和稳定时间。