蘇寧 11.11:倉庫內多 AGV 協作的全局路徑規劃算法研究

本文為『InfoQ x 蘇寧 2018雙十一』技術特別策劃系列文章之一。

1. 背景

隨著物聯網和人工智能的發展,越來越多的任務漸漸的被機器人取代,機器人逐漸在發展中慢慢進入物流領域,“智能叉車”,AGV(Automated Guided Vehicle,自主導航車)的出現不僅大大降低了人工成本,還在提升效率,面對海量訂單揀選時候有不錯的表現。在實際應用中,一個倉庫內多個AGV協作完成訂單是不可或缺的部分,而且多個AGV共同運輸的過程中同時進行路徑規劃需要一定的算法做支撐,本文在一個倉庫內多個AGV協作進行路徑規劃的方向上進行算法的研究,對其原理和實現進行分析和介紹。

2. 分析

首先,我們的背景設置在物流倉庫,針對倉庫中常見的入庫、揀貨、出庫等具體的任務細節進行分析,來了解我們AGV所面臨的場景。

傳統的方式一般采用靜止的貨架,入庫時將商品運輸到指定貨架前,人工上架入庫,揀貨時人工去到指定的貨架揀選訂單對應的商品打包出庫,引入AGV之后,模式將發生改變,我們會在倉庫規劃指定的入庫區、揀選區,AGV會將包含訂單的貨架動態地運輸到揀選區,排隊等待人工或者機械臂揀選到指定的訂單揀選筐內打包出庫,完成揀選后將貨架運輸至指定位置。

所以,引入AGV之后,我們面臨的問題是為了最大限度的提高效率,多個AGV如何避免擁堵和碰撞,如何對每個AGV規劃出更好的行走路線,怎樣才能讓每個AGV花最小的代價,完成更多的任務,將是此文討論的重點。

3. 問題拆解

要使得多個機器人在道路規劃上最優,無非是在單個小車規劃路徑時考慮其他小車的行駛路線,進而選取最優的一個行駛方案。另外,不同于室外場景,我們在倉庫中規劃小車路徑,整個道路都是可以設計的,所以我們的問題可拆解為:

(1)\t倉庫中道路的設計;
(2)\t獲取到其他小車的路徑行駛狀態;
(3)\t定義可能的道路擁堵;
(4)\t規劃最短路徑;
(5)\t交通管制。

3.1 倉庫中的道路設計

一些常見的道路設計如圖1和圖2,根據實際的應用場景來布局,考慮的因素包括倉庫的結構,商品的種類等,根據實際測試或模擬來選取最優的設計。

\"image\"
圖1. V字型道路設計

\"image\"
圖2. 井字型道路設計

3.2 獲取到其他小車的路徑行駛狀態

要做到全局路徑規劃,必須得到每一個時刻小車的位置和運行狀態,所以必須和小車建立起穩定的通信系統,一般采用無線局域網的方式,用TCP建立連接,選取合適的WIFI通道來保證小車和全局路徑規劃系統的通信的穩健。

3.3 定義可能的道路擁堵

在倉庫的道路規劃完成之后,首先要考慮的因素是可能的道路擁堵情況,一般小車在倉庫中都是直線行走,需要轉彎時要停在原地,原地旋轉90°或180°之后繼續直線行走,所以每個轉彎都有機會造成當前道路擁堵。另外,同一條道路車流量較大時,也會造成道路擁堵,加上路口會車的情況,主要造成道路擁堵的有轉彎、會車和車流量較大3種常見的可能情況。

3.4 規劃最短路徑

最短路徑規劃是全局路徑規劃的核心,要從地圖上的一個位置到達另一個位置,在中間有障礙物以及考慮到可能的道路擁堵情況,必須使用一個路徑搜索算法來尋找從初始點到目標點的一條最短路徑,常見的搜索路徑的算法有廣度優先算法、深度優先算法、Dijkstra算法、A*算法等,廣度優先算法和深度優先算法適用于樹形結構求解最短路徑或最小權重的場景,環狀結構求解最短路徑一般采用Dijkstra算法,A*算法是靜態路網中求解最短路徑最有效的直接搜索方法。

每一種算法都有其應用場景,對于我們全局路徑規劃的場景,我們的地圖更容易轉換成柵格地圖,而A*算法在柵格地圖上搜索最短路徑有明顯的優勢,而且方便于修改加上我們道路擁堵場景的考量,所以我們以A*算法為首選最短路徑算法,進而分析實現全局路徑規劃。

3.5 交通管制

交通管制主要應用于會車和并流場景,一方面為了避免車輛碰撞,另一方面路口會車比較常見,處理不好會導致車輛死鎖,車輛相互等待,進而導致任務無法完成,也是全局路徑規劃的核心算法,常見的會車場景如圖3。

\"image\"
圖3. 路口會車

4. 核心算法實現

路徑規劃算法的核心主要在于最短路徑的規劃和交通管制,這里將對一種最短路徑規劃算法和交通管制算法進行算法剖析,進而設計出一套完整的全局路徑規劃算法。

4.1 A*算法規劃最短路徑

A*算法類似于圖論中尋找最優樹,通常是通盤考慮選擇某一路徑的路徑耗費,在所有可通過的路徑中總有一條路徑相對于其他任何可通行的路徑來說是耗費最少的。在圖論中尋找最佳路徑時每一條的路徑耗費是已知且固定的,但在用A*算法求解最佳路徑時,沿著不同的路徑前進,盡管是同一節點但其耗費可能是不同的,這便是啟發式尋路的精髓。

運用此方式時,首先將實際問題抽象出來,用矩陣的形式表示問題中的各元素,包括起點位置,目標點位置,以及出現的障礙物。我們會逐漸地發現在尋路方面都是將實際問題抽象地用矩陣表示,之后通過對矩陣的操作模擬實現尋路過程。

其基本思想是以起點為中心,其周圍緊鄰的8個點都通過指針指向它,在其周圍點內選擇最佳路徑點并以它為中心點將其還未建立指針聯系的周圍點(可行的,這在后文中解釋)通過指針指向它,并選擇最佳路徑點再以此點為中心尋路直到尋找到點的周圍點中有目標點,這樣尋找的路徑就通過指針一一連接起來了,最后通過輸出這些點就是尋找的路徑了。

下文主要通過以下幾個方面來逐步分析A*算法的尋路過程:

(1)\t將實際問題抽象化為矩陣表示

抽象出的矩陣如圖4,其中綠色區域表示起始點,紅色區域表示目標點,中間藍色區域表示障礙物(如不可通過的高山或是河流),黑色區域表示可產生路徑的區域。

(2)\t以起點為中心尋找到下一節點

如圖5所示,以起點為中心與之緊密相鄰的8個點是其所尋路徑上可到的下一點,且都以指針的形式將中間當前點作為與其緊鄰的周圍點的父節點。對于這8個點,應該選擇哪一點作為尋路的下一個起點呢,A*算法中建立了兩個列表,一個為開啟列表(用于存儲所有當前點的可到點(除去已經在關閉列表中的點、障礙物點)),另一個為關閉列表(里面存儲已經到過的點,已經在關閉列表中的點在下一次尋路的過程中是不會再次檢查的,這也說明尋路的線路不會有相交的可能)。

\"image\"
圖4

\"image\"
圖5

(3)\t選擇下一節點

將起點加入關閉列表,在以后的尋路過程中不再對其進行檢查,接下來就是在這8個點中選擇一個作為下一路徑點,選擇的原則是在其中尋找路徑耗費最小的節點,

其權值用F表示,F=G+H

其中G表示從起點開始,沿著產生的路徑,移動到指定方格上的路徑耗費;如圖6所示,以起點為中心其緊鄰周圍點有上下左右、對角線方向上的8個點,以上下左右移動路徑耗費為10,對角線耗費為 $ \\sqrt{2} \\times10$,約為14。

其中H表示從路徑所在的當前點到終點的移動路徑耗費,計算方法為當前點到目的點之間水平和垂直的方格的數量總和,然后把結果乘以10。

從圖7可以看出,起始點右邊點的權值F最小,故將其作為下一路徑點。

\"image\"
圖6

\"image\"
圖7

(4)\t繼續搜索

把路徑點從開啟列表中刪除,并添加到關閉列表中。檢查與此點緊鄰的8個點(忽略在關閉列表中或者不可通過的點),把他們添加進開啟列表,如果存在還有點沒有添加進開啟列表,則將路徑點作為此類點的父節點并添加進開啟列表。

如果所有可行的緊鄰點已經在開啟列表中,對每一緊鄰點檢查目前這條路徑到是否比上一路徑點到這一緊鄰點的路徑耗費要小,如果不是則什么都不用做(如圖8所示)從原始起點到其緊鄰的右下方的點,按照新產生路徑G值:G1=10+10=20,而原始路徑G值G2=14,即新產生路徑的G值比原始路徑的G值大,而它們的H值相同(為同一點)故原始路徑的F值比新產生路徑的F值要小,不做任何處理,繼續下一步尋路。如果是,那就把相鄰方格的父節點改為目前選中的方格,說明新產生的路徑的移動耗費更小。

\"image\"
圖8

(5)\t重復上一搜索過程直至結束

搜尋過程結束分為兩種情況:一種是目標點加入關閉列表,搜索正常結束,找到路徑。另一種情況是目標點未找到但開啟列表已經為空,意味著沒有找到從起始點到目標點的路徑,搜索結束。

搜索過程如圖9所示,從中可以看出從起點到目標點之間有指針指向一致的一條路徑,這便A*算法是搜尋到的路徑。在路徑點上添加紅色點突出顯示,此即為從起始點到終點的一條路徑。

\"image\"
圖9

整個尋路過程整理如下:

  1. 起始格加入開啟列表;
  2. 重復如下的工作:
    a. 尋找開啟列表中F值最低的點。我們稱它為當前點;
    b. 把它加入關閉列表;
    c. 對緊鄰的8格中的每一點
    • 如果它不可通過或者已經在關閉列表中,略過它。反之如下:
    • 如果它不在開啟列表中,把它添加進去。把當前點作為這一格的父節點。記錄這一點的F、G和H值;
    • 如果它已經在開啟列表中,用G值為參考檢查新的路徑是否更好。更低的G值意味著更好的路徑。如果是這樣,就把這一點的父節 點改成當前點,并且重新計算這一點的G和F值。改變之后需要重新對開啟列表按F值大小排序。如果不是則不需要做后面改變指針指向并重新計算G、F值的工作;
  3. 停止搜索,分為兩種情況:
    • 當目標點添加入了關閉列表,這時候路徑被找到,搜索正常結束;
    • 沒有找到目標點,但開啟列表已經空了,此時未找到合適的路徑,搜索結束;
  4. 保存路徑。從目標點開始,沿著每一點的指針指向移動,直到回到起始點,輸出路徑。

4.2 基于鎖格機制的交通管制

車輛道路規劃完成后,多個小車同時開始行走,多條道路小車會車的情況不可避免,會車時候車輛主要會出現跟隨,相向而行,十字路口或丁字路口的情況,跟隨的時候車輛前方會有傳感器避免跟隨碰撞,為了避免十字路和丁字路會車碰撞,會車時候采取鎖格的方式,即:

(1)\t每輛小車行走一步,將前面即將行走的兩步的點鎖住;
(2)\t小車鎖格時發現即將鎖的地圖的點已經被鎖住,則兩車協商看哪個優先級高,哪輛車先行,另一輛車停車等待;
(3)\t小車走過之后將解鎖,等待的時候可以重新鎖住即將行駛的點,繼續往前行走;
(4)\t循環一直每一步都進行鎖格操作。

4.3 全局路徑規劃

在規劃當前小車路徑時,要在考慮到道路擁堵的情況下去規劃最短路徑,以滿足整體規劃結果最優,使用A*算法,用G值為參考檢查新的路徑是否更好, 將地圖中其他小車規劃的路徑的點的G值增加,即可盡量避免搜索到相同的路徑,同樣的道理,在車輛需要轉彎的時候,也同樣增加轉彎下一點的G值,從而規劃路徑盡量避免轉彎的情況出現,來達到整體效率最高,全局路徑最優。
此外,由于路徑規劃都是靜態規劃的路徑,車輛在行走過程中同時需要對每輛小車進行鎖格的交通管制,來保證車輛不會相撞。

5. 總結

本文主要對倉庫內多AGV協作的全局路徑規劃進行了研究,并介紹了一種可能的實現算法方案,從倉庫中道路的設計,擁堵的考量等角度簡單全局路徑規劃需要考慮的維度,對最短路徑規劃和交通管制策略進行的詳細的分析和應用設計。

作者:董效成,蘇寧易購IT總部人工智能研發中心技術經理,負責機器人項目任務匹配和路徑規劃算法工作。有多年的機器人算法開發經驗,對輪式機器人的運動控制,路徑規劃等算法有深刻的理解,有豐富的機器人操作系統(ROS)開發實踐經驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537571.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537571.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537571.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

老板思維:工作負責人是首問責任制

工作負責人包括部門領導,項目經理等負責人。以項目經理為例,解釋這種思維。 分好幾種情況: (1)當公司(老板,領導,甲方)將事情交給你的時候,這件事情就由你負…

用python繪制玫瑰花的代碼_python也能玩出玫瑰花!程序員的表白代碼

有些情侶是異地戀,情人節想送朵玫瑰花給女朋友都困難。別擔心,用Python就好了,互聯網時代的戀愛神器!接下來就讓我們一起來看看如何用Python變出玫瑰花的。 1、首先我們導入畫圖工具turtle,即import turtle 2、導入畫圖…

Springboot 整合 swagger

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/weixin_40254498/article/details/83622098 swagger 主要是為后端服務的接口文檔,懶人必備,swagger就是一款讓你更好的書寫API文檔的框架。 其他的框架…

Project為項目設置預算

假設項目預算10萬元,如果項目完成后,花費沒有超過10萬元,則成本管理是成功的,如果花費了11萬,則超過了預算。 預算是10萬,一般目標成本設得比預算成本低,比如9.5萬。在項目實施過程中&#xff…

activiti7流程設計器_變頻空調器通信電路

通信電路由室內機和室外機主板兩個部分單元電路組成,并且在實際維修中該電路的故障率比較高,因此單設--節進行詳細說明。第三章變頻空調器單元電路對比和通信電路第二節通信電路通信電路由室內機和室外機主板兩個部分單元電路組成,并且在實際…

PyCharm 中為 Python 項目添加.gitignore文件

文章目錄 1.安裝.ignore插件 2.在項目中添加.ignore文件 1.安裝.ignore插件 在pycharm編譯器中,依次點擊File->Setting 在跳出Setting的頁面中,執行如下操作: 點擊左側的Plugins, 在搜索框中輸入.ignore 點擊右側的install 點…

mysql的分頁查詢

為什么80%的碼農都做不了架構師?>>> order by case when 的用法(實現特殊情況的排序,如leader1的排最前面): select * from m_worker_project order by CASE WHEN leader 1 THEN 100 ELSE 1000 END 項目中…

.describe() python_python的apply應用:一般性的“拆分-應用-合并”,附加詳細講解

跟aggregate一樣,transform也是一個有著嚴格條件的特殊函數:傳入的函數只能產生兩種結果,要么產生一個可以傳播的標量值(如np.mean),要么產生一個相同大小的結果數組。最一般化的GroupBy方法是apply,apply會將待處理的…

DNS服務(4)Slave DNS及高級特性

為了簡化運維人員的負擔,使用Master/Slave DNS架構的情況比較好,現在我們來簡單敘述一下Master/Slaver DNS的特點主DNS服務器:維護所負責解析的域內解析庫服務器;解析庫由管理員維護;從DNS服務器:從主DNS服務器或其它的…

python運算符_Python運算符總結

建議:字符串拼接操作盡量多用join,而減少用”“ join操作時會先計算字符操作所用到的空間總和大小,然后申請內存。然后進行字符串連接操作。所以join的時間復雜的近似O(n)。 操作符連接操作符時,由于字符串是不可變對象&#xff0…

jupyter notebook常用快捷鍵

Jupyter Notebook 有兩種鍵盤輸入模式。編輯模式,允許你往單元中鍵入代碼或文本;這時的單元框線是綠色的。命令模式,鍵盤輸入運行程序命令;這時的單元框線是灰色。 命令模式 (按鍵 Esc 開啟) Enter : 轉入編輯模式Shift-Enter : …

Eclipse安裝試用Hanlp

【1】確定正確安裝配置Java和Eclipse 【2】下載HanLp的各種東西 hanlp.linrunsoft.com/services.ht… 下載這四個文件到本地,我是放在桌面的一個文件夾了。【3】 把jar包導入到Eclipse 在Eclipse先新建一個項目File——New——Java Project--[名字:Hanlp…

升級pip最新版本

python很多庫對pip版本有要求,升級命令為: python -m pip install --upgrade pip windows在cmd下,輸入以上命令

bat 存儲過程返回值_使用Mybatis過程中遇到的坑

常規SSM框架開發中,mybatis遇到的坑是最多的,把以下幾點坑記錄下來防止以后再遇到同樣的情況。1、mybatis 若果在mapper中返回值沒有配置resultMap而是使用resultType直接返回的話,那么當心默認配置中的駝峰匹配規則,參考以下配置…

【洛谷 P2513】 [HAOI2009]逆序對數列(DP)

題目鏈接 這種求方案數的題一般都是\(dp\)吧。 注意到范圍里\(k\)和\(n\)的范圍一樣大,\(k\)是完全可以更大的,到\(n\)的平方級別,所以這暗示了我們要把\(k\)寫到狀態里。\(f[i][j]\)表示前\(1\)~\(i\)的排列逆序對數為\(j\)的方案數。 現在考…

think python下載 中文版開源!這或許是最經典的編程教材

《Think Python》是很多Python初學者的不二入門教材,受到廣泛好評。該書原作者是美國Olin工程學院的教授Allen B. Downey,目前該書的原版和中文版本都已免費開源。 中文版本譯者是一名自學Python的編程愛好者。選擇翻譯《Think Python》,一是…

datatable的數據進行組內排序_排序算法學習分享(四)希爾排序

排序,也稱為排序算法,可以說是我們學習算法的過程中遇到的第一個門檻,也是實際應用中使用得較為頻繁的算法,我將自己對所學的排序算法進行一個歸納總結與分享,如有錯誤,歡迎指正!排序算法學習分…

jupyter notebook 安裝代碼提示功能

效果 安裝成功后,輸入部分代碼,按 tab 鍵,會提示代碼 安裝步驟 1.安裝nbextensions 從國內的pip鏡像下載快 pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com jupyter_contrib_nbextensions jupyter contr…

轉:EL表達式的11個內置對象

原文地址&#xff1a;https://blog.csdn.net/qq_17045385/article/details/54799998 EL是JSP內置的表達式語言 JSP2.0開始&#xff0c;不讓再使用Java腳本&#xff0c;而是使用EL表達式和動態標簽來代替Java腳本 ############EL替代的是<%... %>&#xff0c;也就是說EL只…

python需要配置環境變量嗎_python為什么會環境變量設置不成功

學習python編程&#xff0c;首先要配置好環境變量。本文主要講解python的環境變量配置&#xff0c;在不同版本下如何安裝 Windows 打開Python官方下載網站 https://www.python.org/downloads/release/python-370/ x86:表示是32位電腦 x86-64:表示是64位電腦 目前Python版本分為…