Theta 連續環境下平滑的任意角度的路徑規劃

2021-07-06 08:59:24 字數 3812 閱讀 8563

此文翻譯自這篇文章theta*: any-angle pathplanning for smoother trajectories in continuous environments

,簡單介紹了theta*演算法,這是一種基於a*的搜尋演算法。筆者翻譯不妥的地方,還望諒解。

然而,由於a*的簡單性和最優性,幾乎總是會選擇它作為搜尋演算法。這是因為a*能確保在圖中找到一條最短的路徑。a*的問題是雖然它能在圖中找到一條最短的路徑,但是這條路徑並不是真實、連續的環境中的最短路徑。a*通過圖中的邊來傳播資訊和約束路徑的形成,圖中的邊會智慧型的約束路徑的方向。插圖1和2是乙個連續環境分別離散化為2d網格和導航網格。2d網格和導航網格上的最短路徑(插圖1和2左側)比連續環境中的最短路徑(插圖1和2右側)更長,看上去更不真實。

插圖1:2d網格中路徑對比真實路徑

插圖2: 導航網格中路徑對比真實路徑

插圖3:使用了平滑處理的a*尋路

簡潔起見,這邊文章將使用2d網格來描述連續環境,灰色的方塊代表障礙不能通過,白色的方塊則可以通過。另外,我們使用網格的角點作為頂點而不是網格的中心點。不過這兩個假設對於theta*演算法來說都不是必須的。我們的目標是從開始點到目標點之間找到一條看起來真實的短路徑,且不能穿過障礙。如插圖1所示。theta* 的動機是結合兩個現有的路徑規劃技術的優良屬性。

在本文中我們假設每個格仔都有8個相鄰的格仔,設定v表示網格頂點的集合,sstart

是搜尋的開始點,sgoal

是目標點。c(s,s')是頂點s 和s'的直線距離,lineofsight(s,s') 是真當且僅當s 和s'能互相通過視線「看」到。nghbrvis(s)是頂點s能夠「看」到的鄰接點。

插圖4:a*偽**

theta*建立在a*演算法之上,因此值得在此介紹一下。a*使用

h(s)

來預估頂點間的距離(

h-values)。a*會為每個頂點維護兩個值:(1)

g-value

是從開始點到當前點

s的最短路徑的長度。(2)父節點在搜尋結束時用來提取路徑。路徑的提取是通過目標點的父指標不斷回溯到起始點得到的。a*同時會維護兩個結構:(1)open list是乙個包含頂點以擴充套件優先順序排序的表。(2)closed list包含了那些已經搜尋了的頂點。a*會更新

g_value

和頂點s

到未展開的鄰接點

s』:通過計算從開始點到

s的路徑(

g(s)

)和從s到s』的直線距離(

c(s,s')

)來計算出乙個長度

g(s) + c(s,s')

。如果新的路徑比當前最短路徑還要短的話,它會更新

g-value

和s』的父節點。

這些通過a*找到的路徑經常開起來像是被乙個醉漢建立出來的。這不僅是因為這些路徑比最短路徑要長,而且這些路徑是被人工約束在網格上的。處理這個問題的最常見的技術就是後處理那條通過a*得到的路徑。一種方法是拉緊這些路徑,就像他們圍繞在障礙上的 「橡膠帶」。後處理技術縮短了路徑,但是感覺上是裝飾品。a*只考慮約束在網格邊上的路徑,於是搜尋不能做出更加合理的決定。由此產生了這樣乙個事實:路徑的拓撲結構是由a*搜尋來決定的,而搜尋演算法卻不知道後處理處理後的路徑。此外,正像我們在插圖3中看到的,選擇乙個能夠簡單有效的後處理平滑演算法可能會是非常困難的。在一些情況下,後處理根本不能減少路徑的長度,且有可能比最短路徑增長8%。我們因此開發了theta*,它在搜尋期間不再約束路徑在格仔的邊上,於是能夠做出更合理的決定。

插圖5:theta* 演算法偽**

theta*與a*關鍵的不同是theta*允許乙個頂點的父親可以是任意頂點,而a*只允許頂點的父親必須是鄰接點。main函式和updatevertex函式和插圖4中的相同因此沒有列出來。我們使用一致的函式h(s) =c(s,sgoal)

來計算直線距離。theta*與a*基本是一致的,除了theta*會通過考慮以下兩種路徑來更新頂點s未展開的鄰接點的

插圖6:theta*演算法通過路徑1和路徑2分別更新點s

如果任意乙個路徑比最短路徑還要短,theta*就會更新g-value和s』的父節點。比如:考慮插圖6中從b3點(父節點a4)開始。b2是乙個可擴充套件的鄰接點,但是b2「看」不到a4,因此只能獲得路徑1(右圖)。c3也是乙個可擴充套件的鄰接點,它可以「看」到a4,因此就可以得到路徑2(左圖)。

插圖7:theta*的追溯圖

插圖7展示了theta*乙個完整的追溯圖。每乙個頂點用g-value 來作為標記,並且用乙個箭頭指向了它的父節點。空心圓指示出了當前正在擴充套件的頂點。開始點a4先開始擴充套件,之後是b3,b2和c1。

插圖8:theta*路徑(藍色)和a*路徑(紅色)

插圖8比較了theta*和a*在bioware的乙個著名rpg博德之門中的一張地圖上的搜尋路徑,這張地圖被分為了100*100的正方形格仔。theta*演算法的路徑明顯要更短看上去也更加真實。此外,a*演算法的後處理平滑也不能把a*得到的路徑處理成theta*演算法得到的路徑,因為它們的拓撲結構是不一樣的。

視線演算法在正方形格仔上可以執行的非常快,只需要比較整數值就可以了。因為執行視線演算法很像是在兩點之間繪製直線時,在光柵顯示器上繪製點圖形。所繪製的點對應於直線穿過的單元。於是,當且僅當所繪製的點沒有落在阻塞的格仔上兩點能互相「看」到。這允許theta*使用乙個標準的整數運算了執行視線測試,而不使用浮點運算;如插圖9所示,只有當對應的格仔被阻塞時

grid[x,y]

才是true. 方便起見,插圖9中的偽**在路徑穿過阻塞格仔會返回true。然而,theta*不管路徑是否能穿過阻塞的格仔都是完整和正確的。

插圖9:在正方形格仔上的視線演算法的偽**

當theta*不保證能在連續環境中找到一條最短路徑時,它會花費更大比例的時間找到最短路徑。比如,插圖10中,theta*在連續環境中從那個大紅點到每個藍點都找到了最短路徑。我們使用了一張遊戲地圖(博德之門)和一張隨機地圖來進行廣泛的分析。

我們發現平均來說theta*找到的路徑的長度與最短路徑的比率在遊戲地圖上是1.007,在隨機地圖上是1.002.這明顯比a*的比率1.04要好。theta*只是比用octile distance heuristic 優化過的a*版本要慢一點。然而,當你結合後處理來看時,theta*會更討人喜歡。此外,在octileheuristic根本不存在的情況下,並不值得在導航網格上進行深度的優化。theta*在可檢視上比標準版a*的速度要快乙個數量級。

將該字元連續部分替換為指定的其它任意字元

指定某字元,並將該字元連續部分數目替換為指定的1個字元。如呼叫 regexreplace abc de fghijk 結果將得到 abc de fghijk 傳入 exe dll 結果 exe dll by gary 20130308 private function regexreplace by...

用Jupyter開啟任意路徑下的檔案

1.用anaconda安裝了anaconda prompt 2.我的檔案在本地的路徑是 d download machinelearninginaction ch10 開啟anaconda prompt 我預設的路徑是在c盤下 切換盤 進入目標路徑 啟動jupyter notebook 對應三行命令...

PYTHON在WINDOWS環境下的環境變數設定

1.首先需要在系統中註冊python環境變數 假設python的安裝路徑為c python2.5,開啟 我的電腦 屬性 高階 環境變數 系統變數 在path的值後面追加 c python25 記得加上 分號 與前面的值分隔開 上述環境變數設定成功之後,就可以在命令列直接使用python命令。或執行 ...