路径规划(RRT)

路径规划的核心内容是:在有碰撞的环境中,规划出一条从起始点到目标点的无碰撞路径。

路径规划算法特点总结:

完备性:起始点与目标点之间有路径解存在,那么一定可以找到解,若找不到解则说明一定没有解存在;
概率完备性:是指若起始点与目标点之间有路径解存在,只要规划及搜索时间足够长,就一定能够确保找到一条路径解;
最优性:规划得到的路径在某个评价指标上是最优的 ;
渐进最优性:是指经过有限次规划迭代后得到的路径是接近最优的的次优路径,且每次迭代都是与最优路径更加接近,是一个逐渐收敛的过程。

关于路径规划算法,按照算法类型可以分为:
基于搜索的算法:其中重要包括Dijkstra算法、A算法、D算法等,这一类算法是完备且最优的;

基于采样的算法:RRT、RRT-Connect、RRT*(快速扩展随机树及其变种),PRM(构建概率路线图)等,由于采样点的随机性导致这类算法是概率完备的,规划出的路径不是最优的,只能说是规划出一条可行路径,其中RRT*算法是渐进最优的路径规划算法;

基于智能优化的算法:主要包括遗传算法、蚁群算法、粒子群算法等。这类算法是完备的但是不是最优的。

路径规划算法主要包括以上三种类型,从路径规划的速度方面来说:

RRT系列>A*>Dijkstra算法>智能优化算法

经过查阅相关文献可知,若用A算法进行路径规划,倘若存在最优路径必能找到,但是但对于高维空间的路径规划问题,A算法并不适用。RRT算法与A*算法相比,不需要对空间进行栅格化处理,无需对环境进行结构化建模,适合在高维空间进行路径规划。在这里主要对RRT算法进行简单的介绍。

RRT是一种基于随机采样的路径规划算法,在已知路径起始点和终点的前提下,随机产生一个采样点Xrand,在树上找到一个与Xrand最接近的节点Xnear,连接Xrand与Xnear,在该直线上以步长Ei得到节点Xnew作为显得树节点,以此方式进行树的扩展:

在这里插入图片描述

扩展得到下一树节点:
图片

在进行节点扩展的过程中,需要进行碰撞检测,若新的树枝即Xnear与Xnew与障碍物之间发生碰撞,则去除该条路径;
图片

按照以上流程进行搜索,直到Xnew与终点goal的距离小于小于我们所设定的某个极小值,停止搜索,直接将Xnew与终点相连,一条可行路径产生。

传统的RRT算法路径搜索效率低,且搜索到的路径不是最优路径,为了提高路径搜索效率,在传统的RRT算法的基础上提出了基于双向搜索的RRT-Connect算法,该算法是分别在起始点与目标点处同时扩展两棵树,扩展树的方式与传统的RRT算法相同,直至两棵树连接到一起,一条可行路径产生。
图片

RRT*算法通过以下两种方式对RRT算法进行改进:
父节点的重新选择

重新布线

详细介绍如下:

图片

传统的RRT算法是在产生Xnew节点后,直接将Xnear与Xnew节点连接,产生一个新的树枝;RRT*算法在这里对父节点进行了重新选择,以Xnew为圆心以R为半径进行画圆,
图片

将Xnew与圆圈内的节点Xnear、X1、X2连接起来,比较通过何种方式到达Xnew的路径消耗最短,

图片

若通过Xnear到达Xnew的的路径消耗要比通过Xnear到达X1或者通过Xnear到达X1、X2再到达Xnew的路径消耗短的话,直接将Xnear到达Xnew进行连接;
图片

以上部分实现的是RRT*算法中的父节点的重新选择部分。在重新选择完父节点之后,进行重新布线操作,重新布线操作是针对周围节点来说,是否有通过新产生的节点到达周围节点的距离消耗要比原有路径要小,以图中到达X2节点的路径来说,通过新产生的节点Xnew到达X2要比原有的路径消耗要短,那么就对原有路径进行重新布线,如下与所示:
图片

RRT*算法随着采样点的不断增加,不断优化直至找到目标点或达到最大设定循环次数;该算法随着迭代次数的不断增加,路径逐渐优化,所以该算法是一种渐进最优的路径规划算法,但是,该算法消耗时间较长,路径规划效率较低。

详细的RRT*算法的代码程序大家可以通过关注公众号获得!!
在这里插入图片描述

  • 14
    点赞
  • 88
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是MATLAB实现的路径规划RRT算法的基本步骤: 1.定义起点和目标点,并确定障碍物区域。 2.创建RRT树,将起点作为树的根节点。 3.在障碍物区域内随机生成一个点作为目标点,或者直接使用预先定义的目标点。 4.从RRT树中选择最近邻节点(NN)。 5.在NN和目标点之间生成一条路径,并检查路径是否与障碍物相交。 6.如果路径与障碍物相交,则返回步骤4,否则将路径添加到RRT树中。 7.重复步骤4-6,直到生成的路径连接起点和目标点。 下面是MATLAB代码示例: ```matlab % 定义起点和目标点 start = [0,0]; goal = [10,10]; % 定义障碍物区域 obstacle = [4,4,1; 6,6,1]; % 初始化RRT树 tree = [start, 0]; % 定义迭代次数 max_iter = 1000; for i = 1:max_iter % 随机生成一个点 q_rand = [rand()*10, rand()*10]; % 找到最近邻节点 [q_near, idx] = knnsearch(tree(:,1:2), q_rand); % 生成路径 q_new = steer(q_near, q_rand); % 检查路径是否与障碍物相交 if ~collision(q_new, obstacle) % 将路径添加到RRT树中 tree(end+1,:) = [q_new, idx]; % 如果新节点接近目标点,则直接连接目标点 if norm(q_new - goal) < 0.5 break; end end end % 从RRT树中提取路径 path = goal; while idx ~= 1 path = [tree(idx,1:2); path]; idx = tree(idx,3); end path = [start; path]; % 绘制路径和障碍物 figure; plot(path(:,1), path(:,2), 'b', 'LineWidth', 2); hold on; plot(obstacle(:,1), obstacle(:,2), 'ro', 'MarkerSize', 10, 'LineWidth', 2); xlim([0 10]); ylim([0 10]); ``` 其中,`steer(q_near, q_rand)`函数用于生成路径,`collision(q_new, obstacle)`函数用于检查路径是否与障碍物相交,`knnsearch(tree(:,1:2), q_rand)`函数用于找到最近邻节点。你需要根据自己的具体需求进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值