收藏我(I)們
Industry Information
版權聲明:本文爲(For)CSDN博主「曼陀羅彼岸花」的(Of)原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出(Out)處鏈接及本聲明。
原文鏈接:
https://blog.csdn.net/tiandijun/article/details/62226163
下面是路徑規劃最常用(Use)的(Of)A*算法的(Of)介紹。
1、路徑規劃定義
路徑規劃是指的(Of)是機器人(People)的(Of)最優路徑規劃問題,即依據某個(Indivual)或某些優化準則(如工作(Do)代價最小、行走路徑最短、行走時(Hour)間最短等),在(Exist)工作(Do)空間中找到(Arrive)一(One)個(Indivual)從起始狀态到(Arrive)目标狀态能避開障礙物的(Of)最優路徑。
也就是說,應注意以(By)下三點:
❖ 明确起始位置及終點
❖ 避開障礙物
❖ 盡可能做到(Arrive)路徑上的(Of)優化
機器人(People)的(Of)路徑規劃應用(Use)場景極豐富,最常見如遊戲中NPC及控制角色的(Of)位置移動,百度地圖等導航問題,小到(Arrive)家庭掃地機器人(People)、無人(People)機,大(Big)到(Arrive)各公司正争相開拓的(Of)無人(People)駕駛汽車等。
這(This)裏介紹一(One)下在(Exist)遊戲以(By)及無人(People)機航線規劃上最常見的(Of)A*算法。
2、A*算法詳解
在(Exist)計算機科學中,A*算法作(Do)爲(For)Dijkstra算法的(Of)擴展,因其高效性而被廣泛應用(Use)于(At)尋路及圖的(Of)遍曆,如星際争霸等遊戲中就大(Big)量使用(Use)。
在(Exist)理解算法前,我(I)們需要(Want)知道幾個(Indivual)概念:
搜索區域(The Search Area):圖中的(Of)搜索區域被劃分爲(For)了簡單的(Of)二維數組,數組每個(Indivual)元素對應一(One)個(Indivual)小方格,當然我(I)們也可以(By)将區域等分成是五角星、矩形等,通常将一(One)個(Indivual)單位的(Of)中心點稱之爲(For)搜索區域節點(Node),而非方格(Squares)。
開放列表(Open List):我(I)們将路徑規劃過程中待檢測的(Of)節點存放于(At)Open List中,而已檢測過的(Of)格子則存放于(At)Close List中。
父節點(parent):在(Exist)路徑規劃中用(Use)于(At)回溯的(Of)節點,開發時(Hour)可考慮爲(For)雙向鏈表結構中的(Of)父節點指針。
路徑排序(Path Sorting):具體往哪個(Indivual)節點移動由以(By)下公式确定:F(n) = G(n) + H(n)。G代表的(Of)是從初始位置A沿着已生(Born)成的(Of)路徑到(Arrive)指定待檢測格子的(Of)移動開銷。H指定待測格子到(Arrive)目标節點B的(Of)估計移動開銷。
啓發函數(Heuristics Function):H爲(For)啓發函數,也被認爲(For)是一(One)種試探,由于(At)在(Exist)找到(Arrive)唯一(One)路徑前,我(I)們不(No)确定在(Exist)前面會出(Out)現什麽障礙物,因此用(Use)了一(One)種計算H的(Of)算法,具體根據實際場景決定。在(Exist)我(I)們簡化的(Of)模型中,H采用(Use)的(Of)是傳統的(Of)曼哈頓距離(Manhattan Distance),也就是橫縱向走的(Of)距離之和(And)。
如圖中所示,綠色方塊爲(For)機器人(People)起始位置A,紅色方塊爲(For)目标位置B,藍色爲(For)障礙物。
現用(Use)A*算法尋找出(Out)一(One)條自綠色A到(Arrive)紅色B的(Of)最短路徑,經簡化,每個(Indivual)方格的(Of)邊長爲(For)10,即垂直水平方向移動開銷爲(For)10。節點對角線爲(For)10,因此斜對角移動開銷約等于(At)14。因此具體步驟如下:
(1)将A點加入到(Arrive)Open List中,圖中所示,上下左右移動一(One)格距離爲(For)10,斜對角移動距離爲(For)14。環繞綠色方塊的(Of)就是待檢測格子,左下角的(Of)值就是G值,右下角爲(For)H值,左上角對應的(Of)就是F值,找到(Arrive)F值最小的(Of)節點作(Do)爲(For)新的(Of)起始位置。
(2)綠色格子右側的(Of)節點F爲(For)40,選作(Do)當前處理節點,并将這(This)個(Indivual)點從Open List删除,增加到(Arrive)Close List中,對這(This)個(Indivual)節點周圍的(Of)8個(Indivual)格子進行判斷,若是不(No)可通過或已經在(Exist)Close List中,則忽略之。否則執行以(By)下步驟:
若當前處理格子的(Of)相鄰格子已經在(Exist)Open List中,那就計算臨近節點經當前處理節點到(Arrive)起點的(Of)距離G是否比原G值小,若小,則把相鄰節點的(Of)父節點(parent)設置爲(For)當前處理節點。
若當前處理格子的(Of)相鄰格子不(No)在(Exist)Open List中,那麽把它加入,并将它的(Of)父節點設置爲(For)該節點。
(3)重複1、2步驟,直到(Arrive)終點B加入到(Arrive)了Open List中,再沿着各節點的(Of)父節點回溯遍曆,将遍曆得到(Arrive)的(Of)節點坐标保存下來(Come),所得的(Of)節點就是最短路徑。
最終效果如圖所示:
在(Exist)Github上找到(Arrive)了一(One)個(Indivual)A-star的(Of)c++源碼:https://github.com/booirror/data-structures-and-algorithm-in-c供參考。
但也發現,在(Exist)整個(Indivual)計算過程中,A*算法結合了啓發式方法,利用(Use)估值函數F(H)來(Come)估計途中當前點與終點距離,并由此決定搜索方向,當這(This)條路失敗會重新嘗試其他(He)路徑,但不(No)理想的(Of)估值函數會導緻整個(Indivual)算法運行很慢,而且這(This)種算法雖說在(Exist)時(Hour)間上最優,但也存在(Exist)空間增長是指數級别的(Of)缺點。因此在(Exist)往高維狀态空間進行運算時(Hour),速度會受到(Arrive)影響,基于(At)A*算法叠代加深的(Of)IDA*算法則有效解決了空間增長帶來(Come)的(Of)問題。
3、自動駕駛對路徑規劃的(Of)需求
目前業内對自動駕駛的(Of)技術方案觀點較爲(For)一(One)緻,主要(Want)可分爲(For)四個(Indivual)部分:
因此首先要(Want)做的(Of)就是對外部環境的(Of)實時(Hour)獲取及車輛的(Of)動态路徑規劃。 傳統機器人(People)路徑規劃大(Big)緻可分三種:
❖ 靜态結構化環境下的(Of)路徑規劃
❖ 動态已知環境下的(Of)路徑規劃
❖ 動态不(No)确定環境下的(Of)路徑規劃
将其與自動駕駛對應起來(Come),靜态的(Of)規劃就是根據地理信息以(By)及交通規則在(Exist)已知的(Of)全局地圖上進行道路循迹,但這(This)個(Indivual)技術對于(At)目前自動駕駛實現來(Come)說并沒有什麽實際應用(Use)價值。
自動駕駛需要(Want)的(Of)是對預先已選擇好的(Of)最優路徑,甚至在(Exist)未知的(Of)環境下,基于(At)實時(Hour)不(No)确定的(Of)場景,進行動态調整的(Of)路徑規劃技術,而這(This)對地圖的(Of)需求、外部信息采集等就還是要(Want)依賴上一(One)篇提及的(Of)如攝像頭、激光雷達、傳感器等硬件的(Of)支持。
之前網上有在(Exist)轉載的(Of)一(One)篇《從算法上解讀自動駕駛是如何實現的(Of)》也有所總結,提到(Arrive)目前自動駕駛上應用(Use)較廣的(Of)有Dijkstra、Lee、Floyd、雙向搜索算法以(By)及蟻群算法,大(Big)家如果感興趣可以(By)自行搜索學習,這(This)裏不(No)再贅述。
現有傳統機器人(People)路徑規劃技術已經發展得較爲(For)成熟,而将該技術如何更爲(For)符合場景地應用(Use)到(Arrive)自動駕駛技術上還有很長的(Of)探索階段,但現已存在(Exist)的(Of)包括A*算法在(Exist)内的(Of)一(One)系列最優路徑算法将會越來(Come)越由于(At)圖論、人(People)工智能、機器人(People)技術、自動駕駛等多學科的(Of)融合下得到(Arrive)更大(Big)的(Of)發展。
上一(One)篇:“綠色物流”是物流先進性的(Of)關鍵指标