RRT路径规划算法

RRT路径规划算法

最近读的论文有讲到关于RRT算法,现在搬运一下网上看到的一些知识。
这部分转载自:http://www.cnblogs.com/21207-iHome/p/7210543.html

以及: https://www.cnblogs.com/flyinggod/p/8727951.html

首先传统的路径规划算法有一下这么几个
人工势场法、模糊规则法、遗传算法、神经网络、模拟退火算法、蚁群优化算法等。但这些方法都需要在一个确定的空间内对障碍物进行建模,计算复杂度与机器人自由度呈指数关系,不适合解决多自由度机器人在复杂环境中的规划。
。基于快速扩展随机树(RRT / rapidly exploring random tree)的路径规划算法,通过对状态空间中的采样点进行碰撞检测,避免了对空间的建模,能够有效地解决高维空间和复杂约束的路径规划问题。该方法的特点是能够快速有效地搜索高维空间,通过状态空间的随机采样点,把搜索导向空白区域,从而寻找到一条从起始点到目标点的规划路径,适合解决多自由度机器人在复杂环境下和动态环境中的路径规划。与PRM类似,该方法是概率完备且不最优的。

RRT是一种多维空间中有效率的规划方法。它以一个初始点作为根节点,通过随机采样增加叶子节点的方式,生成一个随机扩展树,当随机树中的叶子节点包含了目标点或进入了目标区域,便可以在随机树中找到一条由从初始点到目标点的路径。

伪代码

function BuildRRT(qinit, K, Δq)
    T.init(qinit)
    for k = 1 to K
        qrand = Sample()  -- chooses a random configuration
        qnearest = Nearest(T, qrand) -- selects the node in the RRT tree that is closest to qrand
        if  Distance(qnearest, qgoal) < Threshold then
            return true
        qnew = Extend(qnearest, qrand, Δq)  -- moving from qnearest an incremental distance in the direction of qrand
        if qnew ≠ NULL then
            T.AddNode(qnew)
    return false
 
 
function Sample() -- Alternatively,one could replace Sample with SampleFree(by using a collision detection algorithm to reject samples in C_obstacle
    p = Random(0, 1.0)
    if 0 < p < Prob then
        return qgoal
    elseif Prob < p < 1.0 then
        return RandomNode()

初始化时随机树T只包含一个节点:根节点qinit。首先Sample函数从状态空间中随机选择一个采样点qrand(4行);然后Nearest函数从随机树中选择一个距离qrand最近的节点qnearest(5行);最后Extend函数通过从qnearest向qrand扩展一段距离,得到一个新的节点qnew(8行)。如果qnew与障碍物发生碰撞,则Extend函数返回空,放弃这次生长,否则将qnew加入到随机树中。重复上述步骤直到qnearest和目标点qgaol距离小于一个阈值,则代表随机树到达了目标点,算法返回成功(6~7行)。为了使算法可控,可以设定运行时间上限或搜索次数上限(3行)。如果在限制次数内无法到达目标点,则算法返回失败。
为了加快随机树到达目标点的速度,简单的改进方法是:在随机树每次的生长过程中,根据随机概率来决定qrand是目标点还是随机点。在Sample函数中设定参数Prob,每次得到一个0到1.0的随机值p,当0<p<Prob的时候,随机树朝目标点生长行;当Prob<p<1.0时,随机树朝一个随机方向生长。

这里提供了github中的RRT C++实现
github源码:https://github.com/longjianquan/add--planner

ROS实现:https://blog.youkuaiyun.com/ljq31446/article/details/78867011

### RRT路径规划算法原理及实现 #### 算法原理 Rapidly-exploring Random Tree (RRT) 是一种用于解决路径规划问题的概率完备算法。其核心思想是通过在状态空间中随机采样来构建一棵树,这棵树逐渐扩展直到连接起始点和目标点。每次迭代时,RRT会选择一个随机点,并尝试从现有树中找到离这个随机点最近的节点,然后朝向该随机点生长一步,形成新的分支[^1]。 - **初始化**:设定起点为初始树中的唯一节点。 - **随机采样**:在配置空间内随机选择一个点作为探索方向。 - **最近邻查找**:寻找当前树上距离随机点最近的节点。 - **扩展树**:从最近邻节点向随机点移动固定步长或至多到达随机点的位置,创建新节点并加入树中。 - **检查连接**:如果新生成的边能够到达目标区域,则完成规划;否则继续循环直至满足终止条件[^2]。 #### 实现方法 为了具体实现RRT算法,需要考虑几个关键步骤: - **定义环境**:确定机器人的工作空间以及障碍物布局。 - **碰撞检测**:确保生成的新边不会与任何障碍物发生碰撞。 - **数据结构**:使用适当的数据结构存储树的信息,比如KD-Tree来加速最近邻搜索过程。 - **终点判断**:当树接近目标位置到一定程度时停止搜索。 下面是一个简化的Python伪代码示例,展示了如何实现基本的RRT算法: ```python def rrt_planning(start, goal, env): tree = {start} while True: rand_point = sample_free() # 在自由空间内随机取点 nearest_node = find_nearest(tree, rand_point) # 找出树中最接近rand_point的节点 new_node = steer(nearest_node, rand_point) # 从nearest_node向rand_point延伸一步 if not is_collision(new_node, nearest_node, env): # 检查是否与障碍物相撞 add_child(tree, new_node) # 将new_node添加进树 if is_reached(new_node, goal): # 判断是否抵达目标附近 break return get_path(tree, start, goal) # 返回从start到goal的路径 ``` #### 改进措施 尽管RRT算法可以快速地覆盖大部分状态空间,但它存在一些缺点: - 路径可能不是最优解,且带有棱角不够平滑。 - 随机性导致结果不稳定,多次运行会产生不同的路径。 - 对于狭窄通道的处理能力较弱。 因此,在实际应用中通常会对基础RRT进行改进,例如引入偏向策略以增加对未探索区域的关注度、采用双向搜索提高效率或者结合其他优化技术对最终路径进行平滑处理[^3]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值