基于MFAC无模型自适应控制的无人艇航向控制
MFAC 算法基本原理是在每个工作点处,建立非线性系统等价的动态线性数据模型,利用受控系统的I/O数据在线估计系统的伪偏导数,然后设计加权一步向前的控制器,进而实现非线性系统数据驱动的无模型自适应控制。MFAC 有三种不同动态线性化方法的算法设计,即基于紧格式动态线性化的无模型自适应控制(Compact Form Dynamic Linearization based MFAC,CFDL-MFAC),基于偏格式动态线性化的无模型自适应控制(Partial Form Dynamic Linearization based MFAC,PFDL-MFAC)以及基于全格式动态线性化的无模型自适应控制(Full Form Dynamic Linearization based MFAC,FFDL-MFAC)。
本文控制方法使用紧格式动态线性化的无模型自适应控制。
参考文献:《无人艇重定义无模型自适应艏向控制方法与试验》
控制律:
控制原理:
MATLAB 实现:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 使用CFDL-MFAC(紧格式动态线性化方法)进行无人艇航向控制
%
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
close all;
clear;
%% 算法参数设定
%仿真时间步长
ts=0.5;
%非线性KT方程参数k,t,α
Kit=0.701;
Tit=0.332;
afa=0.001;
% Kit=0.18;
% Tit=4.65;
% afa=1.07;
% Kit=2.36;
% Tit=5.489;
% afa=0.000094;%风浪流干扰参数
Wn=0.958;
yip=0.9;%风流浪干扰
%浪干扰
langrr=wgn(1,800,(0.1/0.1),'linear');%4级海况
w0=0.808; %波浪频率
tw=6; %波浪周期
kw=0.255; %增益常数
citam=0.527; %波浪强度系数
yipp=0.3; %阻尼系数%MFAC算法参数设置
nata=0.5; %λ
miu=1; %μ
yita=0.1; %η
ru=1; %ρ
Kz=8; %K1
yipsl=0.0000001; %εPI=3.1415926;
%% 参数初始化
num=[kw 0];
den=[1 (2*yipp*w0) (w0*w0)];
hs=tf(num,den);tt=0.1:0.1:80;[langr,xr]=lsim(hs,langrr,tt);Y0 = [0;0];%初值
t = 0.1:ts:80;
t0=0;
Y = cell(1,length(t));
z = zeros(2,length(t));Y0_m=[0;0]; %参考模型
Y_m = cell(1,length(t));
z_m = zeros(2,length(t));
kp=1;
kd=1;
% kp=0.98;
% kd=0.95;
ki=0.0;
error_1=0;error_2=0;
u_1=0;u_2=0;
y_1=0;y_2=0;
r_1=0;r_2=0;
sf_1=0.1;%% 循环
for k=1:200
% d=(langr(k,1)+0.5)*PI/180;d=0;time(k)=k*ts;M=0;if M==1rin(k)=30;fai_r=30;if time(k)>=20&&time(k)<40rin(k)=0;fai_r=0;elseif time(k)>=40&&time(k)<60rin(k)=30;fai_r=30;elseif time(k)>=60&&time(k)<80rin(k)=0;fai_r=0;endendendelserin(k)=PI/3;fai_r=PI/3;endY_m{k}=rkfa_m( ts,t0,Y0_m,Wn,yip,fai_r); %龙格库塔法解航向一阶非线性方程z_m(1,k) = Y_m{k}(1); %参考faiz_m(2,k) = Y_m{k}(2);yrout(k)=z_m(1,k);
% yr(1,k)=z_m(2,k); %参考r
% yr(2,k)=(yr(1,k)-dyr_1)/ts; %参考r'
% u_m(k)=(Tit*yr(2,k)+yr(1,k)+afa*yr(1,k)*yr(1,k)*yr(1,k))/Kit; Y{k}=rkfa_GR( ts,t0,Y0,Kit,Tit,u_1,afa,d); %龙格库塔法解航向一阶非线性方程z(1,k) = Y{k}(1); %faiz(2,k) = Y{k}(2); %ryout(k)=z(1,k);r(k)=z(2,k);error(k)=rin(k)-z(1,k);M2=1; %0:PD控制 1:MFAC控制if M2==0%PD控制部分z_error(k)=yrout(k)-z(1,k);m=1;if m==1%位置式pidu(k)=kp*error(k)+kd*(error(k)-error_1)/ts;else%增量式pidxc(1)=error(k)-error_1; %Calculating Pxc(2)=error(k)-2*error_1+error_2; %Calculating Dxc(3)=error(k); %Calculating Idu(k)=kp*xc(1)+kd*xc(2)/ts+ki*xc(3)*ts;if du(k)>PI/6du(k)=PI/6;end if du(k)<-PI/6du(k)=-PI/6;end u(k)=u_1+du(k);endelse
%MFAC方法sf(k)=sf_1+((yita*(u_1-u_2))*((yout(k)-y_1+(Kz*r(k)-(Kz*r_1)))-(sf_1*(u_1-u_2))))/(miu+(u_1-u_2)*(u_1-u_2));if ((abs(sf(k))<yipsl)||(abs(u_1-u_2)<yipsl))sf(k)=sf_1;endu(k)=u_1+((ru*sf(k))*(rin(k)-(yout(k)+Kz*r(k))))/(nata+(sf(k)*sf(k)));sf_2=sf_1;sf_1=sf(k);end if u(k)>PI/6u(k)=PI/6;end if u(k)<-PI/6u(k)=-PI/6;end%舵速控制
% if (((u(k)-u_1)/ts)>10)
% u(k)=10*ts+u_1;
% else
% if(((u(k)-u_1)/ts)<-10)
% u(k)=-10*ts+u_1;
% end
% end
error_2=error_1;
error_1=error(k);
u_2=u_1;u_1=u(k);
y_2=y_1;y_1=yout(k);
r_2=r_1;r_1=r(k);Y0=Y{k};
z_1=z(2,k);Y0_m=Y_m{k};
end%% 结果可视化
kk=1:199;
figure;
plot(kk*ts,yout(1:199)*180/PI,'r-',kk*ts,rin(1:199)*180/PI,'--');
title('船舶实际航向与设定航向');
xlabel('时间 \fontname{Times New Roman}t/s');
legend('实际航向','设定航向')
ylabel('角度 \fontname{Times New Roman}/° ');figure;
plot(kk*ts,u(1:199)*180/PI,'r-');
title('舵角');
xlabel('时间 \fontname{Times New Roman}t/s');
ylabel('角度 \fontname{Times New Roman}/° ');figure
plot(kk*ts,error(1:199)*180/PI,'r');
title('航向误差');
xlabel('时间 \fontname{Times New Roman}t/s');
ylabel('角度 \fontname{Times New Roman}/° ');% figure
% plot(kk*ts,rin(1:199),'--',kk*ts,yrout(1:199),'b',kk*ts,yout(1:199),'r-',kk*ts,u(1:199),'g');
% title('船舶航向角与舵角');
% axis([0 80 -20 40])
% xlabel('时间 \fontname{Times New Roman}t/s');
% legend('设定航向角','参考航向角','实际航向角','实际舵角')
% ylabel('角度 \fontname{Times New Roman}/° ');
function Y = rkfa_GR( h,t0,Y0,K,T,u,alfa,d )
k1 = fai_GR(t0,Y0,K,T,u,alfa,d);
k2 = fai_GR(t0+h/2,Y0+h/2*k1,K,T,u,alfa,d);
k3 = fai_GR(t0+h/2,Y0+h/2*k2,K,T,u,alfa,d);
k4 = fai_GR(t0+h,Y0+h*k3,K,T,u,alfa,d);
Y = Y0+h*(k1+2*k2+2*k3+k4)/6;
end
function Y = fai_GR( ~,Y0,K,T,u,alfa,d )
% 此处Y0为一个列向量,因为时间t未显含在一阶方程组中
% 所以ode函数的第一个参数为空,要根据具体情况而定。
Y = [Y0(2);(K*(u+d)-Y0(2)-alfa*(Y0(2))^3)/T;];
end
仿真结果分析:
PID:
MFAC:
PID参数手动调优的效果比MFAC的最优效果要好。
当加上干扰后:
PID:
MFAC:
加上干扰后,PID在稳定后依然有误差,且无法真正稳定,MFAC则不需要调整参数也能保证优秀的控制效果。
但是MFAC在调整时间上始终比PID控制慢,需要进一步研究解决。
基于MFAC无模型自适应控制的无人艇航向控制相关推荐
- 【MFAC】基于偏格式动态线性化的无模型自适应控制
来源:侯忠生教授的<无模型自适应控制:理论与应用>(2013年科学出版社).
- 【MFAC】基于全格式动态线性化的无模型自适应控制
来源:侯忠生教授的<无模型自适应控制:理论与应用>(2013年科学出版社).
- 无模型自适应迭代学习控制原理和matlab代码仿真学习记录
无模型自适应ILC原理及代码实现 这里学习的是很老的一篇论文<基于无模型自适应控制的反馈-前馈迭代学习控制系统收敛性研究>,作者是晏静文和侯忠生,大家有兴趣可以找来看看.这里主要介绍的无模 ...
- 无人船/无人艇路径跟踪控制 mmg模型matlab simulink效果
无人船/无人艇路径跟踪控制 mmg模型matlab simulink效果 基于观测器的LOS制导结合反步法控制 ELOS+backstepping ID:69188660989622243
- [论文]基于强化学习的无模型水下机器人深度控制
基于强化学习的无模型水下机器人深度控制 摘要 介绍 问题公式 A.水下机器人的坐标框架 B.深度控制问题 马尔科夫模型 A.马尔科夫决策 B.恒定深度控制MDP C.弯曲深度控制MDP D.海底追踪的 ...
- 基于模型的强化学习比无模型的强化学习更好?错!
作者 | Carles Gelada and Jacob Buckman 编辑 | DeepRL 来源 | 深度强化学习实验室(ID:Deep-RL) [导读]许多研究人员认为,基于模型的强化学习(M ...
- 基于深度强化学习的机器人运动控制研究进展 | 无模型强化学习 | 元学习
1.基于深度强化学习的机器人运动控制研究进展 1.1 深度强化学习 1.1.1 强化学习简介: 强化学习(Reinforcement Learning, RL)利用试错机制与环境进行交互,旨在通过最大 ...
- 【神经网络】基于RBF神经网络的六关节机械臂无模型控制
前言:最近在搞神经网络,看到有用神经网络逼近未建模动态的,也有用神经网络来逼近整个模型的,后者即是无模型控制.无模型控制它不需要知道系统的名义模型,直接用神经网络来逼近整个系统,感觉这个方法还蛮厉害的 ...
- 水面无人艇局部危险避障算法研究 第1章 绪论
水面无人艇局部危险避障算法研究 Local Risk Obstacle Avoidance Algorithm of USV 博主 的硕士毕业论文 第1章 绪论 1.1 引言 随着世界人口的不断增长以 ...
- 第2章 无人艇局部危险避障算法研究
水面无人艇局部危险避障算法研究 Local Risk Obstacle Avoidance Algorithm of USV 博主 的硕士毕业论文 第2章 无人艇局部危险避障算法研究 2.1 无人艇局 ...
最新文章
- 太牛逼了!项目中用了Disruptor之后,性能提升了2.5倍
- 使用舵机PWM信号控制直流电机的转动
- 晚安科大20211130
- 除掉字符串里面相同的字符
- ssm使用全注解实现增删改查案例——IEmpService
- ML《决策树(三)CART》
- hadoop mapreduce开发实践之本地文件分发by streaming
- Amazon Lambda支持以简单队列服务作为事件源了
- Silverlight提示“Load 操作失败。远程服务器返回了错误: NotFound”
- 九存:重新定义存储矿机
- html 给一个无限宽,html – CSS div与其内容一样宽
- ArcGIS的ArcMap的Mxd格式符号转换为Geoserver style的sld格式
- 截止失真放大电路_Multisim基本放大电路仿真实验
- mysql 整除取整,MySQL小数位取整
- IDEA download sources 报Cannot reconnect错误解决方法
- 小的以及大的Typhon IDE
- 数据分析--数据分析是什么?
- spring boot 引用 shiro 认证AD域
- Unity3d学习笔记 var 关键字
- 遇到class path resource [applicationcontext.xml] cannot be opened becaus的问题该怎么解决??