首页 > 编程语言 >路径规划——RRT、RRT*、RRT-Connect算法说明

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

时间:2024-10-16 22:46:34浏览次数:8  
标签:采样 迭代 路径 算法 Connect xnew RRT 节点

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 通过双树结构加速路径找到过程,是效率更高的版本,尤其适用于目标点比较远的情况。

标签:采样,迭代,路径,算法,Connect,xnew,RRT,节点
From: https://blog.csdn.net/weixin_56773716/article/details/142769456

相关文章

  • 机器学习篇-day08-聚类Kmeans算法
    一.聚类算法简介概念无监督学习算法根据样本之间的相似性,将样本划分到不同的类别中;不同的相似度计算方法,会得到不同的聚类结果,常用的相似度计算方法有欧式距离法。聚类算法的目的是在没有先验知识的情况下,自动发现数据集中的内在结构和模式。使用不同的聚类准则,产生的......
  • 【面试经验】美团搜索推荐算法工程师面经(已OC)
    一共只面了两轮,9.3一面,9.9二面,没有HR面,9.20OC一面/技术面2024/9/3晚上20:00-21:00自我介绍腾讯实习介绍实习过程中做的比较好的部分有哪些华为框架以及NPU使用过程中遇到的问题LongLoRA和LoRA区别大模型和推荐你觉得有哪些可结合的点?商品的理解、描述等介绍快手......
  • 【面试经验】美团 大模型算法工程师 一面面经
    预训练数据收集流程隐私过滤是怎么做的怎么用OCR算法解决读取pdf公式语料以及双栏pdf的问题预训练数据集构建中的亮点数据质量评估方式垂域评测集的构建方式微调评测集是怎么做的,全参微调还是lora,lora原理图文模型是怎么做的没有八股,coding是旋转图像和编辑距离二选......
  • 【面试经验】美团搜推算法日常(已oc)
    一面手撕重排链表,k个最小元素秒了,面试官后续引导我大根堆优化,没get到,说没关系前面的算我做出来了论文环节,问的不细,大体问了下思路SGD、AdaGrad、Adam的区别,各自适用场景用过什么损失函数实际用过什么attention:GAT,targetattention和selfattention结束后马上电话......
  • 软考15——算法
    算法的特性文老师软考教育◆算法(Algorithm)是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。此外,一个算法还具有下列5个重要特性。(1)有穷性。一个算法必须总是(对任何合法的输入值)在执行有穷步之后结束,且每一步都可在有穷时间内完成。(2)确定性......
  • 代码随想录算法训练营 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数
    300.最长递增子序列题目链接:300.最长递增子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰最长递增子序列日期:2024-10-16想法:dp[i]表示以nums[i]结尾的最长子数列长度,需要知道i之前的j的dp[j],找到最大的dp[j],再加1,初始化都为1。Java代码如下:classSolution{pub......
  • Java算法竞赛之HashMap常用API--哈西表!
    在Java算法竞赛中,HashMap是一个非常重要的数据结构,它提供了许多有用的API来方便地进行键值对的存储、检索和更新。除了getOrDefault方法外,HashMap还有其他一些常用的API。以下是一些主要的HashMapAPI及其在算法竞赛中的常见用法:put(Kkey,Vvalue)作用:将指定的键与值放入H......
  • 代码随想录算法训练营day17| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜
    学习资料:https://programmercarl.com/0654.最大二叉树.html#算法公开课用前序遍历构造二叉树二叉搜索树的特点,其左节点的值<每个节点的值<其右节点的值,且根节点的值大于它的左子树的所有节点的值,小于它右子树的所有节点的值,其他同理。二叉搜索树的搜索和验证时不关心遍历顺序,因......
  • 算法思想——单调栈及其运用实例
    单调栈的定义单调栈是一种数据结构,它维护了一个元素序列,这个序列在栈内要么单调递增,要么单调递减。在单调栈中,新元素的插入操作会遵循特定的规则:对于单调递增栈,只有当新元素大于或等于栈顶元素时,才能将其压入栈中;对于单调递减栈,则相反,只有当新元素小于或等于栈顶元素时,才......
  • 【C++】精妙的哈希算法
    ......