四旋翼无人机作为一种典型的欠驱动系统,其控制问题一直是自动化领域的研究热点。相比固定翼无人机,四旋翼具有垂直起降、悬停、灵活机动等优势,但也面临着强耦合、非线性等控制挑战。一个完整的四旋翼控制系统通常包含以下几个核心模块:
本文将重点介绍基于MATLAB的四旋翼控制系统实现,包括动力学建模、带积分动作的LQR控制器设计、非线性动力学仿真以及EKF状态估计等关键技术。
在建立四旋翼动力学模型前,需要明确以下两个坐标系:
两个坐标系之间的转换通过旋转矩阵R实现:
R = [cθcψ sφsθcψ-cφsψ cφsθcψ+sφsψ;
cθsψ sφsθsψ+cφcψ cφsθsψ-sφcψ;
-sθ sφcθ cφcθ]
其中,c表示cos,s表示sin;φ、θ、ψ分别代表滚转、俯仰和偏航角。
四旋翼的运动学描述包括位置和姿态两部分:
位置动力学:
mẍ = (cφsθcψ + sφsψ)U₁
mÿ = (cφsθsψ - sφcψ)U₁
mz̈ = (cφcθ)U₁ - mg
姿态动力学:
I_xφ̈ = θ̇ψ̇(I_y - I_z) + U₂
I_yθ̈ = φ̇ψ̇(I_z - I_x) + U₃
I_zψ̈ = φ̇θ̇(I_x - I_y) + U₄
其中,U₁~U₄为控制输入,与四个电机的转速平方成正比:
U₁ = b(ω₁² + ω₂² + ω₃² + ω₄²)
U₂ = lb(ω₄² - ω₂²)
U₃ = lb(ω₃² - ω₁²)
U₄ = d(ω₂² + ω₄² - ω₁² - ω₃²)
在实际飞行中,空气阻力是不可忽略的因素。我们可以在运动方程中加入线性阻尼项:
ẍ = (cφsθcψ + sφsψ)U₁/m - k_xẋ
ÿ = (cφsθsψ - sφcψ)U₁/m - k_yẏ
z̈ = (cφcθ)U₁/m - g - k_zż
其中,k_x、k_y、k_z为各方向的阻尼系数,可以通过风洞实验或系统辨识获得。
线性二次型调节器(LQR)是一种经典的最优控制方法,其目标是最小化如下性能指标:
J = ∫(xᵀQx + uᵀRu)dt
其中,Q和R分别为状态和输入的权重矩阵。通过求解Riccati方程可以得到最优反馈增益矩阵K,控制律为u = -Kx。
由于四旋翼动力学本质上是非线性的,我们需要在工作点附近进行线性化。假设无人机处于悬停状态(φ=θ=ψ=0),可以得到线性化模型:
ẋ = Ax + Bu
其中状态向量x = [x y z φ θ ψ ẋ ẏ ż φ̇ θ̇ ψ̇]ᵀ,控制输入u = [U₁ U₂ U₃ U₄]ᵀ。
为了消除稳态误差,我们在LQR控制器中引入积分动作。具体做法是将状态误差的积分作为新的状态变量:
xᵢ = ∫(x - x_ref)dt
扩展后的系统方程为:
[ẋ; ẋᵢ] = [A 0; C 0][x; xᵢ] + [B; 0]u + [0; -I]x_ref
其中C为输出矩阵。对应的性能指标变为:
J = ∫([x; xᵢ]ᵀQₑ[x; xᵢ] + uᵀRu)dt
matlab复制% 系统线性化
A = [zeros(6) eye(6); zeros(6,12)];
A(7,5) = g; A(8,4) = -g;
B = [zeros(6,4); [zeros(1,4); 1/m*eye(3); zeros(2,4)]];
% 加入空气阻力项
A(7,7) = -k_x; A(8,8) = -k_y; A(9,9) = -k_z;
% 设计LQR控制器
Q = diag([10 10 10 10 10 10 1 1 1 0.5 0.5 0.5]);
R = eye(4);
K = lqr(A, B, Q, R);
% 带积分动作的LQR
A_aug = [A zeros(12,6); [eye(6) zeros(6,6)] zeros(6,6)];
B_aug = [B; zeros(6,4)];
Q_aug = blkdiag(Q, 5*eye(6));
K_aug = lqr(A_aug, B_aug, Q_aug, R);
基于MATLAB/Simulink搭建四旋翼的非线性动力学仿真模型,主要包括以下模块:
由于动力学方程是非线性的,我们需要采用数值积分方法进行求解。常用的龙格-库塔四阶(RK4)方法实现如下:
matlab复制function x_next = rk4(f, x, u, dt)
k1 = f(x, u);
k2 = f(x + dt/2*k1, u);
k3 = f(x + dt/2*k2, u);
k4 = f(x + dt*k3, u);
x_next = x + dt/6*(k1 + 2*k2 + 2*k3 + k4);
end
通过仿真可以验证控制器在不同场景下的性能:
典型的仿真结果如下图所示(位置和姿态响应曲线):


扩展卡尔曼滤波(EKF)是处理非线性系统状态估计的有效方法,其基本步骤如下:
预测步骤:
x̂ₖ⁻ = f(x̂ₖ₋₁, uₖ₋₁)
Pₖ⁻ = Fₖ₋₁Pₖ₋₁Fₖ₋₁ᵀ + Qₖ
更新步骤:
Kₖ = Pₖ⁻Hₖᵀ(HₖPₖ⁻Hₖᵀ + Rₖ)⁻¹
x̂ₖ = x̂ₖ⁻ + Kₖ(zₖ - h(x̂ₖ⁻))
Pₖ = (I - KₖHₖ)Pₖ⁻
其中F和H分别是系统模型和观测模型的雅可比矩阵。
在四旋翼中,EKF主要用于融合IMU和GPS数据:
MATLAB实现核心代码如下:
matlab复制function [x_est, P] = ekf_update(x_pred, P_pred, z, R)
% 计算观测雅可比矩阵H
H = calc_observation_jacobian(x_pred);
% 计算卡尔曼增益
S = H*P_pred*H' + R;
K = P_pred*H'/S;
% 状态更新
z_pred = observation_model(x_pred);
x_est = x_pred + K*(z - z_pred);
% 协方差更新
P = (eye(length(x_pred)) - K*H)*P_pred;
end
通过对比真实状态和估计状态,可以评估EKF的性能。在仿真中,我们通常会添加以下噪声:
典型的EKF估计效果如下图所示:

在实际应用中,准确的模型参数对控制性能至关重要,需要标定的参数包括:
在嵌入式平台上实现时,需要考虑算法复杂度:
为确保飞行安全,应实现以下安全机制:
针对模型不确定性和环境变化,可以采用自适应控制方法:
多无人机协同控制是当前研究热点,主要方法包括:
结合计算机视觉实现无GPS环境下的导航:
在实际项目中,我发现四旋翼控制系统的调试是一个迭代过程,需要反复调整控制器参数和验证模型准确性。特别是在加入积分动作后,需要注意避免积分饱和问题,可以采用抗饱和措施如积分分离或积分限幅。此外,EKF的状态估计性能很大程度上依赖于准确的噪声统计特性,需要通过实验仔细标定过程噪声和观测噪声的协方差矩阵。