算法 | 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM