基于人工势场法的二维平面内无人机的路径规划的matlab仿真,并通过对势场法改进避免了无人机陷入极值的问题

news2024/11/25 10:36:26

目录

1.算法描述

2.matlab算法仿真效果

3.MATLAB核心程序

4.完整MATLAB


1.算法描述

       人工势场法原理是:首先构建一个人工虚拟势场,该势场由两部分组成,一部分是目标点对移动机器人产生的引力场,方向由机器人指向目标点,另一部分是障碍物对移动机器人产生的斥力场,方向为由障碍物指向机器人。运行空间的总势场为斥力场和引力场共同叠加作用,从而通过引力和斥力的合力来控制移动机器人的移动。       

       物理学的势(potential),也称做“位”,是一种能量概念。在保守场里,把一个单位质点(如重力场中的单位质量,静电场中的单位正电荷)从场中的某一点A移到参考点,场力所作的功是一个定值。也就是说,在保守场中,单位质点在A点与参考点的势能之差是一定的,人们把这个势能差定义为保守场中A点的“势”。           

       人工势场法路径规划是由Khatib提出的一种虚拟力法(Oussama Khatib,Real-Time Obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1985 IEEE.)。它的基本思想是将机器人在周围环境中的运动,设计成一种抽象的人造引力场中的运动,目标点对移动机器人产生“引力”,障碍物对移动机器人产生“斥力”,最后通过求合力来控制移动机器人的运动。应用势场法规划出来的路径一般是比较平滑并且安全,但是这种方法存在局部最优点问题。

        人工势场就像构建了一个吸铁石,包括引力场和斥力场。黑色为障碍物,箭头为智能体要运动的方向,目标点为“Goal”。智能体按照箭头的方向到达“Goal”,目标点像有着“吸引力”一样吸引着智能体靠近。而在障碍物附近,智能体逆着箭头的方向,好像对智能体产生“排斥力”。智能体前进的方向就是这两种力的合力的方向。


 

       当然仅仅只有引力势场是不够的,我们还需要让机器人懂得避开地图中的障碍物,这时斥力势场便有用武之地了,斥力势场的会构建一个距离障碍物越近,斥力越大的特殊势场。 这个过程其实非常好理解,引力势场负责吸引机器人从起点朝着终点运动,斥力势场负责规避地图中的障碍。 通常我们会用下面这个函数来构建斥力势场:

        人工势场法路径规划是由Khatib提出的一种虚拟力法(Oussama Khatib,Real-Time Obstacle Avoidance for Manipulators and Mobile Robots. Proc of The 1985 IEEE.)。它的基本思想是将机器人在周围环境中的运动,设计成一种抽象的人造引力场中的运动,目标点对移动机器人产生“引力”,障碍物对移动机器人产生“斥力”,最后通过求合力来控制移动机器人的运动。应用势场法规划出来的路径一般是比较平滑并且安全,但是这种方法存在局部最优点问题。

       人工势场法是一种经典的机器人路径规划算法。该算法将目标和障碍物分别看做对机器人有引力和斥力的物体,机器人沿引力与斥力的合力来进行运动。

(a) 当物体离目标点比较远时,引力将变的特别大,相对较小的斥力在甚至可以忽略的情况下,物体路径上可能会碰到障碍物
(b)当目标点附近有障碍物时,斥力将非常大,引力相对较小,物体很难到达目标点
(c)在某个点,引力和斥力刚好大小相等,方向想反,则物体容易陷入局部最优解或震荡
       人工势场法(Artificial Potential Field)简称 APF,属于局部路径规划中常使用的一种方法。将传统力学中“场”的概念引入该方法,假设让智能体在这种虚拟力场下进行运动。如何设计引力场影响着该算法的性能,同时存在容易陷入局部极小点的局限性。 

2.matlab算法仿真效果

matlab2017b仿真结果如下:

3.MATLAB核心程序

%
Xo=[0 0];%
k=20;%
K=0;%
m=5;%
Po=2;%0
n=8;%
a=0.5;
l=0.05;%
J=500;%
%Po
%end
%
Xsum=[10 10;1 1.5;3 2.2;4 4.5;7 6;6 2;5.5 6;8 7.8;9.5 7];%(n+1)*2[10 10]
Xj=Xo;%j=1Xj
 
[x,y]=meshgrid(-1:0.5:12,-1:0.5:12);
z=0.5*k./(sqrt((x-10).^2+(y-10).^2+0.09))-0.5*m*(1./(sqrt((x-1).^2+(y-1.5).^2+0.09))-1/3.5).^2-0.5*m*(1./(sqrt((x-3).^2+(y-2.2).^2+0.09))-1/3.5).^2 ...
    -0.5*m*(1./(sqrt((x-4).^2+(y-4.5).^2+0.09))-1/3).^2-0.5*m*(1./(sqrt((x-7).^2+(y-6).^2+0.09))-1/3).^2-0.5*m*(1./(sqrt((x-6).^2+(y-2).^2+0.09))-1/3.5).^2 ...
    -0.5*m*(1./(sqrt((x-5.5).^2+(y-6).^2+0.09))-1/4).^2-0.5*m*(1./(sqrt((x-8).^2+(y-7.8).^2+0.09))-1/3).^2-0.5*m*(1./(sqrt((x-9.5).^2+(y-7).^2+0.09))-1/3).^2;
% contour(x,y,z,[-50:20:1000]);
[C,h]=contour(x,y,z,[-80:10:300]);
set(h,'ShowText','on','TextStep',get(h,'LevelStep')*2)
colormap cool
[px,py]=gradient(z);%x,y
quiver(x,y,px,py,'k') %
p=sqrt(px.^2+py.^2);
%%
t=1;
M(t)=getframe;
t=t+1;
 
%*********************************
for j=1:J%
    Goal(j,1)=Xj(1);%Goal
    Goal(j,2)=Xj(2);
%
   Theta=compute_angle(Xj,Xsum,n);%ThetaX
%
   Angle=Theta(1);%Theta1
   angle_at=Theta(1);%angle_at
   [Fatx,Faty]=compute_Attract(Xj,Xsum,k,Angle,0,Po,n);%x,y
   
    for i=1:n
       angle_re(i)=Theta(i+1);%nn
     end
%
    [Frerxx,Freryy,Fataxx,Fatayy]=compute_repulsion(Xj,Xsum,m,angle_at,angle_re,n,Po,a);%x,y
%j
    Fsumyj=Faty+Freryy+Fatayy;%y
    Fsumxj=Fatx+Frerxx+Fataxx;%x
    Position_angle(j)=atan(Fsumyj/Fsumxj);%x
%
    Xnext(1)=Xj(1)+l*cos(Position_angle(j));
    Xnext(2)=Xj(2)+l*sin(Position_angle(j));
    %
    Xj=Xnext;
    X=Goal(:,1);
    Y=Goal(:,2);
    plot(X,Y,'.r');
    M(t)=getframe;t=t+1;
    %
    if ((Xj(1)-Xsum(1,1))>0)&((Xj(2)-Xsum(1,2))>0)%
       K=j;%
       break;
       %j
    end%if
end%
A79

4.完整MATLAB

V

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

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

相关文章

C语言——malloc开辟矩阵

目录 用动态内存开辟矩阵 矩阵初始化 用动态内存开辟矩阵 动态内存更多的知识在这篇博客,本文将介绍用malloc开辟矩阵。 malloc是C语言中用来动态开辟内存的,通过malloc函数可以向计算机申请一串连续的内存空间。 因为malloc开辟的内存在堆上&#…

数据链路层-封装成帧

封装成帧 数据链路层给上层交付的协议数据单元添加上帧头和帧尾使之成为帧帧头和帧尾包含有重要的控制信息帧头和帧尾的作用之一就是帧定界 透明传输 数据链路层对上层的交付的传输数据没有任何的限制,就好像数据链路层不存在一样面向字节的物理链路使用字节填充(字…

manjaro (gnome) 记录 2 常用配置与快捷键介绍

manjaro (gnome) 记录 2 常用配置与快捷键介绍 初manjaro 记录 2 常用配置与快捷键介绍安装 vim 文本编辑器配置中文输入法安装谷歌拼音配置输入法添加快捷键:gnome 终端通过命令:gnome-terminal 可以打开 gnome 终端窗口设置快捷…

学习Hadoop(一)——搭建hadoop集群

最近开始学习大数据的相关知识,要学习大数据就不得不提到Hadoop。 一般来说学习一门新的知识,很多都是先理论再实践 我则不然,先实践,再了解理论 目录一、VM网络设置二、安装Centos72.1 网络配置2.2 设置主机名2.3 hosts设置2.4…

【在SpringBoot项目中使用Validation框架检查数据格式】

目录 1. 添加依赖 2. 检查POJO类型的请求参数 3. 关于响应的消息文本 4. 快速失败 5. 检查未封装的请求参数 1. 添加依赖 在pom.xml中添加spring-boot-starter-validation依赖项&#xff1a; <!-- Spring Boot Validation框架&#xff0c;用于检查数据格式 --> &…

ctfshow 月饼杯

寒假打算认真学习一下&#xff0c;就先从半个月的刷题开始。 文章目录web1_此夜圆web2_故人心web3_莫负婵娟web1_此夜圆 题目给的有附件&#xff0c;一看就是php反序列化字符串逃逸(应该是签到题)。 源码&#xff1a; <?php error_reporting(0);class a {public $uname;…

负载均衡组件Ribbon核心-@LoadBalanced-下

引言 书接上篇 负载均衡组件Ribbon核心-LoadBalanced-上 我们讲完了理解LoadBalanced注解的知识准备&#xff0c;接下来就是LoadBalanced注解详解。 LoadBalancerAutoConfiguration 激活 LoadBalanced 注解功能起点来至LoadBalancerAutoConfiguration自动配置类&#xff0c;S…

uni-app 超详细教程(三)(从菜鸟到大佬)

本文中内容为&#xff1a; 1. 支付功能&#xff08;微信支付&#xff0c;支付宝支付&#xff09; 2. 项目打包&#xff1a;&#xff08;APP打包&#xff0c;H5打包&#xff0c;微信小程序打包&#xff09; 一&#xff0c;uni - app 的支付功能 一、微信支付 1、登录微信开…

如何在Ubuntu20.04上安装RDP远程

计算机最有意思的事情&#xff0c;就是你可以用任何方式去实现跨设备连接。例如google通过webrtc实现远程桌面&#xff0c;Linux则是常用ssh等。在远程桌面上一般分为windows的RDP和Unix/Linux的VNC。 常规在windows上winr输入mstsc,我们通过微软的RDP技术去远程计算机。RDP和…

C#Lambda让代码变得更加简洁而优雅

Using a lambda expression&#xff0c;we can make the code more compact and elegant。   在使用lambda表达式时&#xff0c;可以使代码更加简洁和优雅。 Lambda&#xff0c;希腊字母λ&#xff0c;在C#编程语言中&#xff0c;被引入为Lambda表达式&#xff0c;表示为匿名…

使用[阿里问题定位神器]Arthas入门

目录 注意 安装 在线安装 离线安装 目前我接触到的实用命令 dashboard heapdump thread jad stack trace 注意 arthas本身有一定的性能消耗&#xff0c;所以生产环境小心使用 arthas本身有一定的性能消耗&#xff0c;所以生产环境小心使用 arthas本身有一定的性能…

【Linux】万字总结Linux 基本指令,绝对详细!!!

文章目录 Linux 基本指令 ls 指令 alias 指令 cd指令 pwd 指令 clear指令 touch 指令 mkdir 指令&#xff08;重要&#xff09; rmdir指令 && rm 指令&#xff08;重要&#xff09;&#xff1a; man指令&#xff08;重要&#xff09; cp指令&#xff08;重…

闭关三个月,腾讯大咖手写Framework最新源码笔记,从基础到进阶直接封神

什么是Android Framework 我们首先给出Android Framework的定义&#xff0c;然后再对该定义给出详细的解释。 Android Framework包含三个内容&#xff1a;服务端、客户端、linux驱动 服务端 Android Framework服务端包括两个很重要的类&#xff1a;WindowManagerService (W…

实验(六):定时器实验

一、实验目的与任务 实验目的&#xff1a; 1&#xff0e;掌握定时/计数器的中断法工作原理&#xff1b; 2&#xff0e;熟悉C51编程与调试方法。 任务&#xff1a; 1. 运行Keil开发环境&#xff0c;完成定时器软件编程&#xff1b; 2. 建立Proteus仿真模型&#xff1b; 3&#x…

day15_面向对象的三大特征之一(继承)

继承的概述 Java是对现实社会的模拟&#xff0c;现实中有儿子可以继承父亲的财产&#xff0c;因此有了富二代的。 java中多个类中存在相同属性和行为时&#xff0c;将这些内容抽取到单独一个类中&#xff0c;那么多个类中无需再定义这些属性和行为&#xff0c;只需要和抽取出来…

CSDNtop1全栈接口测试教程 jmeter接口测试,接口自动化测试

测试时优先对其进行结构化拆分&#xff0c;将测试整体拆分为各个场景 创建线程组&#xff0c;简单控制器&#xff0c;HTTP请求默认值&#xff0c;HTTP信息头管理器 将测试目标结构化&#xff0c;可以更好地管理测试框架和整合其他组件&#xff0c;有利于反馈工作 添加HTTP请求…

如何做好自动化测试?揭开测试项目团队的自动化实践过程……

稍具测试规模的项目团队皆想引进自动化测试&#xff0c;然而动手实现自动化测试的团队却不多&#xff0c;未能真正实施的原因多种多样&#xff0c;有扼杀在摇篮里的&#xff0c;有写了后弃之不用。那么是不是所有的业务都适合自动化测试呢&#xff1f;下面就介绍下自己在项目中…

超级好用的笔记工具------Typora 如何修改Typora 中图片保存的位置

用了这么多的笔记、最后还是选择了Typora。真的是很不错呐。一些私密的笔记、比如公司内部资料。放到网页多多少少是不安全的。还是放到本地安全的多。 1、使用Typora 做的小笔记 1.1 目录情况 这个可以按照自己的进度或者时间节点自行分级 1.2 某一个页面的具体设计 2、基本…

react18 通过redux 做一个简单的状态管理基站

我们打开react项目 在终端输入 npm install redux --saveredux就进来了 这里 我们引入了 redux 但其实 有一个 redux 和一个 react-redux 两者区别在于 redux 是一个js的状态管理容器 而react-redux 则提供了 更多便于react开发的状态管理方法 然后我们在项目的src目录下创…

4-FreeRTOS队列、互斥、信号量

1-队列 队列&#xff08;我对队列的理解就是上体育课&#xff0c;排队这种&#xff09;是任务之间通信的一种方式。队列可以用于任务和任务之间或者中断和任务之间消息的接收与发送。在多数情况下&#xff0c;他们消息缓冲是按照FIFO&#xff08;先进先出&#xff09;原则。也…