路径规划——RRT、RRT*、RRT-Connect算法说明

1. RRT 伪代码

RRT 的目标是在状态空间中随机采样并扩展树结构,直到找到连接起点和终点的路径。

RRT(Rapidly-exploring Random Tree,快速随机扩展树)是一种用于解决运动规划问题的采样算法。它通过随机采样的方式,逐步构建一棵树,直到找到一条从起始状态到目标状态的路径。RRT算法的主要步骤包括:

  1. 初始化:选择一个起始点作为树的根节点。
  2. 采样:在状态空间中随机采样一个点。
  3. 寻找最近节点:在已有的树中找到离采样点最近的节点。
  4. 扩展:从最近节点向采样点方向扩展一定距离,形成一个新的节点,如果这个新节点不与障碍物碰撞,就将其加入到树中。
  5. 连接:检查新节点是否与目标点足够接近,如果是,则认为找到了一条路径。
  6. 迭代:重复上述过程,直到找到路径或达到迭代次数限制。
初始化树T,起始节点xstart
while (未达到迭代次数且未找到目标) {
    xrand = 随机采样状态空间中的点;
    xnear = T中离xrand最近的节点;
    xnew = 从xnear向xrand方向扩展得到的新节点;
    if (xnew与障碍物没有碰撞) {
        将xnew添加到树T中;
        if (xnew接近目标) {
            返回从xstart到xnew的路径;
        }
    }
}

2. RRT* 伪代码

RRT* 是对 RRT 的优化,它在构建树的过程中尝试寻找最优路径。 每次添加新节点时,它会重新检查并优化节点间的连接,以保证路径是最短的。可以理解为将原本可能比较迂回的路径改为更加直接和顺畅的路径。

  1. 初始化:选择一个起始点作为树的根节点,并设置一些算法参数,如最大迭代次数、路径优化的阈值等。

  2. 迭代过程:重复以下步骤,直到达到最大迭代次数或找到目标点: a. 在状态空间中随机采样一个点。 b. 找到树中离采样点最近的节点。 c. 尝试从最近节点向采样点扩展,生成一个新的节点。 d. 如果新节点与障碍物发生碰撞,则丢弃该节点并返回步骤a。 e. 如果新节点有效,将其添加到树中。

  3. 路径优化:对于新添加的节点,检查树中是否存在其他节点可以通过连接到新节点来获得更优的路径。如果存在,更新这些节点的父节点为新节点,从而优化路径。

  4. 目标检查:每次添加新节点后,检查该节点是否接近目标点。如果足够接近,则认为找到了一条可行的路径。

  5. 终止条件:当达到最大迭代次数或找到一条接近目标的路径时,算法终止。

初始化树T,起始节点xstart
while (未达到迭代次数且未找到目标) {
    xrand = 随机采样状态空间中的点;
    xnear = T中离xrand最近的节点;
    xnew = 从xnear向xrand方向扩展得到的新节点;
    if (xnew与障碍物没有碰撞) {
        将xnew添加到树T中;
        执行重连操作以优化树T;
        if (xnew接近目标) {
            返回从xstart到xnew的路径;
        }
    }
}

3. RRT-Connect 伪代码

RRT-Connect 是对 RRT 的一种改进,通过同时扩展两棵树(从起点和终点分别扩展),并尝试连接这两棵树,从而加速路径的找到过程。

  1. 初始化:创建两个树,一个以起始点为根,另一个以目标点为根。
  2. 采样:为两棵树分别随机采样点。
  3. 扩展:从每棵树中最近的节点向采样点方向扩展新节点。
  4. 碰撞检测:检查新节点是否与障碍物碰撞。
  5. 添加节点:如果新节点有效,则添加到相应的树中。
  6. 连接检查:如果两棵树的节点彼此接近到一定距离,认为两棵树已经连接,算法终止。
  7. 迭代:重复步骤2-6,直到两棵树连接或达到迭代次数。
初始化起始点树T1,起始节点xstart,目标点树T2,目标节点xgoal
while (未达到迭代次数且两棵树未连接) {
    xrand1 = 随机采样状态空间中的点;
    xnear1 = T1中离xrand1最近的节点;
    xnew1 = 从xnear1向xrand1方向扩展得到的新节点;
    if (xnew1与障碍物没有碰撞) {
        将xnew1添加到树T1中;
    }
    xrand2 = 随机采样状态空间中的点;
    xnear2 = T2中离xrand2最近的节点;
    xnew2 = 从xnear2向xrand2方向扩展得到的新节点;
    if (xnew2与障碍物没有碰撞) {
        将xnew2添加到树T2中;
    }
    if (xnew1和xnew2足够接近) {
        返回连接两棵树的路径;
    }
}

总结

  • RRT 是一种快速的路径规划方法,通过随机采样不断扩展树,适用于复杂环境中的初步路径搜索。
  • RRT* 是 RRT 的优化版本,强调寻找最优路径,在每次扩展时对路径进行修正和优化。
  • RRT-Connect 通过双树结构加速路径找到过程,是效率更高的版本,尤其适用于目标点比较远的情况。
### RRTRRT* 和 RRT_Connect 算法的差异 #### RRT (Rapidly-exploring Random Tree) RRT是一种基础性的路径规划算法,主要特点是能够在高维空间中高效探索未知区域。该算法通过在配置空间内随机选取样本点并逐步构建一棵由初始位置出发的成长树来实现这一点。每当新增加一个节点时,会检查是否存在通往目标的位置的可能性,并且遵循一定的步长限制以确保每一步都是合理的[^4]。 ```python def rrt_algorithm(start, goal, obstacles): tree = {start} while True: random_point = sample_random_point() nearest_node = find_nearest(tree, random_point) new_node = extend_towards(nearest_node, random_point) if not collide(new_node, obstacles): add_to_tree(tree, new_node) if close_enough(new_node, goal): break return reconstruct_path(tree, start, goal) ``` #### RRT* RRT*作为RRT的一个改进版本,在保持原有特性的同时引入了优化机制。这意味着当新节点被加入到生长中的树里时,不仅考虑如何最接近随机选定点,还会评估现有路径的成本以便调整已有的分支使之更优。这种策略使得最终得到的结果不仅是可行解而且尽可能趋向于全局最优解[^3]。 ```python def rrt_star_algorithm(start, goal, obstacles): tree = {start: None} # key is node, value is parent for _ in range(max_iterations): random_point = sample_random_point() nearest_node = find_nearest(tree.keys(), random_point) new_node = steer(nearest_node, random_point) if not collide_segment(new_node, nearest_node, obstacles): near_nodes = get_nearby_points(tree.keys(), new_node) best_parent = choose_best_parent(near_nodes, new_node, obstacles) connect_and_update_costs(best_parent, new_node, tree) rewire_neighbors(near_nodes, new_node, tree) if close_enough(new_node, goal): final_path = backtrack_from_goal(tree, goal) return final_path or [] ``` #### RRT-Connect 不同于前两者单向增长的方式,RRT-Connect采用了双向搜索的方法——即同时从起点和终点各自建立一颗快速扩张随机树并向对方靠拢直到两棵树成功交汇形成完整的路径解决方案。这种方法显著提高了收敛速度特别是在面对遥远的目标或是狭窄通道等问题场景下表现尤为突出[^1]。 ```python def rrt_connect_algorithm(start, goal, obstacles): forward_tree = {start: None} backward_tree = {goal: None} success = False while not success and len(forward_tree) < max_attempts: q_rand = sample_free_space(obstacles) q_new_forward = grow_rrt(q_rand, forward_tree, obstacles) if q_new_forward is not None: forward_tree[q_new_forward] = closest_in_tree(forward_tree, q_rand) q_new_backward = grow_rrt(q_new_forward, backward_tree, obstacles) if q_new_forward else None if q_new_backward is not None: backward_tree[q_new_backward] = closest_in_tree(backward_tree, q_new_forward) if can_connect(q_new_forward, q_new_backward, obstacles): path = combine_paths(forward_tree, backward_tree, q_new_forward, q_new_backward) success = True return path if success else None ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值