基於unity3d的RRT演算法路徑規劃

2022-05-20 01:48:08 字數 1883 閱讀 7918

rrt(快速探索隨機樹) 是一種通用的方法,不管什麼機械人型別、不管自由度是多少、不管約束有多複雜都能用。而且它的原理很簡單,這是它在機械人領域流行的主要原因之一。不過它的缺點也很明顯,它得到的路徑一般質量都不是很好,例如可能包含稜角,不夠光滑,通常也遠離最優路徑。

rrt 能在眾多的規劃方法中脫穎而出,它到底厲害在**呢?

天下武功唯快不破,「快」是 rrt 的一大優點。rrt 的思想是快速擴張一群像樹一樣的路徑以探索(填充)空間的大部分區域,伺機找到可行的路徑。之所以選擇「樹」是因為它能夠探索空間。我們知道,陽光幾乎是樹木唯一的能量**。為了最大程度地利用陽光,樹木要用盡量少的樹枝佔據盡量多的空間。當然了,能探索空間的不一定非得是樹,比如peano曲線也可以做到,而且要多密有多密,如上圖左所示的例子。雖然像peano曲線這樣的單條連續曲線也能探索空間,但是它太「確定」了。在搜尋軌跡的時候我們可不知道出路應該在**,如果不在「確定」的搜尋方向上,我們怎麼找也找不到(找到的概率是0)。這時「隨機」的好處就體現出來了,雖然不知道出路在**,但是通過隨機的反覆試探還是能碰對的,而且碰對的概率隨著試探次數的增多越來越大,就像買彩票一樣,買的數量越多中獎的概率越大(rrt名字中「隨機」的意思)。可是隨機試探也講究策略,如果我們從樹中隨機取乙個點,然後向著隨機的方向生長,那麼結果是什麼樣的呢?見上圖右。可以看到,同樣是隨機樹,但是這棵樹並沒很好地探索空間,它一直在起點(紅點)附近打轉。這可不好,我們希望樹盡量經濟地、均勻地探索空間,不要過度探索乙個地方,更不能漏掉大部分地方。這樣的一棵樹怎麼構造呢?

rrt 的基本步驟是:

1. 起點作為一顆種子,從它開始生長枝丫;

2. 在機械人的「構型」空間中,生成乙個隨機點 a aa;

3. 在樹上找到距離 a aa 最近的那個點,記為 b bb 吧;

4. b bb 朝著 a aa 的方向生長,如果沒有碰到障礙物就把生長後的樹枝和端點新增到樹上,返回 2;

隨機點一般是均勻分布的,所以沒有障礙物時樹會近似均勻地向各個方向生長,這樣可以快速探索空間(rrt名字中「快速探索」的意思)。當然如果你事先掌握了最有可能發現路徑的區域資訊,可以集中兵力重點探索這個區域,這時就不宜用均勻分布了。

rrt 的乙個弱點是難以在有狹窄通道的環境找到路徑。因為狹窄通道面積小,被碰到的概率低,找到路徑需要的時間要看運氣了。下圖展示的例子是 rrt 應對乙個人為製作的很短的狹窄通道,有時rrt很快就找到了出路,有時則一直被困在障礙物裡面。對應的**如下(這段**只用於演示 rrt 的原理,不是正式**,但它有助於理解正式**的運算過程)

rrt探索空間的能力還是不錯的,例如下圖左所示的例子,障礙物多而且雜亂(借助 mathematica 本身具有的強大函式庫,實現這個例子所需的所有**應該不會超過30行)。還有沒有環境能難住rrt呢?下圖右所示的迷宮對rrt就是個挑戰。這個時候空間被分割得非常嚴重,rrt顯得有些力不從心了,可見隨機策略不是什麼時候都有效的。

「隨機」使得rrt有很強的探索能力。但是成也蕭何敗也蕭何,「隨機」也導致 rrt 很盲目,像個無頭蒼蠅一樣到處亂撞。如果機械人對環境一無所知,那麼採用隨機的策略可以接受。可實際情況是,機械人對於它的工作環境多多少少是知道一些的(即使不是完全知道)。我的部落格一直強調資訊對於機械人的重要性。這些已知的資訊就可以用來改進演算法。乙個改進的辦法就是給它一雙「慧眼」:在勢場法中,勢函式攜帶了障礙物和目標的資訊,如果能把這個資訊告訴 rrt,讓它在探索空間時有傾向地沿著勢場的方向前進會更好。這樣,rrt 出色的探索能力剛好可以彌補勢場法容易陷入區域性極小值的缺點。

Unity3D開發(九) Unity3d流光效果

遊戲開 壇 hello game 遊戲開發群 201276069 之前曾經注意過material 中紋理的屬性都有 tiling 和offset 但沒有深究過其用途,今天才知道竟然可以利用 offset做uv 動畫,從而完成各種有趣的動畫,比如流光效果!流過效果即通常一條高光光在物體上劃過,模擬高光...

基於Unity3D引擎的Android遊戲優化

最近專案進入收尾階段,之前對專案做了很多優化,mesh合併 減少drawcall和模型骨骼以及物理計算,合併材質球,優化 等等,在ios上還好,但是android上,試過幾款手機,從低端到高階,發現效能還是很差,所以又花了幾天來研究摸索,終於把遊戲效能搞定。記錄下來,留作以後參考。1.更 新不透明貼...

基於Unity3D的塔防遊戲

設計建議塔防遊戲,實現規定敵人移動路線,在塔的基座的基礎上公升級塔 賣掉塔 更換塔,來射擊敵人。要求 1 基於c 程式語言實現 2 發射子彈攻擊敵人 記錄分數,判定遊戲成功與否。基於android平台進行開發,開發工具使用unity3d 3.7 photoshopcs6 visual studio ...