AUV路径跟踪滑模控制

2024-02-13 10:50
文章标签 路径 控制 跟踪 滑模 auv

本文主要是介绍AUV路径跟踪滑模控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、参考文献

Modelling and Motion Control of an Underactuated Autonomous Underwater Vehicle

Principles of Guidance-Based Path Following in 2D and 3D 

二、仿真效果

 

 

 

 

三、源代码

(1)AUV模型

%position=[x,y,z,Fai,Theta,Psi]';
%velocity=[u,v,w,p,q,r]';
%thruster=[port,starvoard,bow,stern]';
%force=[X,Y,Z,K,M,N]';
function acceleration=AUV_model(position,velocity,thruster)
global M;
global C;
global D;
global B;
global J;
% x=position(1);
% y=position(2);
% z=position(3);
Fai=position(4);
Theta=position(5);
Psi=position(6);J_1=[cos(Psi)*cos(Theta),-sin(Psi)*cos(Fai)+cos(Psi)*sin(Theta)*sin(Fai),sin(Psi)*cos(Fai)+cos(Psi)*sin(Theta)*cos(Fai);sin(Psi)*cos(Theta),cos(Psi)*cos(Fai)+sin(Psi)*sin(Theta)*sin(Fai),sin(Psi)*sin(Theta)*cos(Fai)-cos(Psi)*cos(Fai);-sin(Theta),cos(Theta)*sin(Fai),cos(Theta)*cos(Fai)];J_2=[1,tan(Theta)*sin(Fai),tan(Theta)*cos(Fai);0,cos(Fai),-sin(Fai);0,cos(Fai)/cos(Theta),cos(Fai)/cos(Theta)];zero_3=zeros(3,3);J=[J_1,zero_3;zero_3,J_2];u=velocity(1);
v=velocity(2);
w=velocity(3);
p=velocity(4);
q=velocity(5);
r=velocity(6);m=60;
I_xx=5.4;
I_yy=15.5;
I_zz=15.5;X_dot_u=-6.9;
Y_dot_v=-120.2;
Z_dot_w=-120.2;
K_dot_p=0;
M_dot_q=-89.53;
N_dot_r=-89.6;
Y_dot_r=89.83;
Z_dot_q=-89.83;
M_dot_w=-89.83;
N_dot_v=89.83;%mass matrix
M_RB=diag([m,m,m,I_xx,I_yy,I_zz]);
M_A=-[X_dot_u,0,0,0,0,0;0,Y_dot_v,0,0,0,Y_dot_r;0,0,Z_dot_w,0,Z_dot_q,0;0,0,0,K_dot_p,0,0;0,0,M_dot_w,0,M_dot_q,0;0,N_dot_v,0,0,0,N_dot_r];
M=M_RB+M_A;
%Coriolis-centripetal matrixC_RB=[0,0,0,0,m*w,-m*v;0,0,0,-m*w,0,m*u;0,0,0,m*v,-m*u,0;0,m*w,-m*v,0,I_zz*r,-I_yy*q;-m*w,0,m*u,-I_zz*r,0,I_xx*p;m*v,-m*u,0,I_yy*q,-I_xx*p,0];
a_b=M_A*velocity;
C_A=[0,0,0,0,-a_b(3),a_b(2);0,0,0,a_b(3),0,-a_b(1);0,0,0,-a_b(2),a_b(1),0;0,-a_b(3),a_b(2),0,-a_b(6),a_b(5);a_b(3),0,-a_b(1),a_b(6),0,-a_b(1);-a_b(2),a_b(1),0,-a_b(5),a_b(4),0];
C=C_RB+C_A;%drag matrix
X_uu=8.038;
Y_vv=252;
Z_ww=252;
K_pp=0;
M_qq=246.1;
N_rr=246.1;D=diag([X_uu,Y_vv,Z_ww,K_pp,M_qq,N_rr]);l_1=0.21;
l_2=0.21;
l_3=0.8;
l_4=0.8;
B=[1,1,0,0;0,0,0,0;0,0,1,1;0,0,0,0;0,0,l_3,-l_4;l_1,-l_2,0,0];tao=B*thruster;acceleration=M\(tao-C*velocity-D*velocity);
end

(2)引导算法

%curve_value=[0];
%ship_position=[x,y,z,Fai,Theta,Psi]';
%ship_velocity=[u,v,w,p,q,r]';
function [curve_update,expect_azimuth_angle,expect_elevation_angle]=spital_los(curve_parameter,curve_value,position,velocity)
%parameter curve--spiral line
a=curve_parameter(1);
b=curve_parameter(2);
h=curve_parameter(3);
%los parameter
delta_e=0.5;
delta_h=0.5;
gamma=0.9;
%algorithm
curve_position=[b*sin(curve_value),a*cos(curve_value),h*curve_value/(2*pi)]';
d_curve_position=[b*cos(curve_value),-a*sin(curve_value),h/(2*pi)]';
curve_azimuth_angle=atan2(d_curve_position(2),d_curve_position(1));
curve_elevation_angle=atan2((-d_curve_position(3)),(d_curve_position(1)^2+d_curve_position(2)^2)^0.5);rotation_azimuth_matrix=[cos(curve_azimuth_angle),-sin(curve_azimuth_angle),0;sin(curve_azimuth_angle),cos(curve_azimuth_angle),0;0,0,1];
rotation_elevation_matrix=[cos(curve_elevation_angle),0,sin(curve_elevation_angle);0,1,0;-sin(curve_elevation_angle),0,cos(curve_elevation_angle)];
rotation_matrix=rotation_azimuth_matrix*rotation_elevation_matrix;error=rotation_matrix'*(position(1:3)-curve_position(1:3));
%output
curve_update=(norm(velocity(1:3))*cos(position(5)-curve_azimuth_angle)*cos(position(6)-curve_elevation_angle)+gamma*error(1))/...norm(d_curve_position);
expect_azimuth_angle=curve_azimuth_angle+atan2(-error(2),delta_e);
expect_elevation_angle=curve_elevation_angle+atan2(error(3),delta_h);if expect_azimuth_angle>piexpect_azimuth_angle=expect_azimuth_angle-2*pi;
end
if expect_azimuth_angle<-piexpect_azimuth_angle=2*pi+expect_azimuth_angle;
end
if expect_elevation_angle>piexpect_elevation_angle=expect_elevation_angle-2*pi;
end
if expect_elevation_angle<-piexpect_elevation_angle=2*pi+expect_elevation_angle;
endend

(3)滑模控制

%position=[x,y,z,Fai,Theta,Psi]';
%velocity=[u,v,w,p,q,r]';
function thruster=AUV_slide_model(position,velocity,position_d,velocity_d,d_position_d,d_velocity_d)global M;
global C;
global D;
global B;
global J;% x=position(1);
% y=position(2);
% z=position(3);
% Fai=position(4);
Theta=position(5);
Psi=position(6);u=velocity(1);
% v=condition(2);
w=velocity(3);
% p=condition(4);
q=velocity(5);
r=velocity(6);% x_d=position_d(1);
% y_d=position_d(2);
% z_d=position_d(3);
% Fai_d=position_d(4);
Theta_d=position_d(5);
Psi_d=position_d(6);if (abs(Theta_d)>pi/2 && Theta_d*Theta<0)if Theta_d<ThetaTheta_d=Theta_d+2*pi;elseTheta_d=Theta_d-2*pi;end
end
if (abs(Psi_d)>pi/2 && Psi_d*Psi<0)if Psi_d<PsiPsi_d=Psi_d+2*pi;elsePsi_d=Psi_d-2*pi;end
endu_d=velocity_d(1);
% v_d=condition_d(2);
w_d=velocity_d(3);
% p_d=condition_d(4);
q_d=velocity_d(5);
r_d=velocity_d(6);X=[u,w,q,r,Theta,Psi]';
X_d=[u_d,w_d,q_d,r_d,Theta_d,Psi_d]';
d_X_d=[d_velocity_d(1),d_velocity_d(3),d_velocity_d(5),d_velocity_d(6),d_position_d(5),d_position_d(6)]';F_X_1=-M\(C*velocity+D*velocity);
F_X_2=J*velocity;
F_X_1(4)=[];
F_X_1(2)=[];
F_X_2(1:4)=[];
F_X=[F_X_1;F_X_2];B_1=M\B;
B_1(4,:)=[];
B_1(2,:)=[];
B_=[B_1;zeros(2,4)];Lambda_Theta=0.2;
Lambda_Fai=0.2;
Lambda=[1,0,0,0,0,0;0,1,0,0,0,0;0,0,1,0,Lambda_Theta,0;0,0,0,1,0,Lambda_Fai];K=diag([1.8,1.2,0.8,0.8]);S=Lambda*(X-X_d);U_eq=(Lambda*B_)\(Lambda*d_X_d-Lambda*F_X);
U_s=-(Lambda*B_)\(K*sat(S));
U=U_eq+U_s;
thruster=U;end%% sat/sgn/tanh
function value=sat(s)delta=0.2;value=zeros(length(s),1);for i=1:length(s)if s(i)>deltavalue(i)=1;elseif s(i)<-deltavalue(i)=-1;elsevalue(i)=s(i)/delta;endend
end

(4) 主函数

clear;clc;close all;
%const parameter
delta_t=0.1;
global J;
%parameter curve--spiral line
a=10;
b=10;
h=-4;
curve_parameter=[a,b,h];
t=0:0.1:10*pi;%north-east coordinate
% x=r*cos(t);
% y=r*sin(t);
y=a*cos(t);
x=b*sin(t);
z=h*t/(2*pi);curve_value=0;
%parameter ship
position=[0,5,0,0,0,0]';%[x,y,z,Fai,Theta,Psi]
velocity=[0,0,0,0,0,0]';%[u,v,w,p,q,r]
thruster=[0,0,0,0]';
acceleration=AUV_model(position,velocity,thruster);%befroe
curve_value_before=curve_value;
expect_elevation_angle_before=position(5);
expect_azimuth_angle_before=position(6);
expect_elevation_angle_before_b=expect_elevation_angle_before;
expect_azimuth_angle_before_b=expect_azimuth_angle_before;%storage
position_storage=[];
position_d_storage=[];
%circle
iteration=0;
while iteration~=1200position_storage=[position_storage,position];[curve_update,expect_azimuth_angle,expect_elevation_angle]=spital_los(curve_parameter,curve_value,position,velocity);curve_value=curve_value+curve_update*delta_t;position_d=[b*sin(curve_value),a*cos(curve_value),h*curve_value/(2*pi),...0,expect_elevation_angle,expect_azimuth_angle]';
%     position_d_before=[b*sin(curve_value_before),a*cos(curve_value_before),h*curve_value_before/(2*pi),...
%                        0,expect_azimuth_angle_before,expect_elevation_angle_before]';%angle changeif(expect_elevation_angle*expect_elevation_angle_before<0 && abs(expect_elevation_angle)>pi/2)if(expect_elevation_angle>expect_elevation_angle_before)expect_elevation_angle_before=expect_elevation_angle_before+2*pi;elseexpect_elevation_angle_before=expect_elevation_angle_before-2*pi;endendif(expect_azimuth_angle*expect_azimuth_angle_before<0 && abs(expect_azimuth_angle)>pi/2)if(expect_azimuth_angle>expect_azimuth_angle_before)expect_azimuth_angle_before=expect_azimuth_angle_before+2*pi;expect_azimuth_angle_before_b=expect_azimuth_angle_before_b+2*pi;elseexpect_azimuth_angle_before=expect_azimuth_angle_before-2*pi;expect_azimuth_angle_before_b=expect_azimuth_angle_before_b-2*pi;endendvelocity_d=[1,0,0,0,...(expect_elevation_angle-expect_elevation_angle_before)/delta_t,...(expect_azimuth_angle-expect_azimuth_angle_before)/delta_t]';
%     velocity_d=[1,0,0,0,...
%                 0,...
%                 0]';d_position_d=velocity_d;d_velocity_d=[0,0,0,0,...(expect_elevation_angle-2*expect_elevation_angle_before+expect_elevation_angle_before_b)/delta_t,...(expect_azimuth_angle-2*expect_azimuth_angle_before+expect_azimuth_angle_before_b)/delta_t]';
%     d_velocity_d=[0,0,0,0,...
%                   0,...
%                   0]';thruster=AUV_slide_model(position,velocity,position_d,velocity_d,d_position_d,d_velocity_d);%position iterateacceleration=AUV_model(position,velocity,thruster);velocity=velocity+acceleration*delta_t;position(5:6)=position(5:6)+velocity(5:6)*delta_t;position(1:3)=position(1:3)+J(1:3,1:3)*velocity(1:3)*delta_t;if position(5)>pi position(5)=position(5)-2*pi;endif position(5)<-pi position(5)=2*pi+position(5);endif position(6)>pi position(6)=position(6)-2*pi;endif position(6)<-pi position(6)=2*pi+position(6);endposition_d_storage=[position_d_storage,position_d];%beforecurve_value_before=curve_value;expect_azimuth_angle_before_b=expect_azimuth_angle_before;expect_elevation_angle_before_b=expect_elevation_angle_before;expect_azimuth_angle_before=expect_azimuth_angle;expect_elevation_angle_before=expect_elevation_angle;iteration=iteration+1;
end
%draw
figure(1)
plot3(y,x,z);
axis equal;grid on;hold on;
plot3(position_storage(2,:),position_storage(1,:),position_storage(3,:),'r-');
figure(2)
axis_x=0:length(position_d_storage)-1;
plot(axis_x,position_d_storage(5,:),'b-');
hold on;
plot(axis_x,position_storage(5,:),'r-');
xlabel("t");
ylabel("error_Theta");
figure(3)
plot(axis_x,position_d_storage(6,:),'b-');
hold on;
plot(axis_x,position_storage(6,:),'r-');
xlabel("t");
ylabel("error_Psi");

这篇关于AUV路径跟踪滑模控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/705337

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

控制反转 的种类

之前对控制反转的定义和解释都不是很清晰。最近翻书发现在《Pro Spring 5》(免费电子版在文章最后)有一段非常不错的解释。记录一下,有道翻译贴出来方便查看。如有请直接跳过中文,看后面的原文。 控制反转的类型 控制反转的类型您可能想知道为什么有两种类型的IoC,以及为什么这些类型被进一步划分为不同的实现。这个问题似乎没有明确的答案;当然,不同的类型提供了一定程度的灵活性,但

图的最短路径算法——《啊哈!算法》

图的实现方式 邻接矩阵法 int[][] map;// 图的邻接矩阵存储法map = new int[5][5];map[0] = new int[] {0, 1, 2, 3, 4};map[1] = new int[] {1, 0, 2, 6, 4};map[2] = new int[] {2, 999, 0, 3, 999};map[3] = new int[] {3, 7

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理

深入解析秒杀业务中的核心问题 —— 从并发控制到事务管理 秒杀系统是应对高并发、高压力下的典型业务场景,涉及到并发控制、库存管理、事务管理等多个关键技术点。本文将深入剖析秒杀商品业务中常见的几个核心问题,包括 AOP 事务管理、同步锁机制、乐观锁、CAS 操作,以及用户限购策略。通过这些技术的结合,确保秒杀系统在高并发场景下的稳定性和一致性。 1. AOP 代理对象与事务管理 在秒杀商品

Verybot之OpenCV应用三:色标跟踪

下面的这个应用主要完成的是Verybot跟踪色标的功能,识别部分还是居于OpenCV编写,色标跟踪一般需要将图像的颜色模式进行转换,将RGB转换为HSV,因为对HSV格式下的图像进行识别时受光线的影响比较小,但是也有采用RGB模式来进行识别的情况,这种情况一般光线条件比较固定,背景跟识别物在颜色上很容易区分出来。         下面这个程序的流程大致是这样的:

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、