【水下机器人建模】基于QLearning自适应强化学习PID控制器在AUV中的应用研究附Matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、程序设计科研仿真。
🍎完整代码获取 定制创新 论文复现点击:Matlab科研工作室
👇 关注我领取海量matlab电子书和数学建模资料
🍊个人信条:做科研,博学之、审问之、慎思之、明辨之、笃行之,是为:博学慎思,明辨笃行。
🔥 内容介绍
一、引言
自主水下航行器(AUV)在海洋探测、资源开发、环境监测等领域发挥着关键作用。精确的运动控制对于 AUV 完成复杂任务至关重要,传统的比例 - 积分 - 微分(PID)控制器虽广泛应用,但在面对水下复杂多变的环境时,其固定参数难以实现最优控制。Q - Learning 作为一种强大的强化学习算法,能够使控制器通过与环境的交互学习,自适应地调整控制参数。本文旨在研究基于 Q - Learning 的自适应强化学习 PID 控制器在 AUV 中的应用,以提升 AUV 的运动控制性能。
二、AUV 运动模型
(一)AUV 动力学方程
AUV 的运动可以用六自由度动力学方程描述,涵盖了沿三个坐标轴的平移运动和绕三个坐标轴的旋转运动。以纵向运动为例,其动力学方程可表示为:
(二)环境干扰因素
水下环境复杂,AUV 会受到诸多干扰。水流的速度和方向变化会对 AUV 的运动产生直接影响,例如,逆流时 AUV 需要更大的动力来保持预定航线;海浪引起的波动会使 AUV 产生上下起伏和左右摇晃,增加了控制的难度;此外,海水密度的不均匀性也会导致 AUV 受到的浮力发生变化,影响其垂直方向的运动稳定性。
三、传统 PID 控制器
(一)PID 控制原理
PID 控制器根据设定值与实际输出值之间的误差,通过比例(P)、积分(I)、微分(D)三个环节的线性组合来调整控制量。其控制律为:
⛳️ 运行结果
📣 部分代码
function [z, historz] = lasso_PCSALM(A, b,eig_AA,paras)
%%% Xiaokai. Chang · Sanyang. Liu · Zhao Deng,
%%% A prediction-correction scheme based on the augmented Lagrangian method
%%% with indefinite proximal regularization for separable convex programming
tau = paras.tau;
step = paras.step;
rho = paras.rho;
lambda = paras.lambda;
r = 1.001*rho*eig_AA;
r=r*tau;
t_start = tic;
%% Global constants and defaults
QUIET = 0;
MAX_ITER = 1000;
% MAX_ITER = 50;
ABSTOL = paras.abstol;
RELTOL = paras.reltol;
%% Data preprocessing
[m, n] = size(A);
% save a matrix-vector multiplz
Atb = A'*b;
%% ADMM solver
x = zeros(m,1);
z = zeros(n,1);
u = zeros(m,1);
for k = 1:MAX_ITER
%% x-update
x=1/(1+rho)*(b+u+rho*A*z);
%% u-update
u = u - rho*(x - A*z);% SADMM涓涓?釜multiplier鐨刾arameter绛変簬alpha
%% z-update
q=-A' * (u-rho*(x-A*z));
z_p = shrinkage(z + q/r, lambda / r);
%% u-update
u_p = u + rho*A*(z_p - z);
%%%%%%%%%%%%%%%%%%%%%%% Correction step %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
uu_p = u -u_p;
zz_p = z -z_p;
num1 = norm(uu_p,'fro')^2/rho + r * norm(zz_p,'fro')^2 - dot(A*(zz_p),uu_p);
Q_X_XN = [r*zz_p; uu_p/rho];
alpha_k = step * num1/norm(Q_X_XN,'fro')^2;
z = z - alpha_k * r * zz_p;
u = u - alpha_k * uu_p/rho;
% z = z_p;
% u = u_p;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% diagnostics, reporting, termination checks
historz.objval(k) = objective(A, b, lambda, x, z_p);
historz.r_norm(k) = norm(x - A*z_p);
historz.s_norm(k) = norm(-rho*A*(z_p - z));
historz.eps_pri(k) = sqrt(n)*ABSTOL + RELTOL*max(norm(x), norm(-A*z_p));
historz.eps_dual(k)= sqrt(n)*ABSTOL + RELTOL*norm(u_p);
if (historz.r_norm(k) < historz.eps_pri(k) && ...
historz.s_norm(k) < historz.eps_dual(k))
historz.iteration=k;
historz.time=toc(t_start);
break;
end
end
% if ~QUIET
% toc(t_start);
% end
end
function p = objective(A, b, lambda, x, z)
% p = ( 1/2*sum((A*x - b).^2) + lambda*norm(z,1) );
p = ( 1/2*sum((x - b).^2) + lambda*norm(z,1) );
end
function z = shrinkage(x, kappa)
z = max( 0, x - kappa ) - max( 0, -x - kappa );
end
function [L U] = factor(A, rho)
[m, n] = size(A);
if ( m >= n ) % if skinnz
L = chol( A'*A + rho*speze(n), 'lower' );
else % if fat
L = chol( speze(m) + 1/rho*(A*A'), 'lower' );
end
% force matlab to recognize the upper / lower triangular structure
L = sparse(L);
U = sparse(L');
end
🔗 参考文献
[1]李文飚.基于强化学习的水下机器人追踪控制策略的研究[D].燕山大学,2022.
