多旋翼无人机在复杂环境下的稳定飞行控制一直是研究热点。横向动力学控制作为飞行控制系统的核心部分,其性能直接影响无人机的飞行品质和任务执行能力。在实际应用中,无人机常面临参数不确定性、外部扰动(如风扰)和执行器饱和等问题,这使得传统PID控制难以满足高精度、强鲁棒性的控制需求。
鲁棒控制方法通过考虑系统的不确定性因素,能够在保证稳定性的同时提供良好的动态性能。本文将详细介绍基于Matlab的多旋翼无人机横向动力学鲁棒控制实现方案,包括滑模控制(SMC)、自适应鲁棒控制、干扰观测器(DOB)和H∞控制等方法的原理与实现。
多旋翼无人机的横向动力学可以通过牛顿-欧拉方程描述。假设无人机在水平面运动,忽略垂直方向动态,我们建立简化的横向动力学模型:
code复制mẍ = u_x - d_x
mÿ = u_y - d_y
其中:
这个二阶系统可以表示为状态空间形式:
code复制ẋ = Ax + Bu + Bd
y = Cx
其中状态向量x = [x, ẋ, y, ẏ]ᵀ,控制输入u = [u_x, u_y]ᵀ,扰动d = [d_x, d_y]ᵀ。
实际系统中存在多种不确定性因素:
这些不确定性使得精确建模变得困难,也凸显了鲁棒控制的必要性。
滑模控制的核心思想是设计一个滑模面,使系统状态在有限时间内到达并保持在滑模面上。对于位置跟踪问题,我们定义跟踪误差:
code复制e = [x-x_d, y-y_d]ᵀ
设计积分型滑模面:
code复制s = ė + λe + λ_i∫e dt
其中λ和λ_i为设计参数,决定误差收敛动态。
控制输入由等效控制u_eq和切换控制u_sw组成:
code复制u = u_eq + u_sw
等效控制保证理想滑动模态动态:
code复制u_eq = m(ẍ_d - λė - λ_i e)
切换控制用于补偿扰动,采用饱和函数代替符号函数减小抖振:
code复制u_sw = -K sat(s/Φ)
其中K为切换增益,Φ为边界层厚度。
matlab复制% 滑模控制器参数
lambda = diag([2,2]); % 滑模面参数
lambda_i = diag([0.5,0.5]); % 积分项增益
K = diag([5,5]); % 切换增益
phi = 0.1; % 边界层厚度
% 滑模面计算
s = edot + lambda*e + lambda_i*e_int;
% 控制量计算
u_eq = mass*(xddot_d - lambda*edot - lambda_i*e);
u_sw = -K*tanh(s/phi); % 使用tanh近似饱和函数
u = u_eq + u_sw;
提示:实际实现时应考虑执行器饱和限制,对控制量进行限幅处理。
针对扰动上界未知的问题,采用自适应方法在线估计扰动上界。设计自适应律:
code复制ˆd = γs
其中γ为自适应增益矩阵。控制律调整为:
code复制u = u_eq - ˆd - Ks
构造Lyapunov函数:
code复制V = 1/2 sᵀMs + 1/2 ˜dᵀΓ⁻¹˜d
其中˜d = d - ˆd为估计误差。通过适当选择参数可保证V̇ ≤ 0。
matlab复制% 自适应参数
gamma = diag([0.1,0.1]); % 自适应增益
% 扰动估计
d_hat = gamma*s;
% 自适应控制律
u = u_eq - d_hat - K*s;
干扰观测器通过构建扰动估计来补偿系统扰动。设计如下观测器:
code复制ż = -Lz - L²x - Lu
ˆd = z + Lx
其中L为观测器增益矩阵。
观测器增益L决定扰动估计的收敛速度。通常选择:
code复制L = ω_o I
其中ω_o为观测器带宽,一般取为系统带宽的3-5倍。
matlab复制% 观测器参数
wo = 20; % 观测器带宽
L = wo*eye(2);
% 干扰观测器实现
z_dot = -L*z - L^2*x - L*u;
d_hat = z + L*x;
% 控制量修正
u = u_nominal - d_hat;
H∞控制通过最小化最坏情况下的扰动到输出的增益来保证鲁棒性。设计目标是:
code复制‖T_zd‖∞ < γ
其中T_zd为从扰动d到性能输出z的传递函数。
通过求解Riccati方程或LMI优化确定控制器增益。在Matlab中可以使用hinfsyn函数:
matlab复制% 构建增广系统
P = augw(G,W1,[],W2);
% H∞综合
[K,~,gamma] = hinfsyn(P,ny,nu);
考虑以下测试场景:
| 控制方法 | 稳态误差(m) | 超调量(%) | 扰动恢复时间(s) |
|---|---|---|---|
| PID | 0.15 | 12.5 | 3.2 |
| SMC | 0.02 | 1.8 | 0.8 |
| 自适应SMC | 0.01 | 0.5 | 0.5 |
| DOB+SMC | 0.008 | 0.3 | 0.3 |
| H∞ | 0.03 | 2.5 | 1.0 |
![]()
图:不同控制方法的位置跟踪性能对比

图:各控制方法的控制输入对比
多旋翼无人机的电机推力存在上下限,需在控制器中考虑饱和特性:
实际系统中的传感器噪声会影响控制性能:
matlab复制% 主程序 main.m
% 1. 初始化参数
init_parameters;
% 2. 生成期望轨迹
generate_reference;
% 3. 仿真循环
for k = 1:N
% 状态获取
x = get_state(k);
% 控制器计算
u = smc_controller(x, x_ref);
% 系统动态更新
x_next = drone_dynamics(x, u);
% 数据记录
save_data(k, x, u);
end
% 4. 绘图
plot_results;
matlab复制function u = smc_controller(x, x_ref)
% 误差计算
e = x(1:2) - x_ref(1:2);
edot = x(3:4) - x_ref(3:4);
% 积分误差(抗饱和处理)
e_int = e_int + e*dt;
if norm(e_int) > e_int_max
e_int = e_int/norm(e_int)*e_int_max;
end
% 滑模面计算
s = edot + lambda*e + lambda_i*e_int;
% 控制量计算
u_eq = mass*(xddot_ref - lambda*edot - lambda_i*e);
u_sw = -K*tanh(s/phi);
u = u_eq + u_sw;
% 控制量限幅
u = saturate(u, u_min, u_max);
end
matlab复制function x_next = drone_dynamics(x, u)
% 状态: x = [px, py, vx, vy]'
% 控制: u = [ux, uy]'
% 实际质量(考虑不确定性)
m_real = m_nominal*(1 + 0.2*sin(0.5*t));
% 外部扰动
d = [0; 0];
if t > 5, d(1) = 2; end
if t > 8, d(2) = 1.5; end
% 状态导数
xdot = zeros(4,1);
xdot(1:2) = x(3:4);
xdot(3:4) = (u - d)/m_real;
% 状态更新
x_next = x + xdot*dt;
end
完整的无人机控制需要位置控制与姿态控制协同工作:
将单机控制扩展到多机协同:
在实际应用前建议进行硬件在环(HIL)测试:
在实际飞行测试中,我们发现初始参数在仿真中表现良好的控制器可能需要进一步调整才能适应真实飞行环境。特别是在强风条件下,需要增大干扰观测器带宽和提高滑模切换增益。同时,执行器饱和问题在实际中更为突出,必须仔细设计抗饱和策略。