一、简介

人工势场法是局部路径规划的一种比较常用的方法。这种方法假设机器人在一种虚拟力场下运动。

如图所示,机器人在一个二维环境下运动,图中指出了机器人,障碍和目标之间的相对位置。

这个图比较清晰的说明了人工势场法的作用,物体的初始点在一个较高的“山头”上,要到达的目标点在“山脚”下,这就形成了一种势场,物体在这种势的引导下,避开障碍物,到达目标点。

人工势场包括引力场合斥力场,其中目标点对物体产生引力,引导物体朝向其运动(这一点有点类似于A*算法中的启发函数h)。障碍物对物体产生斥力,避免物体与之发生碰撞。物体在路径上每一点所受的合力等于这一点所有斥力和引力的和。这里的关键是如何构建引力场和斥力场。下面我们分别讨论一下:

引力场:

常用的引力函数:

这里的ε是尺度因子.ρ(q,q_goal)表示物体当前状态与目标的距离。引力场有了,那么引力就是引力场对距离的导数(类比物理里面W=FX):、

关于梯度的算法可以参考相关资料,简单提一下,二元函数梯度是酱紫的[δx,δy],这个符号是偏导数,不太对,见谅。

Fig .引力场模型

斥力场:

公式(3)是传统的斥力场公式,现在还没有搞清楚是怎么推导出来的。公式中η是斥力尺度因子,ρ(q,q_obs)代表物体和障碍物之间的距离。ρ_0代表每个障碍物的影响半径。换言之,离开一定的距离,障碍物就对物体没有斥力影响。

斥力就是斥力场的梯度


Fig 斥力场模型

总的场就是斥力场合引力场的叠加,也就是U=U_att+U_rep,总的力也是对对应的分力的叠加,如下图所示:

二、存在的问题
(a) 当物体离目标点比较远时,引力将变的特别大,相对较小的斥力在甚至可以忽略的情况下,物体路径上可能会碰到障碍物

(b)当目标点附近有障碍物时,斥力将非常大,引力相对较小,物体很难到达目标点

(c)在某个点,引力和斥力刚好大小相等,方向想反,则物体容易陷入局部最优解或震荡

三、各种改进版本的人工势场法
(a)对于可能会碰到障碍物的问题,可以通过修正引力函数来解决,避免由于离目标点太远导致引力过大

和(1)式相比,(5)式增加了范围限定。d*_goal 给定了一个阈值限定了目标和物体之间的距离。对应的梯度也就是引力相应变成:

(b)目标点附近有障碍物导致目标不可达的问题,引入一种新的斥力函数

这里在原有斥力场的基础上,加上了目标和物体距离的影响,(n是正数,我看到有篇文献上n=2)。直观上来说,物体靠近目标时,虽然斥力场要增大,但是距离在减少,所以在一定程度上可以起到对斥力场的拖拽作用

相应斥力变成:

所以可以看到这里引力分为两个部分,编程时要格外注意

(c)局部最优问题是一个人工势场法的一个大问题,这里可以通过加一个随机扰动,让物体跳出局部最优值。类似于梯度下降法局部最优值的解决方案。

二、源代码

clear all;
%障碍和目标,起始位置都已知的路径规划,意图实现从起点可以规划出一条避开障碍到达目标的路径。
%初始化车的参数
Xo=[0 0];% 起点位置
k=1000;% 计算引力需要的增益系数
%K=0;% 初始化
m=10;% 计算斥力的增益系数,都是自己设定的。
Po=1;%障碍影响距离,当障碍和车的距离大于这个距离时,斥力为0,即不受该障碍的影响。也是自己设定。
n=9;%障碍个数
a=0.5;
l=0.1;% 步长
J=300;%循环迭代次数
r = 0.5;
%如果不能实现预期目标,可能也与初始的增益系数, Po 设置的不合适有关。
%end
%给出障碍和目标信息
Xsum=[10 10;1 1.5;3 2.2;4 4.5;3 6;6 2.5;5.5 6; 6 4.5;9 9;8.5 5];% 这个向量是(n+1)*2 维,其中[10 10] 是目标位置,剩下的都是障碍的位置。
Xj=Xo;%j=1 循环初始,将车的起始坐标赋给Xj
%*************** 初始化结束,开始主体循环******************
for j=1:J% 循环开始Goal(j,1)=Xj(1);%Goal 是保存车走过的每个点的坐标。刚开始先将起点放进该向量。Goal(j,2)=Xj(2);%调用计算角度模块Theta=compute_angle(Xj,Xsum,n);%Theta 是计算出来的车和障碍,和目标之间的与X 轴之间的夹角,统一规定角度为逆时针方向,用这个模块可以计算出来。%调用计算引力模块Angle=Theta(1);%Theta (1)是车和目标之间的角度,目标对车是引力。angle_at=Theta(1);% 为了后续计算斥力在引力方向的分量赋值给angle_at[Fatx,Faty]=compute_Attract(Xj,Xsum,k,Angle,0,Po,n);% 计算出目标对车的引力在x,y 方向的两个分量值。for i=1:nangle_re(i)=Theta(i+1);% 计算斥力用的角度,是个向量,因为有n 个障碍,就有n 个角度。end%调用计算斥力模块[Frerxx,Freryy,Fataxx,Fatayy]=compute_repulsion(Xj,Xsum,m,angle_at,angle_re,n,Po,a,r);%计算出斥力在x,y 方向的分量数组。%计算合力和方向,这有问题,应该是数,每个j 循环的时候合力的大小应该是一个唯一的数,不是数组。应该把斥力的所有分量相加,引力所有分量相加。Fsumyj=Faty+Freryy+Fatayy;%y 方向的合力Fsumxj=Fatx+Frerxx+Fataxx;%x 方向的合力Position_angle(j)=atan(Fsumyj/Fsumxj);% 合力与x 轴方向的夹角向量%计算车的下一步位置%保存车的每一个位置在向量中Xj=Xnext;%判断if ((Xj(1)-Xsum(1,1))>0)&((Xj(2)-Xsum(1,2))>0)% 是应该完全相等的时候算作到达, 还是只是接近就可以?现在按完全相等的时候编程。K=j  % 记录迭代到多少次,到达目标。break;%记录此时的j 值end%如果不符合if 的条件,重新返回循环,继续执行。
end%大循环结束
K=j;
Goal(K,1)=Xsum(1,1);% 把路径向量的最后一个点赋值为目标
Goal(K,2)=Xsum(1,2);
%*********************************** 画出障碍, 起点, 目标, 路径点*************************
%画出路径%路径向量Goal 是二维数组,X,Y 分别是数组的x,y 元素的集合,是两个一维数组。
x=[1 3 4 3 6 5.5 6  9 8.5];% 障碍的x 坐标
y=[1.5 2.2 4.5 6 2.5 6 4.5 9 5];
plot(10,10,'v',0,0,'ms',X,Y ,'-k','linewidth',3);Pathkm = K*l
%斥力计算
function [Yrerxx,Yreryy,Yataxx,Yatayy]=compute_repulsion(X,Xsum,m,angle_at,angle_re,n,Po,a,r)% 输入参数为当前坐标, Xsum 是目标和障碍的坐标向量,增益常数,障碍,目标方向的角度
Rat=(X(1)-Xsum(1,1))^2+(X(2)-Xsum(1,2))^2;% 路径点和目标的距离平方
rat=sqrt(Rat);% 路径点和目标的距离
for i=1:nRrei(i)=(X(1)-Xsum(i+1,1))^2+(X(2)-Xsum(i+1,2))^2;% 路径点和障碍的距离平方rre(i)=sqrt(Rrei(i))-r;% 路径点和障碍的距离保存在数组rrei 中R0=(Xsum(1,1)-Xsum(i+1,1))^2+(Xsum(1,2)-Xsum(i+1,2))^2;r0=sqrt(R0)-r;if rre(i)>Po% 如果每个障碍和路径的距离大于障碍影响距离,斥力令为0Yrerx(i)=0;Yrery(i)=0;Yatax(i)=0;Yatay(i)=0;else
%if r0<Poif rre(i)<Po/2if X(2)>Xsum(i+1,2)Yrer(i)=m*(1/rre(i)-1/Po)*((1/rre(i))^2)*(rat);% 分解的Fre1 向量Yata(i)=a*m*((1/rre(i)-1/Po)^2)*(rat^a);% 分解的Fre2 向量Yrerx(i)=-Yrer(i)*cos(angle_re(i));%angle_re(i)=Y(i+1)Yrery(i)=1*Yrer(i)*sin(angle_re(i));Yatax(i)=Yata(i)*cos(angle_at);%angle_at=Y(1)Yatay(i)=Yata(i)*sin(angle_at);elseYrer(i)=m*(1/rre(i)-1/Po)*((1/rre(i))^2)*(rat);% 分解的Fre1 向量Yata(i)=a*m*((1/rre(i)-1/Po)^2)*(rat^a);% 分解的Fre2 向量Yrerx(i)=Yrer(i)*cos(angle_re(i));%angle_re(i)=Y(i+1)Yrery(i)=-1*Yrer(i)*sin(angle_re(i));Yatax(i)=Yata(i)*cos(angle_at);%angle_at=Y(1)Yatay(i)=Yata(i)*sin(angle_at);end           elseif X(2)>Xsum(i+1,2)Yrer(i)=m*(1/rre(i)-1/Po)*((1/rre(i))^2)*(rat);% 分解的Fre1 向量Yata(i)=a*m*((1/rre(i)-1/Po)^2)*(rat^a);% 分解的Fre2 向量Yrerx(i)=-Yrer(i)*cos(angle_re(i));%angle_re(i)=Y(i+1)Yrery(i)=1*Yrer(i)*sin(angle_re(i));Yatax(i)=Yata(i)*cos(angle_at);%angle_at=Y(1)Yatay(i)=Yata(i)*sin(angle_at);elseYrer(i)=m*(1/rre(i)-1/Po)*((1/rre(i))^2)*Rat;% 分解的Fre1 向量Yata(i)=a*m*((1/rre(i)-1/Po)^2)*rat;% 分解的Fre2 向量Yrerx(i)=Yrer(i)*cos(angle_re(i));%angle_re(i)=Y(i+1)Yrery(i)=Yrer(i)*sin(angle_re(i));Yatax(i)=Yata(i)*cos(angle_at);%angle_at=Y(1)Yatay(i)=Yata(i)*sin(angle_at);endendend%判断距离是否在障碍影响范围内
end
Yrerxx=sum(Yrerx);% 叠加斥力的分量
Yreryy=sum(Yrery);
Yataxx=sum(Yatax);
Yatayy=sum(Yatay);

三、运行结果

四、备注

版本:2014a

【路径规划】基于matlab改进的人工势场算法机器人避障路径规划【含Matlab源码 1151期】相关推荐

  1. 多机器人编队人工势场法协同避障算法原理及实现

    多机器人编队(二)多机器人编队人工势场法协同避障算法原理及实现 避障算法原理 避障算法仿真 多机器人协同编队需要将理论和实践紧密地结合起来,其应用包括编队队形生成.保持.变换和路径规划与避障等等都是基 ...

  2. 【Matlab语音隐写】DCT+DWT音频数字水印嵌入提取【含GUI源码 836期】

    一.代码运行视频(哔哩哔哩) [Matlab语音隐写]DCT+DWT音频数字水印嵌入提取[含GUI源码 836期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1 ...

  3. 【路径规划】基于matlab GUI粒子群算法机器人避障路径规划(手动设障)【含Matlab源码 924期】

    ⛄一.简介 1 粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation).源于对鸟群捕 ...

  4. 【路径规划】基于matlab A_star算法机器人避障最短路径规划【含Matlab源码 2295期】

    ⛄一.A_star算法简介 1 A Star算法及其应用现状 进行搜索任务时提取的有助于简化搜索过程的信息被称为启发信息.启发信息经过文字提炼和公式化后转变为启发函数.启发函数可以表示自起始顶点至目标 ...

  5. 【路径规划】粒子群算法机器人避障路径规划【含GUI Matlab源码 923期】

    ⛄一.简介 1 粒子群算法的概念 粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation).源于对鸟群捕 ...

  6. 路径规划算法3 改进的人工势场法(Matlab)

    目录 传统人工势场 引力势场 斥力势场 合力势场 传统人工势场法存在的问题 改进的人工势场函数 Matlab代码实现 参考链接: [1]朱伟达. 基于改进型人工势场法的车辆避障路径规划研究[D]. 江 ...

  7. 【APF三维路径规划】基于matlab人工势场算法无人机三维路径规划【含Matlab源码 168期】

    一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[三维路径规划]基于matlab人工势场算法无人机三维 ...

  8. matlab人工势场法三维演示图,运动规划入门 | 5. 白话人工势场法,从原理到Matlab实现...

    如何利用人工势场进行运动规划? 1.1 引力势场(Attractive Potential Field) 人工势场这个特殊的势场并不是一个单一的场,其实它是由两个场叠加组合而成的,一个是引力场,一个是 ...

  9. 【Matlab路径规划】改进的遗传算法机器人避障路径规划【含GUI源码 703期】

    一.代码运行视频(哔哩哔哩) [Matlab路径规划]改进的遗传算法机器人避障路径规划[含GUI源码 703期] 二.matlab版本及参考文献 1 matlab版本 2014a 2 参考文献 [1] ...

  10. 人工势场算法 Matlab版源码

    人工势场算法,用于路径规划 main.m程序 %初始化车的参数 Xo=[0 0];%起点位置 k=15;%计算引力需要的增益系数 K=0;%初始化 m=5;%计算斥力的增益系数,都是自己设定的. Po ...

最新文章

  1. 英伟达A100可达V100的3.5倍?
  2. mariadb mysql同步_CentOS7安装配置MariaDB(mysql)数据主从同步
  3. cmd 220 ftp 远程主机关闭连接_针对一些弱口令漏洞的解决办法——设置远程管理登录的配置...
  4. SSM中 出现错误 Could not open ServletContext resource [/WEB-INF/dispatcherServlet-servlet.xml]
  5. java cv bgr2gray_CV_BGR2GRAY vs CV_GRAY2BGR | 学步园
  6. node.js微博案例第二讲
  7. WebWork配置文件详解
  8. JSP页面处理和输出
  9. matlab边的介数,matlab-bgl-master 复杂网络工具包,便于计算 边介数,最短路径等问题 261万源代码下载- www.pudn.com...
  10. 数控机床通信协议汇总
  11. STM32f1之光敏电阻传感器实验
  12. 超图神经网络 Hypergraph Neural Networks
  13. linux安装eclipse教程,Linux下的Eclipse安装
  14. 蓝牙 - 被高通收购的CSR的一颗蓝牙芯片
  15. 对往届软件工程的思考——写在软件工程开课之际 by 姜健
  16. WePhone网络电话灰色运营?专家:若无许可属非法
  17. 如何浏览自己的新浪微博图床
  18. 使用KlipC避开平台扫止损,控制止盈和延迟订单成交
  19. Django中的url路由机制------学习mooc中《Python云端系统开发入门》
  20. 监理教程知识点精讲之行业信息化的主要模式

热门文章

  1. linux spi驱动开发学习-----spidev.c和spi test app
  2. 【九天教您南方cass 9.1】 08 绘制等高线及对其处理
  3. Android学习笔记---常用技巧(图片的旋转)
  4. 1811114每日一句
  5. 扇贝有道180913每日一句
  6. 《行为科学统计7e(Statistics for the Behavioral Sciences 10e)》 Introduction to Statistics
  7. Atitit 数据库核心技术index索引技术 btree hash lsm fulltxt目录1.1. HASH
  8. Atitit Hadoop的MapReduce的执行过程、数据流的一点理解。 目录 1. Why 为什么使用hadoop 1 2. Hadoop的MapReduce的执行过程 1 2.1. Had
  9. Atitit opencv3.0  3.1 3.2 新特性attilax总结
  10. Atitit 会话层和表示层的异同