提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
这是路径搜索算法的第二篇,上一篇讲了广度优先,深度优先,Dijkstra、A*、D*,本篇讲述另外两种常见路径搜索算法:RRT,RRT*。
本篇尽量用简单的文字描述,帮助大家理解RRT和RRT*的原理。
一、RRT的原理
Dijkstra、A*、D*可以说都是广度优先搜索算法的变种。
A*等一系列的算法就是从起点开始,从内到外一圈一圈的扫描,直到扫描到终点为止,然后加上一些权重,一些成本之类的,让其有个大概的方向。
而RRT则是一套全新的搜索算法,它向外探索的行驶,不是规律的一圈一圈的,而是随机的。
这个是不是很神奇,因为随机的探索怎么能保证时间最优和路径最优呢?
不能!对,就是不能,RRT没法保证这些。
关于RRT的原理理解,推荐另一位博主写的文章,被誉为csdn上RRT的第一启蒙文章,写的真好,推荐大家学习过程中,将知识都理解到这个地步:RRT算法原理图解
RRT是随机探索算法,虽然只要时间足够长,总会找到一条可行路径。
但是这条路径无法保证最优,并且时间要消耗多长也有很大风险,运气好的话时间很短,运气差的话那有可能时间会长到离谱。
于是,为了解决这些问题,便有了RRT*。
二、RRT*的原理
每个讲RRT的都会先说:RRT引入了重写和重联机制。
重写:当生成一个新的节点(Xnew)时,算法会在一定范围内(通常是一个以新节点为中心的圆形或球形区域)搜索所有可能的父节点。然后,算法会选择一个使得从起点到新节点的路径成本最小的父节点作为新节点的父节点。这个过程称为重写
重联:在找到新节点的最佳父节点后,RRT*算法会检查新节点周围的邻近节点。如果通过新节点连接这些邻近节点能够降低它们的路径成本,算法会重新连接这些节点,以优化路径
原理太干了,举个例子,来说明RRT和RRT*的区别:
问题:假设在一个二维平面迷宫中,机器人需要从起点(S)到终点(G)。迷宫中有多个障碍物,需要找到一条从起点到终点的可行路径。
解答:
1.RRT算法运行
从起点出发,随机采样点,并不断扩展树,直到找到终点或达到最大迭代次数。
例如,在某次随机采样中,生成了点P1,找到距离P1最近的父节点P0,然后生成新节点P2,并连接P0和P2。然后继续这个过程,直到路径到达终点。
路径特点:路径可能比较曲折,存在许多冗余节点和无效分支。
2.RRT算法运行
同样从起点开始,但在每次生成新节点时,会引入重写和重新连接机制。
例如,当生成新节点P2时,RRT算法不仅考虑P0作为其父节点,还会在一定范围内搜索其他可能的父节点,比如P1、P3等,并选择使得路径成本最小的节点作为父节点。
在连接新节点后,算法还会检查周围节点,如P4、P5等,如果通过新节点连接能够降低这些节点的路径成本,就会重新连接它们,从而优化路径。
路径特点:路径经过优化,更加平滑,冗余节点较少,路径长度接近最优。
这个例子基本能够很好的说明RRT较RRT的改进,也说明了为什么RRT能找到最优路径。(这里说的最优路径是指在RRT*随机探索出来的路径中最优,并不是你心里想的那个“最优”。)
总结
除了上述的RRT之外,还有各种RRT的变种,包括双向RRT(RRT-Connect),加入启发函数的RRT(Informed-RRT)等等。