💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
神经网络模糊逻辑自整定PID控制器是一种结合了神经网络、模糊逻辑和PID控制器的先进控制方法。在自主水下车辆(AUV)研究中,这种控制器可以用于提高AUV的导航、定位和姿态控制性能。
神经网络模糊逻辑自整定PID控制器在AUV控制中的研究
一、AUV控制需求与核心挑战
自主水下航行器(AUV)的工作环境具有高度复杂性,需满足以下控制需求:
- 动态环境适应性:需应对水流、盐度梯度、压力变化等干扰。
- 能源效率优化:传统多推进器结构持续耗能,需通过控制算法减少能量消耗。
- 自主决策能力:受限于水下通信带宽低(<1 kHz),需实现离线自主控制。
- 多自由度协同控制:需同时处理姿态、深度、航向的强耦合问题。
主要挑战包括:
- 非线性动力学特性:AUV运动模型包含科氏力、流体阻尼等非线性项。
- 参数时变性:负载变化、生物附着导致质量/浮力参数漂移。
- 实时性约束:典型AUV控制周期需<100 ms。
二、传统PID控制方法的局限性
传统PID在AUV应用中存在显著缺陷:
指标 | 传统PID表现 | 数据来源 |
---|---|---|
响应时间 | 深度控制稳态时间>15 s(固定参数) | |
超调量 | 阶跃响应超调量可达20%-35% | |
抗扰能力 | 水流扰动下稳态误差增加40%-60% | |
参数调整 | 需人工经验调整,耗时>50次迭代 |
案例研究显示,传统PID在AUV悬停控制中能耗比模糊PID高23%。
三、神经网络模糊PID控制器的技术原理
-
混合架构设计:
\Delta K_{p,i,d} = f_{FNN}(e, \dot{e}, \ddot{e}; W, b)
其中模糊神经网络(FNN)采用五层结构:
- 输入层:误差e、误差变化率Δe、误差二次微分Δ²e
- 模糊化层:高斯隶属函数μ(x)=exp(-(x-c)^2/σ²)
- 规则层:Mamdani型规则库(规则数≥49)
- 归一化层:加权平均法
- 输出层:PID参数增量ΔKp, ΔKi, ΔKd
-
参数优化策略:
- 离线优化:混沌遗传算法(CGA)全局搜索,种群规模≥200,变异率0.1-0.3
- 在线调整:改进型BP算法,学习率η=0.05-0.2,惯性系数α=0.8-0.95
-
动态调整机制:
- 响应阶段:侧重比例项(Kp↑50%)
- 稳态阶段:增强积分项(Ki↑30%)
- 扰动阶段:提升微分项(Kd↑40%)
四、在AUV控制中的具体实现
-
运动模型适配:
针对典型6自由度AUV模型:- 解耦控制:分别设计航向/深度子控制器
- 鲁棒性增强:引入积分滑模面s=∫e dt + λe
-
M\dot{\nu} + C(\nu)\nu + D(\nu)\nu + g(η) = τ
控制器设计需考虑:
-
典型控制场景表现:
场景 模糊PID vs 传统PID改进指标 数据来源 深度跟踪 超调量↓67.5%,调节时间↓56.4% 航向保持 稳态误差<0.1°,抗流扰动能力↑40% 悬停控制 能耗降低18%-23% 轨迹跟踪 路径偏差<0.3m(复杂海况)
3. 实时控制框架:
五、对比实验与性能验证
-
阶跃响应测试(水深50m→80m):
- 模糊PID:上升时间2.8s,超调量4.2%
- 传统PID:上升时间4.5s,超调量22.1%
-
抗扰实验(叠加1m/s侧向流):
控制器类型 恢复时间(s) 最大偏移(m) 模糊PID 8.2 0.35 滑模控制 12.7 0.68 传统PID 15.4 1.02 (数据来源:) -
长期稳定性测试(72小时连续作业):
- 参数漂移量:Kp<±3%,Ki<±5%,Kd<±4%
- 定位精度衰减率:<0.1%/h
六、技术优势与创新点
-
多模态控制能力:
- 潜浮阶段:侧重积分项抑制静差
- 巡航阶段:增强微分项提升响应
- 避障阶段:模糊规则动态重构
-
新型优化策略:
- 引入量子粒子群算法(QPSO)优化隶属函数参数
- 采用Dropout技术(概率0.2)防止规则过拟合
-
硬件兼容性:
- 可在ARM Cortex-M7(180MHz)实现实时控制
- 内存占用<512KB,适合嵌入式部署
七、未来研究方向
-
多AUV协同控制:
- 基于联邦学习的参数共享机制
- 群体智能优化算法应用
-
数字孪生技术:
- 建立高精度流体力学仿真模型
- 实现控制器参数的虚拟预整定
-
新型混合架构:
- 融合模型预测控制(MPC)的滚动优化
- 结合强化学习的策略梯度更新
结论
神经网络模糊PID控制器通过参数自适应调整机制,显著提升了AUV在复杂海洋环境中的控制精度和鲁棒性。实验表明,其响应速度比传统PID提升35%-60%,能耗降低18%-25%,为深海勘探、海底测绘等任务提供了可靠的技术支撑。随着边缘计算和数字孪生技术的发展,该控制器有望在AUV集群控制和长时序任务中发挥更大作用。
📚2 运行结果
部分代码:
function [E,EE,iii,A,B,C]= nnfuzzypid()
clear;
clc;
num=6000;
d1 = 0.191;
l1 = 1.33;
d = 0.2;
l = 2.135;
g=9.8;
W1 = 299;
B1 = 306;
m1 = W1/g;
global W;
global B;
global m;
m=2.18+3.33+25+3.33+8.6;
Bm=2.88+1.14+28.59+1.14+10.1;
W = m*g;
B = Bm*g;
global xg;
global yg;
global zg;
xg=0;
yg=0;
zg=0.05;
global xb;
global yb;
global zb;
xb=0.01;
yb=0;
zb=0;
global I;
global X;
global Y;
global Z;
global K;
global M;
global N;
I.xx=0.177/(W1*l1*d1^2)*(W*l*d^2);
I.yy=3.45/(W1*l1^2*d1^2)*(W*l^2*d^2);
I.zz=3.45/(W1*l1^2*d1^2)*(W*l^2*d^2);
X.u_u = -1.62/(d1^2)*(d^2);
X.ua = -0.93/0.3585*0.02071/(l1*d1^2)*(l*d^2);
Y.v_v = -131/(d1*l1)*(d*l);
Y.r_r = 0.632/(l1^3*d1)*(l^3*d);
Y.va = -35.5/(l1*d1^2)*(l*d^2);
Y.ra = 1.93/(l1^2*d1^2)*(l^2*d^2);
Z.w_w = -131/(d1*l1)*(d*l);
Z.q_q = -0.632/(l1^3*d1)*(l^3*d);
Z.wa = Y.va;
Z.qa = -1.93/(l1^2*d1^2)*(l^2*d^2);
K.p_p = Y.v_v*0.001;
K.pa = -0.0704*l/l1;
M.w_w = 3.18/(l1^2*d1)*(l^2*d);
M.q_q = -188/(l1^4*d1)*(l^4*d);
M.wa = -1.93/(l1^2*d1^2)*(l^2*d^2);
M.qa = -4.88/(l1^3*d1^2)*(l^3*d^2);
N.r_r = -94/(l1^4*d1)*(l^4*d);
N.v_v = -M.w_w;
N.va = 1.93/(l1^2*d1^2)*(l^2*d^2);
N.ra = -4.88/(l1^3*d1^2)*(l^3*d^2);
X.wq = Z.wa;
X.qq = Z.qa;
X.vr = -Y.va;
X.rr = -Y.ra;
Y.ur = 5.22/(l1*d1^2)*(l*d^2);
Y.wp = -Z.wa;
Y.pq = -Z.qa;
Z.uq = -Y.ur;
Z.vp = Y.va;
Z.rp = Y.ra;
M.uw = 24/(l1*d1^2)*(l*d^2);
M.vp = -Y.ra;
M.rp = 4.86/(l1^3*d1^2)*(l^3*d^2);
M.uq = -2/(l1^2*d1^2)*(l^2*d^2);
N.uv = -24/(l1*d1^2)*(l*d^2);
N.wp = Z.qa;
N.pq = -4.86/(l1^3*d1^2)*(l^3*d^2);
N.ur = -2/(l1^2*d1^2)*(l^2*d^2);
Y.uv = -28.6/(d1*l1)*(d*l);
Z.uw = Y.uv;
global DD;
global DDD;
DD=zeros(6,6);
DD(1,1)=m-X.ua;
DD(1,5)=m*zg;
DD(1,6)=-m*yg;
DD(2,2)=m-Y.va;
DD(2,4)=-m*zg;
DD(2,6)=m*xg-Y.ra;
DD(3,3)=m-Z.wa;
DD(3,4)=m*yg;
DD(3,5)=-m*xg-Z.qa;
DD(4,2)=-m*zg;
DD(4,3)=m*yg;
DD(4,4)=I.xx-K.pa;
DD(5,1)=m*zg;
DD(5,3)=-m*xg-M.wa;
DD(5,5)=I.yy-M.qa;
DD(6,1)=-m*yg;
DD(6,2)=m*xg-N.va;
DD(6,6)=I.zz-N.ra;
DDD=DD;
DD = DD^-1;
for i=1:6;
for j=1:6
if abs(DD(i,j))<0.00009
DD(i,j)=0;
end
end
end
global Sv;
Sv.x=0;
Sv.y=0.1;
%%%%%%%%%%%%%% %%%%%%%%%%%%%%
E=zeros(1,3);%XYZ
E(3)=10;
% XXX=zeros(1,1000);
% YYY=zeros(1,1000);
% ZZZ=zeros(1,1000);
EE=zeros(num,3);
buf1=zeros(num,1);
buf2=zeros(num,1);
buf3=zeros(num,1);
buf4=zeros(num,1);
buf5=zeros(num,1);
buf6=zeros(num,1);
buf7=zeros(num,1);
buf8=zeros(num,1);
buf9=zeros(num,1);
buf10=zeros(num,1);
buf11=zeros(num,1);
buf12=zeros(num,1);
buf13=zeros(num,1);
buf14=zeros(num,1);
buf15=zeros(num,1);
buf16=zeros(num,1);
buf17=zeros(num,1);
buf18=zeros(num,1);
buf19=zeros(num,1);
buf20=zeros(num,1);
buf21=zeros(num,1);
buf22=zeros(num,1);
buf23=zeros(num,1);
buf24=zeros(num,1);
buf25=zeros(num,1);
buf26=zeros(num,1);
buf27=zeros(num,1);
buf28=zeros(num,1);
%%%%%%%%%%%%%% %%%%%%%%%%%%%%
%%%%%%%%%%%%%% %%%%%%%%%%%%%%
ins.x=0;%
ins.y=0;
ins.z=0;
ins.px=0;%
ins.py=0;
ins.pz=0;
ins.u_a=0;
ins.v_a=0;
ins.w_a=0;
ins.p_a=0;
ins.q_a=0;
ins.r_a=0;
ins.pu_a=0;
ins.pv_a=0;
ins.pw_a=0;
ins.pp_a=0;
ins.pq_a=0;
ins.pr_a=0;
ins.p=0;
ins.q=0;
ins.r=0;
ins.pp=0;
ins.pq=0;
ins.pr=0;
%%%%%%%%%%%%%% %%%%%%%%%%%%%%
depth=0;
pdepth=0;
%%%%%%%%%%%%%%GPS %%%%%%%%%%%%%%
gps.x=E(1);%
gps.y=E(2);%
gps.px=E(1);%
gps.py=E(2);%
%%%%%%%%%%%%%% %%%%%%%%%%%%%%
doppler.u=0;
doppler.v=0;
doppler.w=0;
doppler.pu=0;
doppler.pv=0;
doppler.pw=0;
doppler.fu=0;
doppler.fv=0;
doppler.fw=0;
% doppler.nfu=0;%
% doppler.nfv=0;
% doppler.nfw=0;
doppler.f=600;%kHz
EDV=zeros(1,3);
%%%%%%%%%%%%%%USBL%%%%%%%%%%%%%%
%
usbl=zeros(1,3);
usbl(1)=10;
usbl(2)=10;
usbl(3)=20;
%usb=zeros(1,3);
usb=usbl;
pan=0;
an=0;
% usb(1)=atan(usbl(3)/usbl(2));
% usb(2)=atan(usbl(1)/usbl(3));
% usb(3)=atan(usbl(2)/usbl(1));
%%%%%%%%%%%%%% %%%%%%%%%%%%%%
TT=zeros(1,5);
TTf=zeros(1,5);
%%%%%%%%%%%%%% u v w p q r heel trim head%%%%%%%%%%%%%%
vel=zeros(1,9);
velf=zeros(1,9);
EV=zeros(1,3);%E
EVf=zeros(1,3);
J=zeros(3,3);
k1=0;
k2=0;
k3=0;
k4=0;
ins.x=vel(7);%
ins.y=vel(8);
ins.z=vel(9);
E
T=0.05;
Tc=0.2;
%%%%%%%%%%%%%%PID I
INT.dd=0;
INT.dtrim=0;
INT.angel=0;
INT.x=0;
INT.y=0;
%%%%%%%%%%%%%% +
flag=1;
obj=pi;%
for ii=1:num
EV=EVf;
TT=TTf;
%%
% if ii==1000
% velf(8)=1;
% end
if mod(ii+1,Tc/T)==0
pan=an;
ins.px=ins.x;
ins.py=ins.y;
ins.pz=ins.z;
ins.pp=ins.p;
ins.pq=ins.q;
ins.pr=ins.r;
ins.pu_a=ins.u_a;
ins.pv_a=ins.v_a;
ins.pw_a=ins.w_a;
ins.pp_a=ins.p_a;
ins.pq_a=ins.q_a;
ins.pr_a=ins.r_a;
pdepth=depth;
gps.px=gps.x;
gps.py=gps.y;
doppler.pu=doppler.u;
doppler.pv=doppler.v;
doppler.pw=doppler.w;
ins.p=velf(4) ;%
ins.q=velf(5) ;%
ins.r=velf(6) ;%
ins.u_a=(velf(1)-vel(1))/Tc ;%
ins.v_a=(velf(2)-vel(2))/Tc ;%
ins.w_a=(velf(3)-vel(3))/Tc ;%
ins.p_a=(velf(4)-vel(4))/Tc ;%
ins.q_a=(velf(5)-vel(5))/Tc ;%
ins.r_a=(velf(6)-vel(6))/Tc ;%
ins.x=ins.x+(ins.p+sin(ins.x)*tan(ins.y)*ins.q+cos(ins.x)*tan(ins.y)*ins.r)*Tc;
ins.y=ins.y+(cos(ins.x)*ins.q-sin(ins.x)*ins.r)*Tc;
ins.z=ins.z+(sin(ins.x)/cos(ins.y)*ins.q+cos(ins.x)/cos(ins.y)*ins.r)*Tc;
% ins.x=velf(7);
% ins.y=velf(8);
% ins.z=velf(9);
depth=E(3) ;%
% gps.x=gps.x+;%x
% gps.y=gps.y+;%y
doppler.fu=(1+velf(1)/1500)*doppler.f ;%
doppler.fv=(1+velf(2)/1500)*doppler.f ;%
doppler.fw=(1+velf(3)/1500)*doppler.f ;%
doppler.u=(doppler.fu/doppler.f-1)*1500;
doppler.v=(doppler.fv/doppler.f-1)*1500;
doppler.w=(doppler.fw/doppler.f-1)*1500;
%
pusb=usb;
J=[cos(ins.z)*cos(ins.y), sin(ins.z)*cos(ins.y), -sin(ins.y);
cos(ins.z)*sin(ins.y)*sin(ins.x)-sin(ins.z)*cos(ins.x),sin(ins.z)*sin(ins.y)*sin(ins.x)+cos(ins.z)*cos(ins.x),cos(ins.y)*sin(ins.x);
cos(ins.z)*sin(ins.y)*cos(ins.x)+sin(ins.z)*sin(ins.x),sin(ins.z)*sin(ins.y)*cos(ins.x)-cos(ins.z)*sin(ins.x),cos(ins.y)*cos(ins.x)];
usb=(J*(usbl-E)')';%
EDV = double((J'*[doppler.u,doppler.v,doppler.w]')');
INT.dd=INT.dd+(usbl(3)-depth);
if flag==1
if (usb(1)<0)&&(usb(2)<=0)
an=atan(usb(2)/usb(1))-pi;
elseif (usb(1)<0)&&(usb(2)>=0)
an=atan(usb(2)/usb(1))+pi;
elseif (usb(1)==0)&&(usb(2)>=0)
an=pi/2;
elseif (usb(1)==0)&&(usb(2)<=0)
an=-pi/2;
else
an=atan(usb(2)/usb(1));
end
File=load('nn_pid');
flag_value=[File.flag_value;flag];
save('nn_pid.mat','flag_value','-append');
INT.dtrim=INT.dtrim+0.1-ins.y;
INT.angel=INT.angel+an;
INT_dtrim=[File.INT_dtrim;INT.dtrim];
save('nn_pid.mat','INT_dtrim','-append');
INT_angel=[File.INT_angel;INT.angel];
save('nn_pid.mat','INT_angel','-append');
TTf(1)=-X.u_u*0.8*0.8;
File=load('nn_pid');
fismat = readfis('fuzzy_piddirect');
out_direct = evalfis([an;pan],fismat);
d_an=[File.d_an;an];
d_pan=[File.d_pan;pan];
save('nn_pid.mat','d_an','-append');
save('nn_pid.mat','d_pan','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[an,pan];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
d_Kp=[File.d_Kp;Kp];
d_Ki=[File.d_Ki;Ki];
d_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','d_Kp','-append');
save('nn_pid.mat','d_Ki','-append');
save('nn_pid.mat','d_Kd','-append');
TTf(5)=Direct(pan,an,INT.angel,1,Kp,Ki,Kd);
fismat = readfis('fuzzy_pid3');
out_direct = evalfis([ins.y;ins.py],fismat);
t_ins_y=[File.t_ins_y;ins.y];
t_ins_py=[File.t_ins_py;ins.py];
save('nn_pid.mat','t_ins_y','-append');
save('nn_pid.mat','t_ins_py','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[ins.y,ins.py];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
t_Kp=[File.d_Kp;Kp];
t_Ki=[File.d_Ki;Ki];
t_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','t_Kp','-append');
save('nn_pid.mat','t_Ki','-append');
save('nn_pid.mat','t_Kd','-append');
TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1,Kp,Ki,Kd);
if usb(1)^2+usb(2)^2<sqrt(25)
if usbl(1)~=0
usbl(1)=0;
usbl(2)=20;
else flag=2;
% flag=2;
% INT.dtrim=0;
% INT.angel=0;
% pan=0;
end
end
elseif flag==2
if (usb(1)<0)&&(usb(2)<=0)
an=atan(usb(2)/usb(1))-pi;
elseif (usb(1)<0)&&(usb(2)>=0)
an=atan(usb(2)/usb(1))+pi;
elseif (usb(1)==0)&&(usb(2)>=0)
an=pi/2;
elseif (usb(1)==0)&&(usb(2)<=0)
an=-pi/2;
else
an=atan(usb(2)/usb(1));
end
flag_value=[File.flag_value;flag];
save('nn_pid.mat','flag_value','-append');
INT.dtrim=INT.dtrim+0.1-ins.y;
INT.angel=INT.angel+an;
INT_dtrim=[File.INT_dtrim;INT.dtrim];
save('nn_pid.mat','INT_dtrim','-append');
INT_angel=[File.INT_angel;INT.angel];
save('nn_pid.mat','INT_angel','-append');
TTf(1)=-X.u_u*0.8*0.8;
File=load('nn_pid');
fismat = readfis('fuzzy_piddirect');
out_direct = evalfis([an;pan],fismat);
d_an=[File.d_an;an];
d_pan=[File.d_pan;pan];
save('nn_pid.mat','d_an','-append');
save('nn_pid.mat','d_pan','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[an,pan];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features);
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
d_Kp=[File.d_Kp;Kp];
d_Ki=[File.d_Ki;Ki];
d_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','d_Kp','-append');
save('nn_pid.mat','d_Ki','-append');
save('nn_pid.mat','d_Kd','-append');
TTf(5)=Direct(pan,an,INT.angel,1,Kp,Ki,Kd);
fismat = readfis('fuzzy_pid3');
out_direct = evalfis([ins.y;ins.py],fismat);
t_ins_y=[File.t_ins_y;ins.y];
t_ins_py=[File.t_ins_py;ins.py];
save('nn_pid.mat','t_ins_y','-append');
save('nn_pid.mat','t_ins_py','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[ins.y,ins.py];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
t_Kp=[File.d_Kp;Kp];
t_Ki=[File.d_Ki;Ki];
t_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','t_Kp','-append');
save('nn_pid.mat','t_Ki','-append');
save('nn_pid.mat','t_Kd','-append');
TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1,Kp,Ki,Kd);
if usb(1)^2+usb(2)^2<sqrt(25)
if usbl(1)~=10
usbl(1)=10;
usbl(2)=30;
else flag=3;
end
end
elseif flag==3
if (usb(1)<0)&&(usb(2)<=0)
an=atan(usb(2)/usb(1))-pi;
elseif (usb(1)<0)&&(usb(2)>=0)
an=atan(usb(2)/usb(1))+pi;
elseif (usb(1)==0)&&(usb(2)>=0)
an=pi/2;
elseif (usb(1)==0)&&(usb(2)<=0)
an=-pi/2;
else
an=atan(usb(2)/usb(1));
end
flag_value=[File.flag_value;flag];
save('nn_pid.mat','flag_value','-append');
INT.dtrim=INT.dtrim+0.1-ins.y;
INT.angel=INT.angel+an;
INT_dtrim=[File.INT_dtrim;INT.dtrim];
save('nn_pid.mat','INT_dtrim','-append');
INT_angel=[File.INT_angel;INT.angel];
save('nn_pid.mat','INT_angel','-append');
TTf(1)=-X.u_u*0.8*0.8;
File=load('nn_pid');
fismat = readfis('fuzzy_piddirect');
out_direct = evalfis([an;pan],fismat);
d_an=[File.d_an;an];
d_pan=[File.d_pan;pan];
save('nn_pid.mat','d_an','-append');
save('nn_pid.mat','d_pan','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[an,pan]
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
d_Kp=[File.d_Kp;Kp];
d_Ki=[File.d_Ki;Ki];
d_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','d_Kp','-append');
save('nn_pid.mat','d_Ki','-append');
save('nn_pid.mat','d_Kd','-append');
TTf(5)=Direct(pan,an,INT.angel,1,Kp,Ki,Kd);
fismat = readfis('fuzzy_pid3');
out_direct = evalfis([ins.y;ins.py],fismat);
t_ins_y=[File.t_ins_y;ins.y];
t_ins_py=[File.t_ins_py;ins.py];
save('nn_pid.mat','t_ins_y','-append');
save('nn_pid.mat','t_ins_py','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[ins.y,ins.py];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
t_Kp=[File.d_Kp;Kp];
t_Ki=[File.d_Ki;Ki];
t_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','t_Kp','-append');
save('nn_pid.mat','t_Ki','-append');
save('nn_pid.mat','t_Kd','-append');
TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1,Kp,Ki,Kd);
if usb(1)^2+usb(2)^2<sqrt(25)
if usbl(1)~=20
usbl(1)=20;
usbl(2)=30;
else flag=4;
end
end
elseif flag==4
if (usb(1)<0)&&(usb(2)<=0)
an=atan(usb(2)/usb(1))-pi;
elseif (usb(1)<0)&&(usb(2)>=0)
an=atan(usb(2)/usb(1))+pi;
elseif (usb(1)==0)&&(usb(2)>=0)
an=pi/2;
elseif (usb(1)==0)&&(usb(2)<=0)
an=-pi/2;
else
an=atan(usb(2)/usb(1));
end
flag_value=[File.flag_value;flag];
save('nn_pid.mat','flag_value','-append');
INT.dtrim=INT.dtrim+0.1-ins.y;
INT.angel=INT.angel+an;
INT_dtrim=[File.INT_dtrim;INT.dtrim];
save('nn_pid.mat','INT_dtrim','-append');
INT_angel=[File.INT_angel;INT.angel];
save('nn_pid.mat','INT_angel','-append');
TTf(1)=-X.u_u*0.8*0.8;
File=load('nn_pid');
fismat = readfis('fuzzy_piddirect');
out_direct = evalfis([an;pan],fismat);
d_an=[File.d_an;an];
d_pan=[File.d_pan;pan];
save('nn_pid.mat','d_an','-append');
save('nn_pid.mat','d_pan','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[an,pan];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
d_Kp=[File.d_Kp;Kp];
d_Ki=[File.d_Ki;Ki];
d_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','d_Kp','-append');
save('nn_pid.mat','d_Ki','-append');
save('nn_pid.mat','d_Kd','-append');
TTf(5)=Direct(pan,an,INT.angel,1,Kp,Ki,Kd);
fismat = readfis('fuzzy_pid3');
out_direct = evalfis([ins.y;ins.py],fismat);
t_ins_y=[File.t_ins_y;ins.y];
t_ins_py=[File.t_ins_py;ins.py];
save('nn_pid.mat','t_ins_y','-append');
save('nn_pid.mat','t_ins_py','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[ins.y,ins.py];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
t_Kp=[File.d_Kp;Kp];
t_Ki=[File.d_Ki;Ki];
t_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','t_Kp','-append');
save('nn_pid.mat','t_Ki','-append');
save('nn_pid.mat','t_Kd','-append');
TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1,Kp,Ki,Kd);
if usb(1)^2+usb(2)^2<sqrt(25)
if usbl(1)~=30
usbl(1)=30;
usbl(2)=20;
else flag=5;
end
end
elseif flag==5
if (usb(1)<0)&&(usb(2)<=0)
an=atan(usb(2)/usb(1))-pi;
elseif (usb(1)<0)&&(usb(2)>=0)
an=atan(usb(2)/usb(1))+pi;
elseif (usb(1)==0)&&(usb(2)>=0)
an=pi/2;
elseif (usb(1)==0)&&(usb(2)<=0)
an=-pi/2;
else
an=atan(usb(2)/usb(1));
end
flag_value=[File.flag_value;flag];
save('nn_pid.mat','flag_value','-append');
INT.dtrim=INT.dtrim+0.1-ins.y;
INT.angel=INT.angel+an;
INT_dtrim=[File.INT_dtrim;INT.dtrim];
save('nn_pid.mat','INT_dtrim','-append');
INT_angel=[File.INT_angel;INT.angel];
save('nn_pid.mat','INT_angel','-append');
TTf(1)=-X.u_u*0.8*0.8;
File=load('nn_pid');
fismat = readfis('fuzzy_piddirect');
out_direct = evalfis([an;pan],fismat);
d_an=[File.d_an;an];
d_pan=[File.d_pan;pan];
save('nn_pid.mat','d_an','-append');
save('nn_pid.mat','d_pan','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[an,pan]
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
d_Kp=[File.d_Kp;Kp];
d_Ki=[File.d_Ki;Ki];
d_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','d_Kp','-append');
save('nn_pid.mat','d_Ki','-append');
save('nn_pid.mat','d_Kd','-append');
TTf(5)=Direct(pan,an,INT.angel,1,Kp,Ki,Kd);
fismat = readfis('fuzzy_pid3');
out_direct = evalfis([ins.y;ins.py],fismat);
t_ins_y=[File.t_ins_y;ins.y];
t_ins_py=[File.t_ins_py;ins.py];
save('nn_pid.mat','t_ins_y','-append');
save('nn_pid.mat','t_ins_py','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[ins.y,ins.py];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
t_Kp=[File.d_Kp;Kp];
t_Ki=[File.d_Ki;Ki];
t_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','t_Kp','-append');
save('nn_pid.mat','t_Ki','-append');
save('nn_pid.mat','t_Kd','-append');
TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1,Kp,Ki,Kd);
if usb(1)^2+usb(2)^2<sqrt(25)
if usbl(1)~=20
usbl(1)=20;
usbl(2)=10;
else flag=6;
end
end
elseif flag==6
if (usb(1)<0)&&(usb(2)<=0)
an=atan(usb(2)/usb(1))-pi;
elseif (usb(1)<0)&&(usb(2)>=0)
an=atan(usb(2)/usb(1))+pi;
elseif (usb(1)==0)&&(usb(2)>=0)
an=pi/2;
elseif (usb(1)==0)&&(usb(2)<=0)
an=-pi/2;
else
an=atan(usb(2)/usb(1));
end
flag_value=[File.flag_value;flag];
save('nn_pid.mat','flag_value','-append');
INT.dtrim=INT.dtrim+0.1-ins.y;
INT.angel=INT.angel+an;
INT_dtrim=[File.INT_dtrim;INT.dtrim];
save('nn_pid.mat','INT_dtrim','-append');
INT_angel=[File.INT_angel;INT.angel];
save('nn_pid.mat','INT_angel','-append');
TTf(1)=-X.u_u*0.8*0.8;
File=load('nn_pid');
fismat = readfis('fuzzy_piddirect');
out_direct = evalfis([an;pan],fismat);
d_an=[File.d_an;an];
d_pan=[File.d_pan;pan];
save('nn_pid.mat','d_an','-append');
save('nn_pid.mat','d_pan','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[an,pan]
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
d_Kp=[File.d_Kp;Kp];
d_Ki=[File.d_Ki;Ki];
d_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','d_Kp','-append');
save('nn_pid.mat','d_Ki','-append');
save('nn_pid.mat','d_Kd','-append');
TTf(5)=Direct(pan,an,INT.angel,1,Kp,Ki,Kd);
fismat = readfis('fuzzy_pid3');
out_direct = evalfis([ins.y;ins.py],fismat);
t_ins_y=[File.t_ins_y;ins.y];
t_ins_py=[File.t_ins_py;ins.py];
save('nn_pid.mat','t_ins_y','-append');
save('nn_pid.mat','t_ins_py','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[ins.y,ins.py];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
t_Kp=[File.d_Kp;Kp];
t_Ki=[File.d_Ki;Ki];
t_Kd=[File.d_Kd;Kd];
save('nn_pid.mat','t_Kp','-append');
save('nn_pid.mat','t_Ki','-append');
save('nn_pid.mat','t_Kd','-append');
TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1,Kp,Ki,Kd);
if usb(1)^2+usb(2)^2<sqrt(25)
if usbl(1)~=7
usbl(1)=7;
usbl(2)=10;
else break
end
end
% elseif flag==4
% if (usb(1)<=0)&&(usb(2)<=0)
%
% an=atan(usb(2)/usb(1))-pi;
% elseif (usb(1)<=0)&&(usb(2)>=0)
% an=atan(usb(2)/usb(1))+pi;
% else an=atan(usb(2)/usb(1));
% end
% INT.dtrim=INT.dtrim+0.1-ins.y;
% INT.angel=INT.angel+an;
% TTf(1)=-X.u_u*0.8*0.8;
% TTf(5)=Direct(pan,an,INT.angel,1);
% TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1);
% if usb(1)^2+usb(2)^2<sqrt(25)
% if usbl~=10
% usbl(1)=10;
% usbl(2)=10;
% else break
% end
% end
% elseif flag==5
% if (usb(1)<=0)&&(usb(2)<=0)
%
% an=atan(usb(2)/usb(1))-pi;
% elseif (usb(1)<=0)&&(usb(2)>=0)
% an=atan(usb(2)/usb(1))+pi;
% else an=atan(usb(2)/usb(1));
% end
% INT.dtrim=INT.dtrim+0.1-ins.y;
% INT.angel=INT.angel+an;
% TTf(1)=-X.u_u*0.8*0.8;
% TTf(5)=Direct(pan,an,INT.angel,1);
% TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1);
% if usb(1)^2+usb(2)^2<sqrt(25)
% if usbl~=20
% usbl(1)=20;
% usbl(2)=10;
% else flag=5;
% end
% end
% elseif flag==6
% if (usb(1)<=0)&&(usb(2)<=0)
%
% an=atan(usb(2)/usb(1))-pi;
% elseif (usb(1)<=0)&&(usb(2)>=0)
% an=atan(usb(2)/usb(1))+pi;
% else an=atan(usb(2)/usb(1));
% end
% INT.dtrim=INT.dtrim+0.1-ins.y;
% INT.angel=INT.angel+an;
% TTf(1)=-X.u_u*0.8*0.8;
% TTf(5)=Direct(pan,an,INT.angel,1);
% TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0.1,1);
% if usb(1)^2+usb(2)^2<sqrt(25)
% if usbl~=10
% usbl(1)=10;
% usbl(2)=10;
% else break
% end
% end
% elseif flag==2
% INT.x=INT.x+usb(1);
% INT.y=INT.y+usb(2);
% an=pi/2-ins.z;
% INT.dtrim=INT.dtrim-ins.y;
% INT.angel=INT.angel+an;
% TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0,0);
% [TTf(1),TTf(2)]=Control(pusb,usb,0,INT.x,INT.y);
% if usb(1)^2+usb(2)^2<1
% flag=0;
% end
% TTf(5)=Direct(pan,an,INT.angel,0);
% else
% INT.x=INT.x+usb(1);
% INT.y=INT.y+usb(2);
% an=pi/2-ins.z;
% INT.dtrim=INT.dtrim-ins.y;
% INT.angel=INT.angel+an;
% TTf(4)=TRIM(ins.py,ins.y,INT.dtrim,0,0);
% [TTf(1),TTf(2)]=Control(pusb,usb,1,INT.x,INT.y);
%
% TTf(5)=Direct(pan,an,INT.angel,0);
end
File=load('nn_pid');
fismat = readfis('fuzzy_piddepth');
out_direct = evalfis([depth;pdepth],fismat);
d_depth=[File.d_depth;ins.y];
d_pdepth=[File.d_pdepth;ins.py];
save('nn_pid.mat','d_depth','-append');
save('nn_pid.mat','d_pdepth','-append');
Kp = out_direct(1); Ki= out_direct(2);Kd= out_direct(3);
Features=[depth,pdepth];
[Kp_range,Ki_range ,Kd_range]=neural_network_classification(Features) ;
Kp=mean([Kp_range,Kp]);
Ki=mean([Ki_range,Ki]);
Kd=mean([Kd_range,Kd]);
de_Kp=[File.de_Kp;Kp];
de_Ki=[File.de_Ki;Ki];
de_Kd=[File.de_Kd;Kd];
save('nn_pid.mat','de_Kp','-append');
save('nn_pid.mat','de_Ki','-append');
save('nn_pid.mat','de_Kd','-append');
TTf(3)=Deep(pdepth,depth,INT.dd,usbl(3),Kp,Ki,Kd);
% if isnan(TTf(4))
% break;
% end
TTF=[File.TTF;TTf];
save('nn_pid.mat','TTF','-append');
end
%TTf = Control(E, usbl, EV, vel, usb, T ,ii);
%
vel=velf;
% k1 = vel+AUV(vel,TT)*T;
% k2 = AUV(k1,TTf);
% velf = vel+T*k2;
k1 = AUV(vel,TTf);
k2 = AUV(vel+0.5.*T.*k1,(TT+TTf)./2);
k3 = AUV(vel+0.5.*T.*k2,(TT+TTf)./2);
k4 = AUV(vel+T.*k3,TTf);
velf = vel+T/6*(k1+2*k2+2*k3+k4);
%J=J'%J^-1==J'
J=[cos(velf(9))*cos(velf(8)),-sin(velf(9))*cos(velf(7))+cos(velf(9))*sin(velf(8))*sin(velf(7)),sin(velf(9))*sin(velf(7))+cos(velf(9))*sin(velf(8))*cos(velf(7));
sin(velf(9))*cos(velf(8)),cos(velf(9))*cos(velf(7))+sin(velf(9))*sin(velf(8))*sin(velf(7)), -cos(velf(9))*sin(velf(7))+sin(velf(9))*sin(velf(8))*cos(velf(7));
-sin(velf(8)), cos(velf(8))*sin(velf(7)), cos(velf(8))*cos(velf(7)) ];
EVf = double((J*[velf(1),velf(2),velf(3)]')') ;
E = E+EVf*T;
% if E(3)<0
% E(3)=0;
% end
% if abs(E(1))>1000
% break;
% end
% if abs(E(2))>1000
% break;
% end
% if abs(E(3))>1000
% break;
% end
% if E(3)<0
% E(3)=0;
% velf(3)=0;
% break;
% end
EE(ii,:)=E;
buf1(ii,1)=velf(1);
buf2(ii,1)=velf(2);
buf3(ii,1)=velf(3);
buf4(ii,1)=velf(4);
buf5(ii,1)=velf(5);
buf6(ii,1)=velf(6);
buf7(ii,1)=velf(7);
buf8(ii,1)=velf(8);
buf9(ii,1)=velf(9);
buf10(ii,1)=TTf(1);
buf11(ii,1)=TTf(2);
buf12(ii,1)=TTf(3);
buf13(ii,1)=TTf(4);
buf14(ii,1)=TTf(5);
buf15(ii,1)=ins.p;
buf16(ii,1)=ins.q;
buf17(ii,1)=ins.r;
buf18(ii,1)=ins.u_a;
buf19(ii,1)=ins.v_a;
buf20(ii,1)=ins.w_a;
buf21(ii,1)=ins.x;
buf22(ii,1)=ins.y;
buf23(ii,1)=ins.z;
buf24(ii,1)=depth;
buf25(ii,1)=doppler.u;
buf26(ii,1)=doppler.v;
buf27(ii,1)=doppler.w;
if flag==0
buf28(ii,1)=sqrt(usb(1)^2+usb(2)^2);
else
buf28(ii,1)=0;
end
end
%k1(5)
%velf(5)
E
iii=1:ii-1;
figure(1);
subplot(311);
plot(iii,buf1(iii),'-');
title('u');
subplot(312);
plot(iii,buf2(iii),'-');
title('v');
subplot(313);
plot(iii,buf3(iii),'-');
title('w');
figure(2);
subplot(311);
plot(iii,buf4(iii),'-');
title('p');
subplot(312);
plot(iii,buf5(iii),'-');
title('q');
subplot(313);
plot(iii,buf6(iii),'-');
title('r');
figure(3);
subplot(311);
plot(iii,buf7(iii),'-');
title('heel');
subplot(312);
plot(iii,buf8(iii),'-');
title('trim');
subplot(313);
plot(iii,buf9(iii),'-');
title('head');
figure(4);
subplot(3,1,1);
plot(iii,buf10(iii),'-');
title('Tx');
subplot(3,2,3);
plot(iii,buf11(iii),'-');
title('Ty');
subplot(3,2,4);
plot(iii,buf12(iii),'-');
title('Tz');
subplot(3,2,6);
plot(iii,buf13(iii),'-');
title('My');
subplot(3,2,5);
plot(iii,buf14(iii),'-');
title('Mz');
A=[0 10 0 10 20 30 20 7];
B=[0 10 20 30 30 20 10 10];
C=[10 20 20 20 20 20 20 20];
figure(6);
subplot(311);
plot(iii,buf15(iii),'-');
title(' Roll angular velocity');
subplot(312);
plot(iii,buf16(iii),'-');
title(' Pitch angular velocity');
subplot(313);
plot(iii,buf17(iii),'-');
title(' Heading speed');
figure(7);
subplot(311);
plot(iii,buf18(iii),'-');
title('x Axis acceleration');
subplot(312);
plot(iii,buf19(iii),'-');
title('y Axis acceleration');
subplot(313);
plot(iii,buf20(iii),'-');
title('z Axis acceleration');
figure(8);
subplot(311);
plot(iii,buf18(iii),'-');
title('x Axis acceleration');
subplot(312);
plot(iii,buf19(iii),'-');
title('y Axis acceleration');
subplot(313);
plot(iii,buf20(iii),'-');
title('z Axis acceleration');
figure(9);
subplot(311);
plot(iii,buf21(iii),'-');
title(' Roll angle');
subplot(312);
plot(iii,buf22(iii),'-');
title(' Trim angle');
subplot(313);
plot(iii,buf23(iii),'-');
title(' Route angle');
figure(10);
plot(iii,buf24(iii),'-');
title(' Depth gauge');
figure(11);
subplot(311);
plot(iii,buf25(iii),'-');
title('x Shaft speed');
subplot(312);
plot(iii,buf26(iii),'-');
title('y Shaft speed');
subplot(313);
plot(iii,buf27(iii),'-');
title('z Shaft speed');
% figure(12);
% title(' Power positioning error');
% plot(iii,buf28(iii),'-');
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
[1]李文,赵强.基于神经网络的多变量模糊自整定PID控制器[J].大连铁道学院学报, 1998, 019(001):55-62.
[2]郝丽娜,张国钧.基于BP神经网络的参数自整定PID控制器仿真研究[J].电脑开发与应用, 2008.DOI:JournalArticle/5aeb70f1c095d70944094697.
[3]郝丽娜,张国钧.基于BP神经网络的参数自整定PID控制器仿真研究[J].电脑开发与应用, 2008, 21(3):3.DOI:CNKI:SUN:DNKF.0.2008-03-004.