1. 程式人生 > >路徑規劃A*演算法及SLAM自主地圖建立導航演算法

路徑規劃A*演算法及SLAM自主地圖建立導航演算法

最近研究機器人自主路徑規劃,關注了「泡泡機器人SLAM」專欄平臺,上面有很多公開的視訊,涵蓋多種SLAM技術及其演算法的視訊、PPT和程式碼資源,屬於公開,轉載請註明。

第一期

1.工業相機選型及介紹-劉富強:

2.深度學習-顏沁睿:

3.SVO & LSD_SLAM解析 - 賀一家:

4.caffe_intro-高翔:

5.雙目視覺里程計-謝曉佳:

6.bitcoin_intro-李其樂:

8.增強現實及其相關概念-陳昊升:

9.MEMS IMU的入門與應用 - 胡佳興:

11.雙目矯正及視差圖的計算-黃耀:

12.IMU+動態背景消除-曾書格:

13.COP-SLAM - 楊俊:

14.ORB-LSD-SVO-劉浩敏:

15.cuda優化程式碼 - 張也冬:

16.KinectFusion 和 ElasticFusion 三維重建方法 - 付興銀:

17.視覺SLAM中的矩陣李群基礎-王京:

18.rosbridge的原理和應用-董超:

19.優化與求解 by 劉毅:

20. Direct方法的原理與實現 by 高翔:

21.影象技術在AR中的實踐-張穎:

22.路徑規劃-王超群:

23.ORB-SLAM簡單重構-馮兵:

24.LeastSquare_and_gps_fusion-卿李:

25.Scan Matching in 2D SLAM-張明明:

26.LSD-SLAM深度解析-範帝楷:

27.鐳射SLAM-王龍軍:

28.TSL安全網路傳輸協議簡介-侯濤:

下面是路徑規劃最常用的A*演算法的介紹。

1路徑規劃定義路徑規劃是指的是機器人的最優路徑規劃問題,即依據某個或某些優化準則(如工作代價最小、行走路徑最短、行走時間最短等),在工作空間中找到一個從起始狀態到目標狀態避開障礙物最優路徑也就是說,應注意以下三點:
    • 明確起始位置及終點
    • 避開障礙物
    • 儘可能做到路徑上的優化
機器人的路徑規劃應用場景極豐富,最常見如遊戲中NPC及控制角色的位置移動,百度地圖等導航問題,小到家庭掃地機器人、無人機大到各公司正爭相開拓的無人駕駛汽車等。目前路徑規劃演算法分:
這裡介紹一下在遊戲以及無人機無人機航線規劃上最常見的A*演算法。2A*演算法詳解在電腦科學中,A*演算法作為Dijkstra演算法的擴充套件,因其高效性而被廣泛應用於尋路及圖的遍歷,如星際爭霸等遊戲中就大量使用。
在理解演算法前,我們需要知道幾個概念:搜尋區域(The Search Area):圖中的搜尋區域被劃分為了簡單的二維陣列,陣列每個元素對應一個小方格,當然我們也可以將區域等分成是五角星,矩形等,通常將一個單位的中心點稱之為搜尋區域節點(Node),而非方格(Squares)。
開放列表(Open List):我們將路徑規劃過程中待檢測的節點存放於Open List中,而已檢測過的格子則存放於Close List中。父節點(parent):在路徑規劃中用於回溯的節點,開發時可考慮為雙向連結串列結構中的父結點指標。路徑排序(Path Sorting):具體往哪個節點移動由以下公式確定:F(n) = G(n) + H(n)G代表的是從初始位置A沿著已生成的路徑到指定待檢測格子的移動開銷。H指定待測格子到目標節點B的估計移動開銷。啟發函式(Heuristics Function):H為啟發函式,也被認為是一種試探,由於在找到唯一路徑前,我們不確定在前面會出現什麼障礙物,因此用了一種計算H的演算法,具體根據實際場景決定。在我們簡化的模型中,H採用的是傳統的曼哈頓距離(Manhattan Distance),也就是橫縱向走的距離之和。如圖中所示,綠色方塊為機器人起始位置A,紅色方塊為目標位置B,藍色為障礙物。
現用A*演算法尋找出一條自綠色A到紅色B的最短路徑,經簡化,每個方格的邊長為10,即垂直水平方向移動開銷為10。節點對角線為10,因此斜對角移動開銷約等於14。因此具體步驟如下:1、將A點加入到Open List中,圖中所示,上下左右移動一格距離為10,斜對角移動距離為14。環繞綠色方塊的就是待檢測格子,左下角的值就是G值,右下角為H值,左上角對應的就是F值,找到F值最小的節點作為新的起始位置。
2、綠色格子右側的節點F為40,選作當前處理節點,並將這個點從Open List刪除,增加到Close List中,對這個節點周圍的8個格子進行判斷,若是不可通過或已經在Close List中,則忽略之。否則執行以下步驟:
  • 若當前處理格子的相鄰格子已經在Open List中,那就計算臨近節點經當前處理節點到起點的距離G是否比原G值小,若小,則把相鄰節點的父節點(parent)設定為當前處理節點。
  • 若當前處理格子的相鄰格子不在Open List中,那麼把它加入,並將它的父節點設定為該節點。
3、重複1、2步驟,直到終點B加入到了Open List中,再沿著各節點的父節點回溯遍歷,將遍歷得到的節點座標儲存下來,所得的節點就是最短路徑。最終效果如圖所示:


在Github上找到了一個A-star的c++原始碼:https://github.com/booirror/data-structures-and-algorithm-in-c供參考。但也發現,在整個計算過程中,A*演算法結合了啟發式方法,利用估值函式F(H)來估計途中當前點與終點距離,並由此決定搜尋方向,當這條路失敗會重新嘗試其他路徑,但不理想的估值函式會導致整個演算法執行很慢,而且,這種演算法雖說在時間上最優,但也存在空間增長是指數級別的缺點,因此在往高維狀態空間進行運算時,速度會**受到影響,基於A*演算法迭代加深的IDA*演算法則有效解決了空間增長帶來的問題。3自動駕駛對路徑規劃的需求目前業內對自動駕駛的技術方案觀點較為一致,主要可分為四個部分:
因此首先要做的就是對外部環境的實時獲取及車輛的動態路徑規劃。傳統機器人路徑規劃大致可分三種:
  •  靜態結構化環境下的路徑規劃
  •  動態已知環境下的路徑規劃
  •  動態不確定環境下的路徑規劃
將其與自動駕駛對應起來,靜態的規劃就是根據地理資訊以及交通規則在已知的全域性地圖上進行道路循跡,但這個技術對於目前自動駕駛實現來說並沒有什麼實際應用價值。自動駕駛需要的是對預先已選擇好的最優路徑,甚至在未知的環境下,基於實時不確定的場景,進行動態調整的路徑規劃技術,而這對地圖的需求、外部資訊採集等就還是要依賴上一篇提及的如攝像頭、鐳射雷達、感測器等硬體的支援。之前網上有在轉載的一篇《從演算法上解讀自動駕駛是如何實現的》也有所總結,提到目前自動駕駛上應用較廣的有DijkstraLeeFloyd雙向搜尋演算法以及蟻群演算法,大家如果感興趣可以自行搜尋學**,這裡不再贅述。現有傳統機器人路徑規劃技術已經發展得較為成熟,而將該技術如何更為符合場景地應用到自動駕駛技術上還有很長的探索階段,但現已存在的包括A*演算法在內的一系列最優路徑演算法將會越來越由於圖論、人工智慧、機器人技術、自動駕駛等多學科的融合下得到更大的發展。附伯樂在線上關於A*演算法的詳細篇幅介紹: