zoukankan      html  css  js  c++  java
  • 算法 | Rapidly Exploring Random Tree (RRT) and RRT*

    Rapidly-exploring Random Tree

    什么是RRT算法?

    根据RRT的提出者 Steve LaValle的描述, RRT是用来做motion planning。对于机器人,给定一个初始状态(q_{init}),和一个活动区域(C),我们可以建立一个树状结构(G)来探索如何在(C)中活动,并最终到达目的地。

    它具有以下几个属性:

    • single-query planning algorithm
    • probabilistically complete

    假设当前共有个(K)顶点(vertex)。那么RRT可以表示为以下流程

    BUILD_RRT((q_{init},K,Delta q))
    1 G.init(qinit);
    2 for k = 1 to K
    3 (q_{rand} leftarrow ;)RAND_CONF();
    4 (q_{near} leftarrow ;)NEAREST_VERTEX(qrand,G);
    5 (q_{new} leftarrow ;)NEW_CONF((q_{near},Delta q));
    6 G.add_vertex(qnew);
    7 G.add_edge(qnear,qnew);
    8 End
    9 Return G

    这里有几个很有技巧的步骤:

    • 第3步中随机地选了一个新的状态,这个状态很可能是无法到达的,比如随机数选取到了墙壁中的一个点,所以需要一个算法来排除这些无法到达的点。
    • 第4步中找了现有树上离随机点最近的点,所以需要定义在上的距离函数,用这个函数来决定哪个点最近。对于二维或三维的欧式空间距离函数可以用欧式空间距离表示,但是对于高维,尤其是configuration space,这个时候并没有直观的距离函数。
    • 第5步中把沿着的方向移动了。同样如何选取,以及如何定义“方向”,都有特殊的技巧。

    大家使用RRT的原因,很多时候是因为机器人只能知晓自己周围一定距离内的信息,或者是机器人只能分段设计自己的行为,而无法一次直接找出到目的地的路线。所以机器人把整个问题分成了在短距离内,一次只设计一小段路径,最后把这些路径连起来就得到了到达目的地的路径。

    RRT的应用场合非常多,在无人车上,或者一个机械臂需要在有障碍物的环境中运动时,RRT都是常用算法。

    RRT有很多变形。比如可以想象如果空间(C)的维度特别高,那么第三步中的随机抽样需要进行非常多次才能覆盖整个空间。所以有人考虑把高维空间投影到低维来取样。另外RRT不保证找到的路径是最优的,所以Sertac Karaman提出了RRT*,可以保证趋近于最优解。

    参考:

    参考

    • 《Principles of Robot Motion: Theory, Algorithms and Implementations》7.2.2 Rapidly-Exploring Random Trees
  • 相关阅读:
    CF238B Boring Partition
    CF1424G Years
    CF995D Game
    CF468C Hack it!
    CF1417A Copy-paste
    CF1417B Two Arrays
    CF849B Tell Your World
    [洛谷P3389][模板]高斯消元法
    CF1225D
    P6687
  • 原文地址:https://www.cnblogs.com/casperwin/p/12487077.html
Copyright © 2011-2022 走看看