機器人路徑規划其五六 RRT RRT*


RRT算法和RRT*算法是一種基於隨機采樣的路徑規划算法,其中RRT*是眾多RRT變種中比較出名的算法,RRT*解決了RRT無法得出最優路徑的問題,只要RRT*算法迭代的次數足夠多,就一定能找出最優的路徑,但是隨之而來的就是規划需要的時間變長。筆者在做本科畢設的時候在為SLAM移動機器人規划路徑時用的就是OMPL中的RRT*,如果要得到最佳的路徑的話,時間得幾秒,但是如果想降低迭代的時間,得出的路徑就不是最優的,如起始點和目標點沒有障礙物但是規划的路徑仍然不是一條直線。但是無論如何,RRT都是一種有效的機器人路徑規划算法。

 


 Ⅰ.RRT Algorithm

RRT全名叫做 Rapidly-exploring random tree,

1. 起始時樹的根節點就是起始點,然后在圖的有效空間內隨機采樣,采樣點可能落在搜索空間內的任一個位置。

2. 一旦一個隨機點被選定,算法就會嘗試將該隨機點和離RRT樹最近的一個元素連接,如果該連接在限制條件以內,如連接長度小於設定的步長且兩點之間無障礙物,則將該隨機點納入RRT樹,成為其一個新的元素,該元素的父節點為離它最近的那個點;如果該點到樹中某點的最近的距離比設定的步長要大,則可以選擇以兩點相連的直線為方向,以設定的最大步長為長度,重新選擇這個直線的端點作為樹的新元素,而不再選用生成的隨機點。

3. 迭代的過程中會對每個點判斷點和目標點是否能夠直接相連,如果直接相連,則可以提前退出搜索。

偽代碼如下:

 1 Algorithm BuildRRT
 2     Input: Initial configuration qinit, number of vertices in RRT K, incremental distance Δq)
 3     Output: RRT graph G
 4 
 5     G.init(qinit)
 6     for k = 1 to K do
 7         qrand ← RAND_CONF()
 8         qnear ← NEAREST_VERTEX(qrand, G)
 9         qnew ← NEW_CONF(qnear, qrand, Δq)
10         G.add_vertex(qnew)
11         G.add_edge(qnear, qnew)
12     return G
13 "" denotes assignment. For instance, "largest ← item" means that the value of largest changes to the value of item.
14 "return" terminates the algorithm and outputs the following value.

 


  Ⅱ. RRT* Algorithm

先來看一段RRT*的偽代碼:

 

 RRT*大體步驟和RRT相同,只不過多了一個1.Connect along a minimum-cost和一個2.Rewire the tree 的步驟,就是這兩個步驟使得RRT*可以得到最優的路徑,

1. 步驟1的就是為隨機選中的點重新選擇父節點,使得該點到起點的cost能夠最小,至於cost的定義,就是路徑的長度,看具體情況選什么類型,其中父節點的選擇可以是該節點附近相連的所有點

2. 步驟2就是在重新選完父節點后,為該節點附近區域的所有樹中的節點重新布線,即rewire,布線的原則是使所有節點到起始點的cost最小

經過以上兩個步驟,隨着迭代次數的增加,就一定能夠找到最佳的路徑。

 

在知乎上看到一個很好描述上述兩個過程的圖,分享如下:原文鏈接:https://zhuanlan.zhihu.com/p/51087819

 

 

 

 Reference:

[1] https://en.wikipedia.org/wiki/Rapidly-exploring_random_tree#cite_note-incremental-8

[2] https://zhuanlan.zhihu.com/p/51087819


免責聲明!

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



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