✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。
🍎 往期回顾关注个人主页:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:格物致知,完整Matlab代码获取及仿真咨询内容私信。
🔥 内容介绍
一、引言:无人机故障容错控制 —— 飞行安全的核心保障
四旋翼无人机凭借灵活性高、起降便捷等优势,广泛应用于航拍测绘、电力巡检、应急救援等领域。然而,在复杂作业环境中,无人机易遭遇单臂结构故障(如机臂弯曲、断裂导致的动力学特性突变)与对应电机故障(如电机堵转、推力衰减、完全失效),这类故障会直接破坏无人机的动力学平衡,若控制不当将导致飞行失稳甚至坠毁。
传统控制算法(如 PID、常规滑模控制)难以应对故障带来的非线性扰动与参数突变:PID 控制鲁棒性不足,故障后易出现超调量大、收敛缓慢等问题;常规滑模控制存在 “抖振现象”,且终端滑模的奇异值问题会影响控制连续性。本文提出 “遗传算法优化非奇异快速终端滑模控制器(GANFTSMC)+RBF 径向基神经网络” 的故障容错控制方案:通过 GA 优化 NFTSMC 的控制参数,提升收敛速度与抗抖振能力;利用 RBF 神经网络实时估计故障扰动,动态补偿控制输出,确保无人机在单臂结构与电机故障下仍能稳定飞行。
二、核心基础:四大关键技术的原理与适配逻辑
- 四旋翼无人机故障特性分析
四旋翼无人机通过四个电机的转速差实现姿态与位置控制,单臂结构故障与对应电机故障的核心影响的核心影响如下:
单臂结构故障:机臂长度变化、刚度下降导致电机安装位置偏移,推力矢量方向改变,动力学模型中的惯性矩阵、阻尼矩阵参数突变;
电机故障:包括部分推力损失(如推力衰减 30%-70%)、完全失效(推力降为 0),导致总推力不足、力矩不平衡,无人机出现偏航、滚转等姿态失稳;
故障共性:均属于 “参数摄动 + 外部扰动” 的复合故障,需控制算法具备快速响应、强鲁棒性、动态补偿能力。
- 非奇异快速终端滑模控制器(NFTSMC):故障控制核心框架
NFTSMC 是在传统终端滑模控制(TSMC)基础上的改进算法,解决了 TSMC 的奇异值问题与收敛速度不足的痛点:
核心原理:通过设计非奇异终端滑模面,使系统状态在有限时间内收敛至平衡点,且避免滑模面导数趋于无穷大的奇异现象;
快速收敛特性:结合快速终端滑模的设计思想,引入指数项加速状态收敛,较常规滑模控制收敛速度提升 40% 以上;
抗抖振设计:采用饱和函数替代符号函数,削弱滑模控制固有的 “抖振现象”,减少对无人机执行机构(电机)的机械损耗;
适配性:非线性控制特性与无人机故障后的强非线性动力学模型高度契合,能快速抑制故障扰动。
- 遗传算法(GA):NFTSMC 参数的智能优化器
NFTSMC 的控制性能依赖关键参数(如滑模面系数、饱和函数边界、收敛指数)的合理选择,传统试凑法效率低、易陷入局部最优,GA 通过模拟生物进化的 “选择 - 交叉 - 变异” 机制实现参数全局优化:
参数编码:将 NFTSMC 的 3 个核心参数(滑模系数 c、收敛指数 α/β、饱和函数边界 ε)编码为二进制染色体,形成初始种群;
适应度函数:以无人机故障后的姿态误差(滚转角、俯仰角、偏航角误差)与控制抖振幅度的加权和为适应度函数,目标是最小化适应度值;
优化流程:通过选择算子保留优优质个体、交叉算子实现基因重组、变异算子避免局部最优,迭代 50 代后输出全局最优参数组合;
优势:较网格搜索、粒子群算法,GA 的全局搜索能力更强,能在复杂参数空间中找到兼顾收敛速度与抗抖振的最优解。
- RBF 径向基神经网络:故障扰动的实时补偿器
RBF 神经网络是一种三层前馈神经网络,具备逼近任意非线性函数的能力,用于估计无人机故障后的未知扰动:
核心原理:以无人机的姿态角、角速度、电机转速为输入,故障扰动(如推力损失量、力矩偏差)为输出,通过梯度下降法调整网络权值,实现扰动的实时逼近;
补偿机制:将 RBF 估计的扰动值反馈至 NFTSMC 的控制输入端,动态修正控制量,抵消故障对系统的影响;
适配性:无需建立精确的故障数学模型,仅通过数据驱动即可实现扰动估计,适配单臂结构与电机故障的不确定性。
三、完整控制流程:故障容错控制的闭环实现
Image
Image
Image
⛳️ 运行结果
Image
Image
Image
Image
📣 部分代码
g = 9.81; % Gravity Acceleration
L = 0.47/2; % One-Half Length. Full Length equals 2*L = 47cm
m = 1; % Mass of the Quadrotor
Ix = 0.0081; % X Axis Moment of Intertia
Iy = Ix; % Y Axis Moment of Intertia
Iz = 0.0142; % Z Axis MOMENT of Intertia
JTP = 10.4e-5;
b = 5.42e-5; % Drag Force Coefficient
d = 1.1e-6; % Drag Torque Coefficient
Kf = 1e-6;
Kt = 1.2e-6;
AlphaAngle = FAULT_ANGLES(1);
BetaAngle = FAULT_ANGLES(2);
GammaAngle = FAULT_ANGLES(3);
%% Control Part
Transform_Matrix = [b b b b
0 -b*L 0 b*L
-b*L 0 b*L 0
d -d d -d];
uThrust = m*sqrt(u(1)^2+u(2)^2+(g+u(3))^2);
Sol_Vector = [uThrust u(4) u(5) u(6)]'; % [Uz, Uphi, Utheta, Upsi]'
w2_2 = uThrust/(4*b) - u(6)/(4*d) - u(4)/(2*b*L);
Squared_W = (linsolve(Transform_Matrix,Sol_Vector));
w1s = Squared_W(1);
w2s = Squared_W(2);
w3s = Squared_W(3);
w4s = Squared_W(4);
W = real(sqrt([w1s w2s w3s w4s]));
w1 = W(1);
w2 = W(2);
w3 = W(3);
w4 = W(4);
%% B. State Vector
% X = x(1);
% y = x(2);
% z = x(3);
phi = x(4);
theta = x(5);
say = x(6);
xDot = x(7);
yDot = x(8);
zDot = x(9);
phiDot = x(10);
thetaDot = x(11);
sayDot = x(12);
c = @(x) cos(x); % Cosine Function
s = @(x) sin(x); % Sinusoidal Function
wStar = (w1 + w3 - w2 - w4); % Disturbance
%% C. Fault Injection
f1 = s(AlphaAngle)*s(GammaAngle);
f2 = -c(GammaAngle)*s(BetaAngle) + s(GammaAngle)*c(BetaAngle)*c(AlphaAngle);
f3 = c(BetaAngle)*c(GammaAngle) + c(AlphaAngle)*s(BetaAngle)*s(GammaAngle)-1;
f4 = f2*s(BetaAngle)-(1+f3)*c(BetaAngle)+1;
f5 = f1*s(BetaAngle);
f6 = f1*c(BetaAngle);
ufx = (b/m)*w2_2*(+f1*(c(theta)*c(say)) + f2*(c(say)*s(phi)*s(theta) - c(phi)*s(say)) + f3*(s(phi)*s(say) + c(phi)*c(say)*s(theta)));
ufy = (b/m)*w2_2*(+f1*(c(theta)*s(say)) + f2*(c(phi)*c(say) + s(phi)*s(theta)*s(say)) + f3*(-c(say)*s(phi) + c(phi)*s(say)*s(theta)));
ufz = (b/m)*w2_2*(-f1*s(theta) + f2*c(theta)*s(phi) + f3*c(phi)*c(theta));
ufPhi = (JTP*w2/Ix)*(sayDot*f2 - f3*thetaDot) + (1/Ix)*w2_2*(b*L*f4 + f1*d);
ufTheta = (JTP/Iy)*w2*(sayDot*f1 + f3*phiDot) + (1/Iy)*(w2_2)*(-f2*d + L*b*f5);
ufSay = (JTP*w2)/Iz*(-f1*thetaDot - f2*phiDot) + (1/Iz)*(w2_2)*(-f3*d - f6*L*b);
%% State Space
xDoubleDot = u(1)-Kf*xDot/m+ufx;
yDoubleDot = u(2)-Kf*yDot/m+ufy;
zDoubleDot = u(3)-Kf*zDot/m+ufz;
phiDoubleDot = ((Iy-Iz)/Ix)*thetaDot*sayDot+JTP*thetaDot*wStar/Ix+u(4)/Ix-Kt*L*phiDot/Ix+ufPhi;
thetaDoubleDot = ((Iz-Ix)/Iy)*phiDot*sayDot-JTP*phiDot*wStar/Iy+u(5)/Iy-(Kt*L/Iy)*thetaDot+ufTheta;
psiDoubleDot = ((Ix-Iy)/Iz)*phiDot*thetaDot+u(6)/Iz-(Kt*L/Iz)*sayDot+ufSay;
XDOT = [x(7:12)
xDoubleDot
yDoubleDot
zDoubleDot
phiDoubleDot
thetaDoubleDot
psiDoubleDot];
end
🔗 参考文献
🎈 部分理论引用网络文献,若有侵权联系博主删除
🏆团队擅长辅导定制多种科研领域MATLAB仿真,助力科研梦: