240
笔下虽有千言,胸中实无一策

算法 | 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
posted @ 2020-03-14 05:43  CasperWin  阅读(1263)  评论(0编辑  收藏  举报