首页 > 编程语言 >路径规划算法(1)

路径规划算法(1)

时间:2024-07-08 19:30:51浏览次数:10  
标签:结点 势场 路径 目标 算法 规划 节点

传统路径规划算法

 

      

 

1、BUG避障算法

Bug算法大概是人们能想象到的最简单的避障算法。其基本思想是机器人在路途中,跟踪各障碍物的轮廓,从而绕开它。

BUG算法十分简单,就像虫子在黑盒中的移动一样,这种规划没有全局路径规划,只有局部路径规划。

根据规则的不同分为BUG0,BUG1,BUG2。

1.1、BUG0算法

规则1:超目标点径直移动

规则2:沿着障碍物边缘移动

遇到障碍物,则用规则2,其它时刻皆用规则1

                  

 1.2、BUG1算法

规则1:超目标点径直移动

规则2:跟随障碍物的边缘,完全地围绕障碍物

规则3:从距离目标最短距离的点离开,然后再径直朝目标点移动

这种方法效率很低,但是可保证机器人会到达任何可达的目标。

                

 1.3、BUG2算法

规则1:超目标点作直线,径直移动

规则2:跟随障碍物的边缘,直道遇到规则1所做直线和障碍物的交点为止

                 

 2、A*算法及Dijkstra算法

A*算法是一种包含了启发的Djkstra算法,可以用来求带权值的图的最短路径。

A*算法比起Djkstra算法,在寻找最短路径的问题上更加有效率。

       

算法中,引入了距离作为启发,通过终点和节点的距离计算,选择迭代的点。

通常求距离有以下几种方案:

1. 曼哈顿距离

h = abs (current_cell.x – goal.x) + 
     abs (current_cell.y – goal.y) 

         

2、对角线距离 

 h = max { abs(current_cell.x – goal.x),
           abs(current_cell.y – goal.y) } 

     

       3、欧式距离

h = sqrt ( (current_cell.x – goal.x)2 + 
            (current_cell.y – goal.y)2 ) 

   

 3、Dijkstra算法

Dijkstra算法的基本思想是贪心思想,主要特点是以起始点为中心向外层层扩展,直到扩展到目标点为止。Dijkstra算法在扩展的过程中,都是取出未访问结点中距离该点距离最小的结点,然后利用该结点去更新其他结点的距离值。 

Dijkstra算法流程:

1. 将初始点s放入到集合S中,初始时集合S中只有s;
2. 无自环的初始点s到自己的最短路径为0;
3. For(目标点ei不在集合S中):
4. 计算集合S中以外的所有结点到集合S中结点的最短距离,即从s出发,到达所有结点且只允许通过初始点s的最短路径。如果没有直达的通路,那么就设置为无穷,意味着暂时到达不了的结点。
5. While(集合V-S不是空集):
6. 选出第一次for循环之后在集合V-S中,且相对于集合S的最短路径中距离最短的目标点ej。
7. 将该目标点ej并入到集合S中。
8. 将目标点ej并入集合S之后会对V-S以外的顶点相对于集合S的最短路径长度产生影响。
9. For(更新S中的结点路径)
10. If(dist[s,ej]+wj,i < dist[s,ei])
11. dist[s,ei] = dist[s,ej]+wj,i

注:该算法不允许图中存在负权边。

优点:

1)如果最优路径存在,那么一定能找到最优路径

缺点:

1)有权图中可能是负边

2)扩展的结点很多,效率低

4、A*算法

 A*算法是将Dijkstra算法与广度优先搜索算法(BFS)二者结合而成,通过借助启发式函数的作用,能够使该算法能够更快的找到最优路径。A*算法是静态路网中求解最短路径最有效的直接搜索方法。

A*算法的启发式函数:f(n)=g(n)+h(n)

f(n)表示结点的综合优先级,在选择结点时考虑该结点的综合优先级;

g(n)表示起始点到当前结点的代价值;

h(n)表示当前结点到目标点的代价估计值,启发式函数。

当h(n)趋近于0时,此时算法退化为Dijkstra算法,路径一定能找到,但速度比较慢;当g(n)趋近于0时,算法退化为BFS算法,不能保证一定找到路径,但速度特别快。我们可以通过调节h(n)的大小来调整算法的精度与速度。

 在A*算法中,采用最多的是欧几里得距离,即dist = srqt((y2-y1)2+(x2-x1)2)。

A*算法流程:

1. 将起始点s加入到开启列表openlist中
2. 重复以下过程:
a) 遍历开启列表openlist,寻找F值最小的结点,并将其作为当前要处理的结点
b) 将要处理的结点移到关闭列表closelist
c) 对当前结点的8个相邻结点的每个结点:
i. 如果他是不可抵达的或者已经在关闭列表closelist中,忽略;
ii. 如果他不在开启列表openlist中,将其加入openlist,并把当前结点设置为其父节点,记录当前结点的F、G、H值;
iii. 如果他已经在开启列表openlist中,检查这条路径(即经由当前结点到达相邻结点)是否更好,用G值做参考,更小的G值表示这个更好的路径,如果是这样,将其父节点设置为当前结点,并重新计算他的G值和F值,如果开启列表openlist是按F值进行排序,改变后需要重新排序。
d) 停止,当
i. 终点加入到了开启列表openlist中,此时路径已经找到
ii. 查找重点失败,并且开启列表openlist中是空的,此时没有路径
3. 保存路径,从终点开始,每个结点沿着其父节点移动直到起点。 

优点:

1)利用启发式函数,搜索范围小,提高了搜索效率

2)如果最优路径存在,那么一定能找到最优路径

缺点:

1)A*算法不适用于动态环境

2)A*算法不太适合于高维空间,计算量大

3)目标点不可达时会造成大量性能消耗

 5、D*算法

A*算法适用于在静态路网中寻路,在环境变化后,往往需要replan,由于A*不能有效利用上次计算的信息,故计算效率较低。D*算法由于储存了空间中每个点到终点的最短路径信息,故在重规划时效率大大提升。A*是正向搜索,而D特点是反向搜索,即从目标点开始搜索过程。在初次遍历时候,与Dijkstra算法一致,它将每个节点的信息都保存下来。

D*算法流程:

1. 先用Dijkstra算法从目标节点G向起始节点搜索。储存路网中目标点到各个节点的最短路和该位置到目标点的实际值h,k(k为所有变化h之中最小的值,当前为k=h)原OPEN和CLOSE中节点信息保存。
2. 机器人沿最短路开始移动,在移动的下一节点没有变化时,无需计算,利用上一步Dijkstra计算出的最短路信息从出发点向后追述即可,当在Y点探测到下一节点X状态发生改变,如堵塞。机器人首先调整自己在当前位置Y到目标点G的实际值h(Y),h(Y)=X到Y的新权值C(X,Y)+X的原实际值h(X)。X为下一节点(到目标点方向Y->X->G),Y是当前点。K值取h值变化前后的最小。
3. 用A*或其他算法计算,这里假设用A*算法,遍历Y的子节点,放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下:用A*或者其他算法计算,这里假设用A*算法,遍历Y的子节点,放入CLOSE,调整Y的子节点a的h值,h(a)=h(Y)+Y到子节点a的权重C(Y,a),比较a点是否存在于OPEN和CLOSE中,方法如下:

while()
{
从OPEN表中取k值最小的节点Y;
遍历Y的子节点a,计算a的h值 h(a)=h(Y)+Y到子节点a的权重C(Y,a)
{
if(a in OPEN) 比较两个a的h值
if( a的h值小于OPEN表a的h值 )
{
更新OPEN表中a的h值;k值取最小的h值
有未受影响的最短路径存在
break;
}
if(a in CLOSE) 比较两个a的h值 //注意是同一个节点的两个不同路径的估价值
if( a的h值小于CLOSE表的h值 )
{
更新CLOSE表中a的h值; k值取最小的h值;将a节点放入OPEN表
有未受影响的最短路径存在
break;
}
if(a not in both)
将a插入OPEN表中; //还没有排序
}
放Y到CLOSE表;
OPEN表比较k值大小进行排序;
}

优点:

1)适用于动态环境的路径规划,搜索效率高

缺点:

1)不适用于高维空间,计算量大

2)不太适用于在距离较远的最短路径上发生变化的场景

6、人工势场法

该算法的基本思想是当机器人在周围环境中运动时,将环境设计成一种抽象的人造引力场,目标点对移动机器人产生“引力”,障碍物对移动机器人产生“斥力”,最后通过二者的合力来控制移动机器人的运动。应用人工势场法规划出来的路径一般是比较平滑并且安全的,但是存在着局部最优的问题。

利用势场函数U来建立人工势场,势场函数是一种可微函数,空间中某点处势场函数值的大小,代表了该点的势场强度。我们采用引力势场函数与斥力势场函数,用U(q)表示二者之和。

                                                                        

引力势场函数:

                                                                              

e为引力增益,p(q,qgoal)表示当前点到目标点的距离;
斥力势场函数:

                                                                        

n为斥力增益,p(q,qgoal)表示当前点到障碍物的距离,p0表示障碍物作用距离阈值。

优点:

1)规划出的路径一般是比较平滑且安全

2)人工势场法是一种反馈控制策略,具有一定的鲁棒性

缺点:

1)容易陷入局部最优的问题

2)距离目标点较远时,引力特别大,斥力相对较小,可能会发生碰撞

3)当目标点附近有障碍物时,斥力非常大,引力较小,很难到达目标点

7、PRM算法

随机路线图(PRM)算法是一种基于图搜索的算法,可以将连续状态空间转换成离散状态空间,在利用A*等搜索算法在路线图上寻找路径,提高搜索效率。PRM算法是概率完备且不是最优的算法。

PRM算法流程:

1. 初始化,设G(V,E)为一个无向图,其中顶点集V代表无碰撞的状态点,连线集E代表无碰撞的路径。初始状态为空。
2. 状态点采样,在状态空间中采样无碰撞的状态点加入到无碰撞的状态点V中。
3. 邻域计算,定义距离p,对于已经存在于无碰撞的状态点V中的点,如果他与无碰撞的点的距离小于p,则将其称作无碰撞状态点的邻域点。
4. 边线连接,将无碰撞的状态点与其邻域相连,生成连线。
5. 碰撞检测,检测连线是否与障碍物发生碰撞,如果无碰撞,则将其加入到连线集E中。
6. 结束条件,当所有采样点均已完成上述步骤后结束,否则重复2~5。

优点:

1)适用于高维空间和复杂约束的路径规划问题

2)搜索效率高,搜索速度快

缺点:

1)概率完备但不是最优

8、RRT算法

RRT算法是适用于高维空间,通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,较好的处理带有非完整约束的路径规划问题,有效的解决了高维空间和复杂约束的路径规划问题。该算法是概率完备但不是最优的算法

RRT算法以初始点qinit作为根节点,通过随机采样增加叶子节点的方式,生成一个随机扩展树,当目标点位于随机扩展树上时,能够找到一天初始点到目标点的路径。首先,需要从状态空间中随机选择一个采样点qrand,然后从随机树中选择一个距离qrand最近的结点qnearest,从qnearest向qrand扩展一个步长的距离,得到一个新的结点qnew,如果qnew与障碍物发生碰撞,则返回空;否则,将qnew加入到随机树中,重复上述步骤直到qnearest和qgoal距离小于一个阈值。

优点:

1)搜索效率比较高,搜索速度比较快

2)适用于高维空间,不会产生维度灾难的问题

3)只需对状态空间采样点进行碰撞检测,避免了对空间的建模

缺点:

1)规划出的路径质量一般,可能存在棱角、不够光滑

2)RRT算法不太适用于存在狭长空间的环境

3)规划出的路径可能不是最优路径

4)不适用于动态环境的路径规划

 

标签:结点,势场,路径,目标,算法,规划,节点
From: https://www.cnblogs.com/Zhouce/p/18290302

相关文章

  • 【算法篇】KMP算法,一种高效的字符串匹配算法
    我们今天了解一个字符串匹配算法-KMP算法,内容难度相对来说较高,建议先收藏再细品!!!KMP算法的基本概念KMP算法是一种高效的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。该算法的主要使用场景就是在字符串(也叫主......
  • Studying-代码随想录训练营day31| 56.合并区间、738.单调递增的数字、968.监控二叉树
    第31天,贪心最后一节(ง•_•)ง......
  • KMP算法实例——模式匹配
    题目描述:给定两个字符串,一个是文本串txt,另一个是模式串pat。请使用KMP算法找出模式串在文本串中的所有出现位置。示例输入:文本串 txt:"ABABDABACDABABCABAB"模式串 pat:"ABABCABAB"#include<stdio.h>#include<string.h>//计算模式串的最长公共前后缀数组voidco......
  • ACM/ICPC算法基础训练教程(2)
    关于《ACM/ICPC算法基础训练教程》这本书的一些解释与自我理解1.2枚举法1.2.1基本概念1.2.2例题讲解1.2枚举法1.2.1基本概念在某些问题中,问题的解被限制在一个有限的范围内,此类问题只需要按照题目的限定,逐一判断这些可能的解是否符合题目的要求,这种方法称为枚......
  • 代码随想录算法训练营第五天|LeetCode242.有效的字母异位词 LeetCode 349. 两个数组的
    代码随想录算法训练营Day5代码随想录|LeetCode242.有效的字母异位词LeetCode349.两个数组的交集LeetCode202.快乐数LeetCode1.两数之和文章目录代码随想录算法训练营前言代码随想录原文--哈希表今天的内容真的很有挑战o(╥﹏╥)o,做了很久一、哈希表基础理论1......
  • 代码随想录算法训联营第四天|LeetCode24. 两两交换链表中的节点 LeetCode19.删除链表
    系列文章目录代码随想录算法训练营第四天:代码随想录|LeetCode24.两两交换链表中的节点LeetCode19.删除链表的倒数第N个节点面试题02.07.链表相交LeetC142.环形链表文章目录系列文章目录前言一、LeetCode24.两两交换链表中的节点1、题目链接2、题解二、LeetCod......
  • 「代码随想录算法训练营」第五天 | 哈希表 part1
    242.有效的字母异位词题目链接:https://leetcode.cn/problems/valid-anagram/题目难度:简单文章讲解:https://programmercarl.com/0242.有效的字母异位词.html视频讲解:https://www.bilibili.com/video/BV1YG411p7BA题目状态:一次过,哈哈哈个人思路:之前在《剑指offer》中做过......
  • 24年软件设计师!看这篇就够了(规划+知识点)
    祝大家逢考必过~一,关于软考:考试时间:    一年有两次软考,一般是五月末和十一月的中旬,具体时间官网通知:中国计算机技术职业资格网中国计算机技术职业资格网https://www.ruankao.org.cn/exam/plan考试时长:        考试总时长240min      ......
  • 代码随想录算法训练营第25天 | 491.递增子序列
    491.递增子序列给定一个整型数组,你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。示例:输入:[4,6,7,7]输出:[[4,6],[4,7],[4,6,7],[4,6,7,7],[6,7],[6,7,7],[7,7],[4,7,7]]说明:给定数组的长度不会超过15。数组中的整数范围是[-10......
  • 人脸识别与美颜算法实战:基于Python、机器学习与深度学习
    代码和pdf书等:GitHub-guozhe1992/read引言与基础知识:介绍人脸识别与美颜算法的基本概念、应用场景以及Python编程和机器学习的基础知识。视频图像处理技术:详细讲解基于Anaconda和PyCharm的环境搭建,以及视频图像处理的基础技术,如图像读取、显示、保存和格式转换等。抖音特效......