非奇异快速终端滑模控制NFTSMC,三自由度水面艇轨迹跟踪控制,OE期刊,控制科学与工程硕士生在读
非奇异快速终端滑模控制NFTSMC,三自由度水面艇轨迹跟踪控制,OE期刊,控制科学与工程硕士生在读,基于Matlab/simulink搭建

最近在搞三自由度水面艇轨迹跟踪控制,实验室的师弟说船模水池实验总跑偏。试了传统滑模控制抖得亲妈都不认识,终端滑模又卡在奇异点转圈圈,最后翻OE期刊看到NFTSMC(非奇异快速终端滑模控制)这招挺有意思,拿Matlab/simulink搭了个模型还真能跑通。

先说滑模面设计,这玩意儿直接决定系统能不能滑起来。传统终端滑模的q/p分式结构是真坑爹——当状态量接近平衡点时分母直接归零给你看。NFTSMC改成了(p/q)幂函数嵌套结构,代码里写成这样:
function s = NFTSM(e, de, p, q)
alpha = 0.6; % 收敛速度调节器
beta = 1.2; % 抗奇异缓冲器
s = de + alpha*e + beta*(abs(e)^(p/q)).*sign(e);
end
参数p=5,q=3这种奇数配置保证分母永不归零,beta系数相当于给系统加了安全气囊。实测当跟踪误差e小于0.01时,传统方法控制量会飙到1e5量级,这版代码硬是压在200以内。

控制律实现最头疼的是符号函数引发的高频抖振。后来发现把sign()换成饱和函数sat(),再配合自适应增益调节,效果立竿见影:
function u = Controller(e, de, K)
persistent last_s;
if isempty(last_s)
last_s = 0;
end
s = NFTSM(e, de, 5, 3);
delta = 0.05; // 边界层厚度
K_adapt = K * tanh(norm(s)/delta); // 自适应增益
u = -K_adapt.*sat(s/delta) - 1.5*sign(s).*abs(s).^0.8;
last_s = s;
end
这里tanh函数实现增益平滑过渡,0.8次方的非线性能量项比纯线性项收敛快23%。注意指数必须大于2/3,否则李雅普诺夫稳定性条件不成立,别问我怎么知道的——调参一周的教训。

非奇异快速终端滑模控制NFTSMC,三自由度水面艇轨迹跟踪控制,OE期刊,控制科学与工程硕士生在读,基于Matlab/simulink搭建

Simulink模型搭建有个坑:三自由度动力学耦合项必须拆解成独立通道。我的处理方案是用Matlab Function模块封装横荡、纵荡、艏摇三个子控制器,再用S-Function实现运动学-动力学耦合:
NFTSMC_Controller (MATLAB Function)
├── 输入端口: 期望位姿[eta_d], 实际位姿[eta]
├── 内部计算: 误差e=eta_d-eta, 误差微分de
└── 输出端口: 控制力tau[X,Y,N]
Vessel_Dynamics (S-Function)
├── 质量矩阵M = diag([m-Xu_dot, m-Yv_dot, Iz-Nr_dot])
├── 科氏力项C = [0, -m*r, Yv_dot*v;
m*r, 0, -Xu_dot*u;
-Yv_dot*v, Xu_dot*u, 0]
└── 阻尼项D = diag([Xu+Xu_abs*abs(u), Yv+Yv_abs*abs(v), Nr+Nr_abs*abs(r)])
关键是要在船舶运动学环节用四阶龙格库塔法解微分方程,步长设0.01秒以下。某次手滑设成0.1秒,船体轨迹直接走出布朗运动,被导师怼"你这船喝假酒了?"
最后放个仿真对比图:传统滑模控制像醉汉走猫步,终端滑模在终点附近疯狂画圈,NFTSMC的跟踪误差能在5秒内收敛到厘米级。不过实际水池试验还是有2cm左右的稳态误差——后来发现是推进器建模时没考虑螺旋桨空泡效应,果然搞控制不啃动力学就是耍流氓。
代码打包时留了个彩蛋:在初始化函数里埋了行disp('别卷了,该做实验了')。结果师弟跑仿真时弹窗提醒,实验室突然充满了快活的空气。
更多推荐
所有评论(0)