引言:无人机故障容错控制的重要性
四旋翼无人机凭借高灵活性和便捷起降优势,广泛应用于航拍测绘、电力巡检及应急救援等领域。然而,在复杂作业环境中,无人机极易遭遇单臂结构故障(如机臂弯曲或断裂)及对应电机故障(如堵转、推力衰减)。这类故障会直接破坏动力学平衡,若控制不当将导致失稳甚至坠毁。传统 PID 或常规滑模控制在面对此类非线性扰动时,往往存在鲁棒性不足或抖振明显的问题。
为此,本文提出一种'遗传算法优化非奇异快速终端滑模控制器(GANFTSMC)+ RBF 径向基神经网络'的故障容错控制方案。核心思路是利用 GA 全局搜索能力优化 NFTSMC 的关键参数,提升收敛速度;同时借助 RBF 神经网络实时估计故障扰动,动态补偿控制输出,确保系统在异常工况下的稳定性。
核心技术原理
1. 故障特性分析
单臂结构故障会导致惯性矩阵和阻尼矩阵突变,电机故障则引发总推力不足和力矩不平衡。两者均属于'参数摄动 + 外部扰动'的复合故障,要求控制算法具备强鲁棒性和快速响应能力。
2. 非奇异快速终端滑模控制器(NFTSMC)
相比传统终端滑模,NFTSMC 解决了奇异值问题,避免滑模面导数趋于无穷大。通过引入指数项加速状态收敛,并结合饱和函数替代符号函数,有效削弱了固有的抖振现象,降低了对执行机构的机械损耗。
3. 遗传算法(GA)参数优化
NFTSMC 的性能高度依赖滑模面系数、收敛指数等参数的选择。GA 模拟生物进化机制,以姿态误差与控制抖振幅度的加权和为适应度函数,通过迭代寻优找到兼顾收敛速度与抗扰性的全局最优参数组合,避免了传统试凑法的局限性。
4. RBF 神经网络补偿
RBF 网络作为三层前馈神经网络,具备逼近任意非线性函数的能力。它以姿态角、角速度等为输入,实时估计故障扰动量,并将估计值反馈至控制端进行修正。这种数据驱动的方式无需精确的故障数学模型,适配性强。
仿真实现与代码解析
以下是基于 MATLAB 实现的系统状态空间方程及控制律求解部分。代码中定义了无人机的物理参数(质量、转动惯量、臂长等),并构建了包含故障注入的状态空间模型。
g = 9.81; % 重力加速度
L = 0.47/2; % 半臂长
m = 1; % 无人机质量
Ix = 0.0081; % X 轴转动惯量
Iy = Ix; % Y 轴转动惯量
Iz = 0.0142; % Z 轴转动惯量
JTP = 10.4e-5;
b = 5.42e-5; % 阻力系数
d = 1.1e-6; % 阻力扭矩系数
Kf = 1e-6;
Kt = 1.2e-6;
%% 控制部分
% 构建变换矩阵,用于解算各电机转速
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);
%% 状态向量定义
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);
s = @(x) sin(x);
wStar = (w1 + w3 - w2 - w4); % 扰动项
%% 故障注入模型
AlphaAngle = FAULT_ANGLES(1);
BetaAngle = FAULT_ANGLES(2);
GammaAngle = FAULT_ANGLES(3);
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);
%% 状态空间方程
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];







