从0开始实现RRT路径规划算法(快速扩展随机树原理+python伪代码)

一、RRT路径规划算法原理

        Rapidly-Exploring Random Trees (RRT) 路径规划算法是一种常用于机器人运动规划的算法,旨在通过随机采样和快速探索环境来生成可行路径。该算法由 Steven M. LaValle 在 1998 年提出,至今仍被广泛应用于各种机器人领域。

        RRT 算法的核心思想是通过随机采样,在自由空间中快速构建一个树形结构,以探索可能的路径。在每次迭代中,算法随机生成一个节点,并试图将该节点连接到最接近的树节点,形成一条边。通过反复迭代这一过程,不断扩展树的范围,直至达到目标状态或达到最大迭代次数为止。

1.RRT算法流程 

        在初始阶段,将起点Xstart添加到随机树的根节点。然后,在地图空间中随机采样一个坐标点作为随机点Xrand,并找到距离随机点Xrand最近的树节点Xnear。接下来,沿着从Xnear到Xrand的方向扩展一个给定的步长\varepsilon,得到新节点Xnew。

        新节点Xnew的生成分为两种情况:(1)如果Xnear到Xrand的距离大于步长δ,则在Xnear到Xrand的方向上扩展一个步长δ的位置作为Xnew;(2)如果Xnear到Xrand的距离小于等于步长δ,则直接将Xrand作为Xnew的位置。

        然后,检测新节点Xnew是否通过了碰撞检测:如果通过了碰撞检测,则将其添加到随机树的根节点中;如果未通过碰撞检测,则重新迭代以寻找新的节点。

        接着,判断新节点Xnew是否在目标点Xgoal的阈值范围内,若是,则返回根节点,路径规划完成。

  2.RRT算法路径规划过程图

    二、RRT算法伪代码

获取随机节点的代码为:

 def generate_random_node(self):
        delta = self.utils.delta   #delta为机器人半径大小,从而考虑路径宽度,避免与障碍物碰撞
        return Node((np.random.uniform(self.x_range[0] + delta, self.x_range[1] - delta),
                         np.random.uniform(self.y_range[0] + delta, self.y_range[1] - delta)))     #x_range和y_range为地图长宽大小

       

 获取临近点的代码为:

@staticmethod
    def nearest_neighbor(node_list, n):     # node_list为随机树中的全部节点信息,n为随机点
        return node_list[int(np.argmin([math.hypot(nd.x - n.x, nd.y - n.y)
                                        for nd in node_list]))]

获取新节点的代码为:

    def new_state(self, node_start, node_end):
        dist, theta = self.get_distance_and_angle(node_start, node_end)     #node_start为临近点, node_end为随机点。 dist, theta分别为临近点向随机点的距离和角度

        dist = min(self.step_len, dist)    #self.step_len为扩展步长,找出扩展步长和两点距离的最小值
        node_new = Node((node_start.x + dist * math.cos(theta),
                         node_start.y + dist * math.sin(theta)))   #获得新节点
        node_new.parent = node_start     #将临近点作为新节点的父节点,用以通过父节点,反向找到路径

        return node_new

@staticmethod
    def get_distance_and_angle(node_start, node_end):
        dx = node_end.x - node_start.x
        dy = node_end.y - node_start.y
        return math.hypot(dx, dy), math.atan2(dy, dx)

新节点在目标点范围内,获得路径的代码为:

    def extract_path(self, node_end):   #node_end为在目标点范围的新节点
        path = [(self.s_goal.x, self.s_goal.y)]   #先将目标点加入path列表中
        node_now = node_end     #将该新节点作为当前节点

        while node_now.parent is not None: #判断当前节点的父节点是否存在,如果存在就执行以下内容
            node_now = node_now.parent   #将当前节点的父节点作为当前节点,目的是重复找父节点,来寻找路径点
            path.append((node_now.x, node_now.y))   #将当前节点加入path列表中

        return path   #重复以上内容,直到当前节点为起点时,没有父节点,结束循环,得到最终路径点

、RRT算法仿真结果

(1)简单环境

(2)狭窄环境

在狭窄环境下,这种算法如果没有足够的迭代次数,就很难找到路径。如上图所示。

而给了它足够的迭代次数后,虽然能找到路径,但是算法所用的迭代次数和运行时间相比于在简单环境下,无疑也是大大增加。 如上图所示。

 四、RRT算法优缺点

        从以上两种地图环境可以看出:

        RRT 算法具有几个显著的优点。首先,它适用于高维和复杂环境,能够快速生成可行路径。其次,由于采用了随机采样的策略,因此能够有效应对未知环境和动态障碍物。此外,RRT 算法还能够在运行过程中动态调整树的结构,以适应不同的环境条件。

        然而,RRT 算法也存在一些局限性。由于其随机性质,算法在生成新节点时没有目标引导性,导致算法随机性较强。另外,算法在搜索过程中对空间的搜索范围较大,这样无疑是在浪费运行的计算量和运行时间。还要考虑的是,随机点引导的新节点所生成的路径可能不够优化,导致路径长度较长或存在不必要的曲折。此外,在某些情况下,算法可能会陷入局部最优解,无法找到全局路径,致使算法规划路径成功率较低。

  • 38
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
RRT快速随机扩展算法的一种路径规划方法,其主要目的是在高维状态空间中找到一条能够避开障碍物的路径。使用MATLAB可以很方便地实现RRT算法,并得到最优路径规划结果。 首先,我们需要定义状态空间的边界和障碍物信息,以及起点和终点的位置。然后,我们可以编写RRT算法的MATLAB代码,主要分为两个部分:扩展和路径回溯。 在扩展过程中,我们随机生成一个节点,并计算与当前中已有节点的距离,选择最近的节点作为父节点,然后在父节点和新节点之间进行插值,判断连线是否与障碍物相交,如果不相交,则将新节点加入中。不断重复这个过程,直到生成终点附近的节点,并连接起始节点和终点。 在路径回溯过程中,我们从终点开始向起点回溯,寻找到连接所有父节点的路径,得到最优路径规划结果。 下面是MATLAB的RRT路径规划代码示例: ```MATLAB function [path] = RRT(start, goal, obstacles, iterations) tree = [start]; % 初始化,起点为根节点 path = []; for i = 1:iterations random_node = [rand()*100, rand()*100]; % 随机生成新节点 nearest_node = FindNearestNode(random_node, tree); % 找到最近的节点 new_node = Steer(nearest_node, random_node); % 在最近的节点和新节点之间插值 if ~CheckCollision(nearest_node, new_node, obstacles) % 判断连线是否与障碍物相交 tree = [tree; new_node]; % 将新节点加入中 if norm(new_node - goal) < 2 % 如果新节点接近终点 path = FindPath(tree, new_node); % 回溯路径 break; end end end end ``` 以上是RRT路径规划算法的简单实现,通过这段MATLAB代码可以实现RRT算法的基本路径规划功能。在实际应用中,可以根据具体需求对算法进行优化和改进。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值