路徑規劃算法--PRM,從原理到Matlab實現

注: 本篇博客轉載自運動規劃入門 | 3. 白話PRM,從原理到Matlab實現,老師講的太好了,我這裏轉載留存下。

上一回,我們講完了A的工作原理,與Dijkstar相比A確實有一定程度上的優化,但是我們最後也提到了,即便如此A和Dijkstar一樣,依舊還是在逐一遍歷地圖中的每一個柵格,這對於算法的實際使用是十分不友好的,畢竟我們不可能使用一張2020或者100*100的地圖來描述實際的物理世界,往往實際上的地圖是會遠遠大於這個尺寸的。

在座的小夥伴們一定知道在概率統計中,有一個概念叫做抽樣調查,對大量的數據進行抽樣的話,可以大大地壓縮數據量,並且抽樣的結果依然可以代表整體的特徵。PRM(概率路線圖)便是具有相似的原理。PRM就是通過對一張大地圖進行稀疏採樣,從而將原本很巨大的柵格地圖簡化爲較少的採樣點和它們之間的邊組成的“無向圖”。沒錯,就是圖論意義上的那個圖。從而我們可以拿着這張簡化了的地圖進行路徑規劃。

  1. Dijkstar、A*和PRM之間的那點關係

其實在路徑規劃中,我們把生成一個計劃稱爲“規劃階段”,而依賴規劃階段的結果來找到一條從A到B的路徑則稱爲“查詢階段”。在前兩篇中我並未闡明這兩者之間的區別,因爲在Dijkstar和A中,主要是屬於查詢階段,這兩個算法都是在執行在A點到B點之間尋找路徑這麼一件事。而PRM和前者不一樣,PRM的主要任務是將原本的柵格地圖轉化爲一張稀疏無向圖。而且在後面的介紹中你會發現,實際上PRM和Dijkstar以及A之間並不是互斥的,相反他們經常被結合起來使用,首先由PRM簡化地圖,然後將簡化得到的無向圖交給Dijkstar或者A*進行查詢。所以他們是各司其職的,並不矛盾。在本文中,我會以Dijkstar爲例,展示整套流程。

  1. PRM是如何運作的?
    2.1 基本原理

實際上PRM的原理非常好理解,想象着面前有一張平鋪的地圖,現在我們拿着一堆點往上撒。如下圖所示,藍色幾何塊代表着障礙物,灰色部分表示自由空間,起初圖中只有綠色的起點和黃色的終點,現在我們往地圖上撒第一個點,那麼顯然會有兩種可能,一個是很不巧,把點撒在了障礙物上,那麼這種情況我們必須要捨棄這個點,重新撒一次,直到我們成功地把點撒到灰色區域。假設這時候我們發現這個點可以連接到起點,於是我們就得到了第一條邊。

1

當我們重複這個過程,不斷地往地圖上撒點,當然,並不是每一個點都能和相鄰的點連接起來的,比如圖中的虛線就代表着這兩點之間被障礙物阻隔了,這種情況我們就必須捨棄掉這條邊

2

假設我們設置採樣點爲10個點,那麼結果就會得到像下面這樣的一張稀疏的無向圖。這張無向圖即保留了原本柵格地圖的特徵,而且大大壓縮了數據量。

3

在第一篇中,我在講解Dijkstar的原理的時候就講過無向圖,並以此爲例說明了Dijkstar的運作過程,所以我們知道這種稀疏的無向圖其實是對Dijkstar和A*這種規劃算法十分友好的,我們將PRM的輸出——稀疏無向圖,作爲輸入交給Dijkstar進行規劃,很快就能找到從起點到終點之間的最優路徑。

4

2.2 步長限制
在實際的算法實現中,往往我們會添加一個步長的限制,或者叫連接距離限制,比如我們設置將步長限制在10以內,也就是說如果一個點與它的所有相鄰點的距離超過10的話,該點就會被算法放棄。在某些場景下我們可能不希望機器一直走大直線,我們希望它的路線更加光滑,那麼我們就可以將這個步長限制在一個小範圍內,那麼最終得到的路徑便會是一小段一小段的直線路徑連接起來的樣子,後期對該路徑進行光滑處理,便可以得到一條平滑的路徑。

2.3 碰撞檢測
碰撞檢測是PRM算法中非常非常重要的一環,沒有碰撞檢測的話,我們將無法正確構建一張避開障礙的無向圖。
在這裏插入圖片描述

碰撞檢測最常見的思路便是:如下圖所示,假設我們要對A,B兩點之間的連線做碰撞檢測,那麼我們會對矢量AB進行等距採樣,從中挑選出若干個相互等距的採樣點,從而逐個檢測其是否處於障礙物的位置。至於要從中取多少個採樣點,這取決於你對其檢測精度的要求。顯而易見採樣點越多,碰撞檢測就越精確,但是當採樣點數量到達一定高度後,再往上增加的話,檢測精度的提高不再明顯,反而會增大計算壓力。

  1. PRM的Matlab實現

3.5 運行效果
在代碼中,我爲小夥伴們準備了三張不同的地圖,你可以通過註釋代碼來切換地圖,看看有什麼不同的效果。

11

老樣子,我們還是使用那張20*20的實例地圖來看看運行效果,這個是採樣點爲50的時候的運行效果,可以看PRM在柵格地圖中不斷的選取合理的採樣點,最終形成一張稀疏無向圖,再交由Dijkstar進行路徑查詢,最終找到最優路徑。

在這裏插入圖片描述

3.6 採樣點和步長限制對效果的影響
代碼中的PRM_Builder函數就是用於構建概率路線圖,可以從下圖中看出,由PRM_Builder構建出的路線圖graph被輸入到dijkstar中進行查詢。

其中PRM_Builder有兩個重要的參數:sampling_points和step_length_limit。一個代表採樣點數量,一個代表步長限制。顯然,不同的採樣點數量和步長限制必然會對最終的效果產生影響。我們可以通過不同的參數配置來看看具體會產生什麼影響。

首先,這是採樣點爲50,步長限制爲5的時候效果:
在這裏插入圖片描述

當我們採樣點保持在50個,但是將步長限制縮小爲3,會發現最終的隨機點的分佈更加集中,但是由於採樣點不夠多,導致了規劃失敗。
14

於是我們依舊保持步長限制爲3,但是這次增加採樣點到100個。可以看到,這次就成功完成了規劃。
在這裏插入圖片描述

那麼假如我們設置採樣點爲50個,但是步長限制設置爲無窮大,也就是不限制步長的話會怎麼樣呢?結果就是我們發現隨機點的佈局非常的肆無忌憚,到處都是。所以我們這就知道了,當步長限制越小時,隨機點的分佈就會相對更集中,相反步長限制越大的話,分佈便會更加分散。

15
當然,如果你和我一樣對自己的電腦性能有自信的話,我還準備了一張100*100的地圖,讓我們來看看當採樣點增加到1000的時候,步長限制爲5,會是什麼樣的。

結果簡直是喪心病狂,這個結果算了將近40秒。當然其中很大一部分時間是matlab在連線,如果關掉繪圖的話,會快很多。

在這裏插入圖片描述

  1. PRM的不足
    看起來這麼秀的PRM有沒有弱點所在呢?當然有。首先,PRM由於其選點的隨機性,導致了當他遇到一些狹長的通道時,規劃失敗的機率會大大上升,比如這樣:

    像這種具有狹長通道的地圖,最終規劃出來的無向圖很容易就會被一分爲二,導致找不到從起點到終點的路徑
    

18

當然,遇到這種情況,可以通過適當增加採樣點,以及增大步長限制來增大規劃成功的機率

19

而且同樣由於PRM是基於概率的算法,所以會導致每次規劃出來的結果都會不一樣,這對某些路徑一致性要求比較嚴格的場景來說,PRM可能不是最佳的規劃算法:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章