【无人水面艇路径跟随控制8】(Matlab)USV代码阅读:LOS通过视线引导算法和PID控制器来实现无人水面艇的直线路径跟踪

【无人水面艇路径跟随控制8】(Matlab)USV代码阅读:通过视线引导算法和PID控制器来实现无人水面艇的直线路径跟踪

  • 写在最前面
  • LOS.m
    • 代码思路
      • 1. **参数初始化**
      • 2. **仿真时间设置**
      • 3. **仿真主循环**
        • 3.1 **视线引导法(LOS)**
        • 3.2 **控制律**
        • 3.3 **动力学模型**
        • 3.4 **PID 控制输出**
        • 3.5 **状态更新**
      • 4. **结果绘制**
      • 5. **控制器调节**
      • 6. **总结**
    • 代码解释
    • 全部代码


请添加图片描述

🌈你好呀!我是 是Yu欸
🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

写在最前面

USV-path-following
USV路径跟踪LOS控制算法仿真

阅读代码:https://github.com/quyinsong/USV-path-following
运行效果:

在这里插入图片描述

请添加图片描述

LOS.m

这段代码实现了一个用于直线路径跟踪的视线引导(Line of Sight, LOS)控制算法,使用了PID控制器。

仿真循环:每个状态更新步骤使用欧拉积分 (euler2) 来更新状态。

需要实现或导入 USV 和 euler2 函数,即USV.m 和 euler2.m文件。

代码思路

这段 MATLAB 代码实现了一种基于 视线引导法(Line-of-Sight, LOS) 的路径跟随控制算法,适用于自主水面艇(USV)的直线路径跟随。整个代码由 USV 的运动学和动力学模型构成,使用了 PID 控制器来调节航向。下面逐步解释代码的主要部分:

1. 参数初始化

  • USV 的运动学和动力学参数初始化:m11, m22, m33 等是质量矩阵的相关元素,描述了 USV 的动力学特性。Xu, Yv, Nv 等是水动力系数,表示不同方向上的阻力和力矩的影响。

  • xk, yk:定义了直线路径的两个点。afak 计算了路径的方向角,基于起点和终点的坐标,通过 atan2 函数得到。

2. 仿真时间设置

  • ts:仿真时间步长,tfinal:仿真总时间,Ns:仿真步骤数量。初始状态 x=[0.1, 0.1, 0, 5, 5, 0] 对应了初始的速度、位置和航向角。

3. 仿真主循环

在这个循环中,代码执行以下操作:

3.1 视线引导法(LOS)
  • Kp1 是 LOS 控制器的增益。
  • ye 是横向偏差,表示 USV 在当前时刻相对于目标路径的偏离量。
  • beta 是当前 USV 的航向角。
  • psaid 计算出期望航向角,基于 LOS 规则。
3.2 控制律
  • 使用 PID 控制器来控制航向,ek 表示当前航向误差,KdKp2 是控制器的参数,分别用于调整控制器对误差的响应。
3.3 动力学模型
  • M 是 USV 的质量矩阵,Crb 是与科氏力和离心力相关的刚体力矩矩阵。
  • Nvr 是与水动力相关的阻尼矩阵,表示水流对 USV 的影响。
  • fr 是摩擦力模型。
3.4 PID 控制输出
  • tpid 是 PID 控制器的输出力矩,用于控制 USV 的航向。
  • tao 是控制输入向量,包含横向力、纵向力和航向力矩。
3.5 状态更新
  • 使用 euler2 函数进行欧拉法数值积分,更新 USV 的状态。
  • xdot = USV(x,tao,[0 0]',[0,0]',d) 通过调用 USV 函数计算 USV 的状态导数,d 是随机噪声,模拟环境干扰。

4. 结果绘制

  • 仿真结束后,代码生成多组图表,分别展示了 USV 的位置、航向角、速度、控制输入等随时间的变化。
  • modelplot 函数用于在仿真过程中绘制 USV 的路径。

5. 控制器调节

在仿真过程中,Kp2Kd 这两个参数根据不同的航向误差动态调整,以增强系统的响应速度和稳定性。PID 控制器根据航向误差和其导数生成控制信号来调整 USV 的航向。

6. 总结

  • 视线引导法(LOS):该方法是一个经典的路径跟随方法,通过计算目标路径与 USV 当前位姿之间的偏差,生成期望的航向角。
  • PID 控制器:用于调整航向,控制系统依据当前的航向误差来调整 USV 的姿态和速度。
  • 运动模型:考虑了水动力、摩擦力和环境干扰,使用欧拉法进行数值积分来模拟 USV 的运动。

这个代码实现了 USV 在水面上跟随指定直线路径的仿真,并且展示了控制器的设计和性能。

代码解释

以下是代码的详细解释:

  1. 初始化和清理

    clc
    clear all
    

    清除命令窗口和工作区中的所有变量。

  2. 定义USV(无人水面艇)参数

    m11 = 25.8; m22 = 33.8; m33 = 2.76; m23 = 1.095; m32 =1.095;
    Xu=0.72253;          Yv=-0.88965;          Nv=0.0313;
    Xuu=-1.32742;        Yr=-7.25;             Nr=-1.9;Yvv=-36.47297;        Nvv=3.95645;Yrv=-0.805;           Nrv=0.13;Yvr=-0.845;           Nvr=0.08;Yrr=-3.45;            Nrr=-0.75;
    

    定义了USV的质量矩阵和阻尼系数等参数。

  3. 生成两个目标点

    xk =[5 5]';yk =[300 150]';
    afak=atan2(yk(2)-xk(2),yk(1)-xk(1));
    

    定义了两个目标点,并计算了它们之间的角度afak

  4. 初始化变量

    ts =0.01;
    tfinal=50;
    Ns=tfinal/ts;
    x=[0.1 0.1 0 5 5 0]';x0=x;
    ek_1=1; Ek(1)=ek_1;psaid_1 = 0.1; psaid_2 = 0.05;
    

    初始化了仿真时间步长、总时间、状态变量x、误差ek_1和一些控制参数。

  5. 仿真循环

    disp('Simulation ...');
    for k=1:1:Nstime(k)=(k-1)*ts;% LOS lawKp1=0.1;ye=-(x(4)-xk(1))*sin(afak)+(x(5)-xk(2))*cos(afak);YE(k)=ye;beta=atan2(x(2),x(1));psaid=afak+atan2(-Kp1*ye,1)-beta;% control lawu = x(1);v=x(2);r= x(3);ek=x(6)-psaid;if k*ts<=0.5, Kd=0.8; else ,Kd=10;end if ek<=0.05, Kp2=3;else,Kp2=1;end% matrixn11=-Xu-Xuu*abs(u);n22=-Yv-Yvv*abs(v)-Yrv*abs(r);n23=-Yr-Yvr*abs(v)-Yrr*abs(r);
    

    进行仿真,计算每个时间步的状态更新:

    • LOS控制律:计算横向误差ye,并根据误差计算期望航向psaid
    • 控制律:根据当前状态x计算控制误差ek,并调整控制增益KdKp2
    • 矩阵计算:计算阻尼矩阵的各个元素。

全部代码

% line of sight guidence used in straight line path following% control law use PID
clc
clear all
% USV parameters 
m11 = 25.8; m22 = 33.8; m33 = 2.76; m23 = 1.095; m32 =1.095;
Xu=0.72253;          Yv=-0.88965;          Nv=0.0313;
Xuu=-1.32742;        Yr=-7.25;             Nr=-1.9;Yvv=-36.47297;        Nvv=3.95645;Yrv=-0.805;           Nrv=0.13;Yvr=-0.845;           Nvr=0.08;Yrr=-3.45;            Nrr=-0.75;% generate two points
xk =[5 5]';yk =[300 150]';
afak=atan2(yk(2)-xk(2),yk(1)-xk(1));
%initial
ts =0.01;
tfinal=50;
Ns=tfinal/ts;
x=[0.1 0.1 0 5 5 0]';x0=x;
ek_1=1; Ek(1)=ek_1;psaid_1 = 0.1; psaid_2 = 0.05;
% simulation
disp('Simulation ...');
for k=1:1:Nstime(k)=(k-1)*ts;% LOS lawKp1=0.1;ye=-(x(4)-xk(1))*sin(afak)+(x(5)-xk(2))*cos(afak);YE(k)=ye;beta=atan2(x(2),x(1));psaid=afak+atan2(-Kp1*ye,1)-beta;% control lawu = x(1);v=x(2);r= x(3);ek=x(6)-psaid;if k*ts<=0.5, Kd=0.8; else ,Kd=10;end if ek<=0.05, Kp2=3;else,Kp2=1;end% matrixn11=-Xu-Xuu*abs(u);n22=-Yv-Yvv*abs(v)-Yrv*abs(r);n23=-Yr-Yvr*abs(v)-Yrr*abs(r);n32=-Nv-Nvv*abs(v)-Nrv*abs(r);n33=-Nr-Nvr*abs(v)-Nrr*abs(r);M=[m11  0    0;0   m22 m23;0   m32 m33];Crb=[0             0       -m22*v-m23*r;0             0        m11*u;m22*v+m23*r  -m11*u       0        ];
%     Nvr=[n11   0     0;
%           0   n22  n23;
%           0   n32  n33 ];c13=Crb(1,3);c23=Crb(2,3);c31=-c13;c32=-c23;m0 = m22*m33-m23*m32;fr = (m32*(c23*r+n22*v+n23*r)+m22*(c13*u+c23*v-n32*v-n33*r))/m0;psaidd = (psaid-2*psaid_1+psaid_2)/ts^2;psaid_2=psaid_1; psaid_1 = psaid;tpid=-Kp2*ek-Kd*(ek-ek_1)/ts-fr*m0/m22+psaidd; ek_1=ek;tao=[20 0 tpid]';Ttao(k,:)=tao';Ek(k)=ek;% USVd = [1*randn(1,1) 2*randn(1,1) 2*randn(1,1)]';xdot=USV(x,tao,[0 0]',[0,0]',d);% state updatex=euler2(xdot,x,ts);% store time seriesxout(1,:)=x0;xout(k,:)=x';
end
u=xout(:,1);
v=xout(:,2);
r=xout(:,3);
N=xout(:,4);
E=xout(:,5);
psai=xout(:,6);
% plot
disp('Plot ...');
for k=1:1:Nspos =[N(k) E(k)]';if k==1modelplot(pos,psai(k));endif rem(k*ts,5)==0modelplot(pos,psai(k));end   
end
plot(E,N,'r','linewidth',2)
plot([xk(2) yk(2)],[xk(1) yk(1)],'b',E,N,'r--','linewidth',2)
hold off;
figure(2);
plot([xk(2) yk(2)],[xk(1) yk(1)],'b',E,N,'r--','linewidth',2)
xlabel('E');ylabel('N');
figure(3);
plot(time,psai*180/pi,'r','linewidth',2);
xlabel('time/s');ylabel('psai/deg');
figure(4);
plot(time,u,'r','linewidth',2)
xlabel('time/s');ylabel('u (m/s)');
figure(5);
plot(time,Ttao(:,1),'r',time,Ttao(:,3),'b','linewidth',2)
legend('surge force','yaw torch');
figure(6);
plot(time,YE,'r','linewidth',2)
xlabel('time/s');ylabel('YE (m)');

hello,我是 是Yu欸 。如果你喜欢我的文章,欢迎三连给我鼓励和支持:👍点赞 📁 关注 💬评论,我会给大家带来更多有用有趣的文章。
原文链接 👉 ,⚡️更新更及时。

欢迎大家添加好友交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558826.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

跟李沐学AI:使用注意力机制的seq2seq

动机 机器翻译中&#xff0c;每个生成的单词可能相关于源句子中的不同词。但Seq2sqe模型不能对此直接建模。 简单的Seq2Seq模型存在一个问题&#xff0c;即它将整个输入序列的信息压缩到了一个固定长度的向量中&#xff0c;这可能导致信息丢失&#xff0c;尤其是当输入序列很…

网站建设公司哪家好?好的网站建设公司应该有哪些特别之处?

面对众多的网站建设公司&#xff0c;企业该如何选择呢&#xff1f;如何才能避坑呢&#xff1f;本文将探讨好的网站建设公司应该具备的特别之处 案例&#xff0c;这是最直观的表现&#xff0c;一个好的网站建设公司必然拥有为数众多的的案例展示&#xff0c;且这些案例质量高&a…

分布式事务seata AT和XA性能对比

1. AT模式和XA模式性能对比&#xff1a; AT的阻塞是阻塞在了业务服务层&#xff0c;全局锁。 而XA模式是阻塞在了数据库&#xff0c;对数据库的性能影响很大。 肯定是优选AT&#xff0c;可以提升数据库的性能。 &#xff08;由于AT模式数据库事务阻塞小&#xff0c;那么同一…

自动化测试中如何高效进行元素定位!

前言 在自动化测试中&#xff0c;元素定位是一项非常重要的工作。良好的元素定位可以帮助测试人员处理大量的测试用例&#xff0c;加快测试进度&#xff0c;降低工作负担。但是在实际的测试工作中&#xff0c;我们常常遇到各种各样的定位问题&#xff0c;比如元素定位失败、元…

Python(十一)-__init__()方法,__str__()方法,__del__()方法

目录 魔法方法 无参__init__()方法 有参__init__()方法 __str__()方法 __del__()方法 魔法方法 魔法方法指的是&#xff1a;可以给Python类增加魔力的特殊方法。有两个特点&#xff1a; &#xff08;1&#xff09;总是被双下划线所包围&#xff1b; &#xff08;2&…

kubernetes 中 pod 的管理及优化

目录 一 kubernetes 中的资源 1.1 资源管理介绍 1.2 资源管理方式 1.2.1 命令式对象管理 1.2.2 资源类型 1.2.3 基本命令示例 1.2.3 运行和调试命令示例 1.2.4 高级命令示例 二 什么是pod 2.1 创建自主式pod &#xff08;生产不推荐&#xff09; 2.2 利用控制器管理…

零工市场转型数字化的挑战和机遇

我们的生活因为科技而变的更加方便、便利&#xff0c;例如手机支付、网上购物&#xff0c;那么就目前的就业市场来说&#xff0c;零工市场也面临着数字化转型的挑战和机遇。 零工市场数字化的机遇&#xff1a; 1.通过大数据的计算&#xff0c;极大的提高了零工市场中的匹配效率…

定点数和浮点数的详细介绍(一)定义、范围、位宽

1.定点数 1.1定点数描述 定点数包括定点小数(纯小数)、定点整数(纯整数)、整数和小数位数固定的实数。 1.2定点小数: 小数点默认在符号位后面,首位为符号位,其他为数值位(在用二进制代表小数时,例如0xFF,就表示0.5+0.25+0.125+0.0625+0.03125........) 例如,用…

希亦超声波清洗机值得购买吗?清洁技术之王多维度测评大揭秘!

随着人们生活质量的提升&#xff0c;高质量眼镜愈发受到欢迎&#xff0c;但它们的清洁与保养却常常被疏忽&#xff0c;导致镜片蒙尘受损&#xff0c;影响佩戴者的视觉清晰度。为此&#xff0c;超声波眼镜清洗机作为一种新兴潮流应时而生&#xff0c;以其高效清洁眼镜及珠宝、精…

无线AC——FW1——RT1——FW2——无线AP配置

无线AC——FW1——RT1——FW2——无线AP配置 AC: ! service dhcp ! ip dhcp pool v130 network-address 172.168.130.0 255.255.255.0 default-router 172.168.130.

三好夫人“硬控”嘴强王者老公

工作有点累了… 有点困了… 喝酒了… 吃的太饱了… 今天外面下雨的原因… 外面太热了… 最近压力大… 姐妹们是不是很熟悉这些话术&#xff0c;三好夫人可以很明确的告诉大家&#xff0c;天下的老公都一样&#xff0c;嘴上厉害的很&#xff0c;但是一到实践&#xff0c;…

React复习

文章目录 常用的HooksuseStateuseReduceruseRefuseContextuseMemouseCallbackuseEffect 组件通信Props&#xff08;属性&#xff09;Ref&#xff08;引用&#xff09;Context&#xff08;上下文&#xff09;State&#xff08;状态&#xff09;回调函数Event Bus&#xff08;事件…

KDTS 实现MySQL至KingbaseES迁移实践

此文章以linux环境实践&#xff0c;KingbaseES一下使用KES代替。 KDTS KDTS工具安装KES时会一起安装&#xff0c;一般存在目录为&#xff1a;ClientTools目录下guitools文件夹中 启动 进入KDTS-WEB下bin目录&#xff0c;执行sh文件 cd /opt/Kingbase/ES/V8/ClientTools/guit…

盘点2024年15大投屏软件电脑版,看看哪款最好用?

无线投屏软件哪个好用&#xff0c;相信这个问题困扰过不少同鞋&#xff0c;最重要的当然是画质高、投屏流畅&#xff0c;最好还是免费滴&#xff01; 接下来就分享下国内外一些流行的投屏工具&#xff0c;共计15款&#xff0c;通过对比他们的 优缺点&#xff0c;相信你可以快速…

2025西安电子科技大学研招网拟招生人数VS 24年实际录取人数

研招网拟招生人数 VS 24年实际录取人数&#xff08;分析速览&#xff09; 10月8日研招网公布拟招生人数信息后&#xff0c;就有同学问研招网人数准不准确&#xff0c;其实研招网公布的人数并不不准确&#xff0c;但是学长学姐还是给大家统计了一下&#xff0c;与去年实际录取人…

nginx问题解决-nginx代理数据库端口

一.问题背景 无法直接访问数据库地址&#xff0c;需要公网转发访问 二.配置文件 stream {upstream sql_socket {server IP:端口;#sql ip和端口}server {listen 端口;proxy_connect_timeout 60s;proxy_pass sql_socket;} } 三.异常处理 重新编译Nginx并在编译选项中包含--wi…

开源计算器应用的全面测试计划:确保功能性和可靠性

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

abc374 g

很容易想到建图&#xff0c;初始想法为&#xff0c;建完图后&#xff0c;求一个最小路径覆盖&#xff0c;但因为整个图不是DAG&#xff0c;所以需要缩点&#xff0c;但路径覆盖有两种说法&#xff0c;一种是最小不相交路径覆盖&#xff0c;另一种是最小可相交路径覆盖。 对于最…

Linux-更多的结构化命令

for命令 C语言风格的for语句 while命令 until命令 嵌套循环 循环处理文件数据 控制循环-break命令 控制循环-continue命令 处理循环输出 实例&#xff1a;查询可执行文件、创建多个用户账户

【华为OD机试真题】95、最少面试官数

package mainimport ("fmt""sort" )type s struct {start intend intworkCount int }type duration struct {start intend int }// 查询时间段内是否有可用的面试官 func getFreeS(sList []*s, d *duration, workCountLimit int) (sIndex int)…