路径规划——搜索算法详解(三):RRT算法详解与MATLAB代码

本文介绍了Dijkstra和Floyd算法后,转向了随机采样搜索(RRT)算法。RRT在速度上有优势,适用于多自由度机器人,如机械臂。文章详细阐述了RRT的原理、流程,并提供了MATLAB仿真的例子。
摘要由CSDN通过智能技术生成

本文讲解案例来自于古月学院,该篇也是对笔者学习内容的总结,有需要的朋友可以直接跳转到课程(新人福利8节课特惠价才12!不是广告哈,大家看需求选择,可以先看我的讲解。)。

前两篇我们介绍了Djkstra算法与Floyd算法,前者解决的是从固定起点到固定终点的最短距离的问题,后者解决的是图中任意两个路径点的最短路径问题,当节点数较多时Floyd算法可能会耗费更多时间,大家看需求选择吧。不过两种算法都是广度优先搜索算法,一定能搜出全局最优路径,遇到障碍物时需要重新规划。

本篇将介绍随机采样搜索算法(RRT),相比于上述两种方法,RRT为基于采样的搜索方法,该方法能够快速搜索路径,但是由于是随机搜索生成的路径,一般不是最优的,理论上具备概率完备性,即当搜索时间足够时可以得到最优路径,这是一种时间和路径最优上的权衡。值得注意的是,如果规划的时间不够长、迭代次数太少,可能无法找出实际存在的路径。

什么时候用RRT?

其优点是搜索速度快,因此适用于多自由度机器人规划问题(如机械臂)。

一、RRT算法原理与流程

 算法流程图如下,大家可以稍微留个印象,过程很简单!

流程讲解:

1. 节点拓展流程:

起点、终点、障碍物如图1所示,此时随机采样一个点,如图2黄色点所示

在原有路径点中,找到距离采样点最近的点(由于起始路径只有起点,故起点即为最近点)。如图4所示,设定一个生长步长,以最近点与采样点的连线为采样角度,生长步长为距离,生成下一个路径点,此时判断该路径点与上一节点(起点)的连线是否与障碍物发生碰撞。当没有碰撞时将该点作为下一路径点(后面有发生碰撞时候的处理方法)。

循环以上过程,采样、寻找最近点、确定拓展方向、按照步长拓展新节点、判断是否发生碰撞、确定下一节点。

如图8-10所示,此时拓展的节点与障碍物发生了碰撞,此时丢弃此次拓展,并且重新进行采样,重复以上拓展步骤(如图11-12所示)。

2. 判断到达目标点:

由于拓展的节点直接与终点重叠的概率很小,所以当拓展到的节点距离终点在一定距离内时便认为已经搜索成功,此时只需要不断查询上一节点即可生成搜索路径(黄色折线),此时搜索完成。

二、RRT算法MATLAB仿真:

Adamaser/Path-Planning (github.com)

非常感谢您的提问!以下是我为您编写的基于栅格地图的二维路径规划算法RRT算法)的Matlab代码,希望对您有所帮助: ```matlab % 二维路径规划算法RRT算法)的Matlab代码 % 假设地图是一个50x50的栅格地图,其中1表示障碍物,0表示自由空间 % 起点坐标是(1,1),终点坐标是(50,50) % 栅格地图存储在二维矩阵map中 clear all; clc; % 初始化地图 map = zeros(50,50); % 50x50的空白地图 map(10:15, 10:15) = 1; % 障碍物 map(20:25, 20:25) = 1; % 障碍物 map(35:40, 35:40) = 1; % 障碍物 % 起点和终点 start_pos = [1,1]; end_pos = [50,50]; % RRT算法参数 max_iter = 5000; % 最大迭代次数 step_size = 2; % 步长 % 初始化RRT树 tree(1).pos = start_pos; % 根节点为起点 tree(1).parent = 0; % 根节点没有父节点 % 开始迭代 for i = 1:max_iter % 生成一个随机点 if rand < 0.1 % 有10%的概率选取终点 rand_pos = end_pos; else % 90%的概率在地图内随机选取一个点 rand_pos = [randi(50), randi(50)]; end % 找到RRT树上距离随机点最近的节点 nearest_node = 1; nearest_dist = norm(tree(nearest_node).pos - rand_pos); for j = 2:length(tree) dist_to_rand = norm(tree(j).pos - rand_pos); if dist_to_rand < nearest_dist nearest_node = j; nearest_dist = dist_to_rand; end end % 在距离随机点最近的节点和随机点之间生成一个新节点 new_pos = tree(nearest_node).pos + step_size * (rand_pos - tree(nearest_node).pos) / nearest_dist; if is_free(new_pos, map) % 如果新节点在自由空间内 new_node.parent = nearest_node; new_node.pos = new_pos; tree = [tree, new_node]; % 加入RRT树 end % 如果新节点接近终点,则检查是否有一条可行路径连接起点和终点 if norm(new_node.pos - end_pos) < step_size % 从新节点追溯到起点,得到一条路径 path = [new_node.pos]; node = length(tree); while tree(node).parent ~= 0 path = [tree(node).pos,
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值