度系統(tǒng)全解析:從任務(wù)分配到交通管理,解決多車并發(fā)與死鎖難題)
凌晨一點(diǎn)半我被現(xiàn)場(chǎng)值班工程師的電話叫醒。對(duì)方說兩輛AGV在成品庫通道里面對(duì)面頂住了后面拖著整托盤鈑金件誰也動(dòng)不了后臺(tái)只顯示任務(wù)超時(shí)卻沒有明確報(bào)錯(cuò)。我打開調(diào)度系統(tǒng)的實(shí)時(shí)拓?fù)鋱D一看兩輛車確實(shí)停在同一條雙向路段的中間前后各有任務(wù)在排隊(duì)等待整個(gè)區(qū)域的搬運(yùn)已經(jīng)停擺了十分鐘。這種經(jīng)歷做AGV項(xiàng)目實(shí)施的人應(yīng)該都不陌生。說得直白一點(diǎn)AGV調(diào)度系統(tǒng)真正的考驗(yàn)從來不在驗(yàn)收演示而是在多車并發(fā)、任務(wù)突發(fā)、設(shè)備故障的深夜。這篇文章我想從頭到尾梳理一遍AGV調(diào)度系統(tǒng)它到底在調(diào)度哪幾樣?xùn)|西、核心架構(gòu)長(zhǎng)什么樣、主流的調(diào)度和交通管理算法怎么選、怎么和MES/WMS配合以及我在多個(gè)項(xiàng)目里踩過的那些真正傷筋動(dòng)骨的坑。如果你是剛接觸智能物流的工程師或者正準(zhǔn)備上AGV項(xiàng)目的產(chǎn)線管理者這篇文章應(yīng)該能幫你省下不少試錯(cuò)費(fèi)。1. 先搞清楚調(diào)度對(duì)象AGV調(diào)度系統(tǒng)到底在調(diào)度什么1.1 表面上調(diào)的是車實(shí)質(zhì)上調(diào)的是任務(wù)、路徑和資源如果只說AGV調(diào)度系統(tǒng)就是調(diào)車這句話對(duì)但很容易誤導(dǎo)人。只盯著車你會(huì)沒法解釋很多現(xiàn)場(chǎng)情況。比如兩輛車同時(shí)空閑A車距離任務(wù)點(diǎn)5米B車距離8米為什么調(diào)度系統(tǒng)選了B車因?yàn)樵谡鎸?shí)業(yè)務(wù)里決策維度至少有四個(gè)層面任務(wù)緊急程度、車輛可用狀態(tài)、路徑通行代價(jià)、未來一段時(shí)間的任務(wù)預(yù)測(cè)。只看距離是典型的局部最優(yōu)思維。所以做項(xiàng)目時(shí)我習(xí)慣把調(diào)度對(duì)象拆成三部分講清楚任務(wù)流任務(wù)來源、優(yōu)先級(jí)、節(jié)拍要求、超時(shí)閾值。產(chǎn)線換料和成品入庫緊急程度完全不同。路徑資源節(jié)點(diǎn)、路段、站點(diǎn)、充電位、禁行區(qū)。路徑不是一條線而是一張共用路網(wǎng)。車輛資源位置、姿態(tài)、電量、載重、自動(dòng)或人工模式。每輛車在不同時(shí)刻的可用性都不一樣。這三部分相互耦合。舉個(gè)例子A點(diǎn)急需一批物料但離A點(diǎn)最近的AGV電量只剩18%單程過去要10分鐘來回20分鐘按當(dāng)前電量可能回不到充電樁。如果系統(tǒng)只看距離直接把這臺(tái)車派出去最壞的結(jié)果是車在半路低電量報(bào)警任務(wù)沒完成還要再派一輛車去救援。調(diào)度系統(tǒng)真正要做的是在任務(wù)完成和車輛安全之間找平衡。1.2 地圖、站點(diǎn)、交通規(guī)則地基比算法更值得花時(shí)間調(diào)度系統(tǒng)運(yùn)行的前提是一套準(zhǔn)確的基礎(chǔ)模型。大量項(xiàng)目最后排查出來的根因往往是一些非常基礎(chǔ)的數(shù)據(jù)錯(cuò)誤。比如站點(diǎn)表里的坐標(biāo)和現(xiàn)場(chǎng)物理位置差了半米在寬通道里可能沒事到了巷道口就會(huì)頻繁觸發(fā)超差報(bào)警又比如地圖上有兩條路徑在拓?fù)渖蠜]有建立正確的連接關(guān)系A(chǔ)GV到了岔路口只能停下等人工處理。我建議項(xiàng)目啟動(dòng)前至少花兩周時(shí)間把這六類基礎(chǔ)數(shù)據(jù)核對(duì)完基礎(chǔ)數(shù)據(jù)作用常見問題站點(diǎn)表定義AGV可??课恢冒ㄉ舷铝宵c(diǎn)、充電位、緩存位站點(diǎn)坐標(biāo)與現(xiàn)場(chǎng)不一致任務(wù)到達(dá)后對(duì)不上位地圖拓?fù)涠x節(jié)點(diǎn)與路段的關(guān)系轉(zhuǎn)彎和變道邏輯岔路口缺節(jié)點(diǎn)車輛到路口無法轉(zhuǎn)向路徑規(guī)則單向、雙向、時(shí)段限行、禁行區(qū)域規(guī)則與現(xiàn)場(chǎng)物理隔離不一致車走了一半發(fā)現(xiàn)無路可走車輛參數(shù)車長(zhǎng)、轉(zhuǎn)彎半徑、最大速度、加速度參數(shù)與實(shí)際車輛型號(hào)不符路徑動(dòng)畫看著流暢但執(zhí)行偏差大充電資源充電樁位置、觸發(fā)電量、滿充策略充滿判據(jù)太嚴(yán)車輛長(zhǎng)時(shí)間占用充電位異常事件報(bào)警碼、故障碼、人工解除邏輯報(bào)警碼不統(tǒng)一運(yùn)營(yíng)人員看不懂只能重啟系統(tǒng)這六類數(shù)據(jù)看似枯燥但后期所有算法參數(shù)和調(diào)度決策都要建立在它們之上。很多軟件Demo演示流暢一到現(xiàn)場(chǎng)就各種問題往往就是交付前沒把基礎(chǔ)數(shù)據(jù)做扎實(shí)。1.3 分清調(diào)度系統(tǒng)和車載控制系統(tǒng)排錯(cuò)能省一半時(shí)間還有一個(gè)常見的概念混淆調(diào)度系統(tǒng)不等于車載控制系統(tǒng)。我習(xí)慣用三層模型來講業(yè)務(wù)系統(tǒng)層MES/WMS關(guān)心物料從哪到哪調(diào)度系統(tǒng)層關(guān)心哪臺(tái)車執(zhí)行、走哪條路徑、什么時(shí)候出發(fā)、誰讓誰車載控制層關(guān)心車沿著路徑怎么走穩(wěn)、怎么剎車、怎么避障調(diào)度系統(tǒng)做的決策最終要交給車載控制器執(zhí)行?,F(xiàn)場(chǎng)常見的車不動(dòng)了先判斷是哪一層的問題如果車載端報(bào)驅(qū)動(dòng)故障或安全急停調(diào)度系統(tǒng)再聰明也沒用如果車載端一切正常但調(diào)度系統(tǒng)不下發(fā)指令那就要查任務(wù)分配邏輯。把這一層一層排查的思路理清了比什么調(diào)試工具都有效。很多人一上車就懷疑調(diào)度算法結(jié)果查了半天是傳感器松了。2. 核心架構(gòu)拆解調(diào)度引擎、車載執(zhí)行與通信定位的三角關(guān)系2.1 調(diào)度引擎每時(shí)每刻都在回答三個(gè)問題調(diào)度引擎是整個(gè)系統(tǒng)的心臟。不管界面多花哨引擎的本質(zhì)是一個(gè)狀態(tài)循環(huán)接收任務(wù)、查詢車輛狀態(tài)、生成指派、下發(fā)指令、等待反饋、再次查詢。它每一輪決策其實(shí)是在回答三個(gè)問題誰去干根據(jù)任務(wù)優(yōu)先級(jí)和車輛狀態(tài)選出最合適的車輛怎么走計(jì)算一條當(dāng)前代價(jià)最小的路徑避開擁堵和禁行區(qū)怎么讓多車同時(shí)要經(jīng)過同一路段時(shí)決定誰先走、誰等待實(shí)際工程里的調(diào)度引擎通常包含任務(wù)管理、車輛狀態(tài)、路徑規(guī)劃、交通管理、指令收發(fā)五個(gè)模塊。這五個(gè)模塊各司其職但也耦合緊密。任務(wù)管理模塊排出優(yōu)先級(jí)隊(duì)列車輛狀態(tài)模塊實(shí)時(shí)更新電量與位置路徑規(guī)劃模塊輸出路線交通管理模塊決定鎖的申請(qǐng)與釋放指令收發(fā)模塊把結(jié)果下發(fā)給車輛。想提醒的是引擎的性能不完全等于算法先進(jìn)還取決于狀態(tài)同步的快慢。如果車輛狀態(tài)數(shù)據(jù)延遲三秒再好的決策算法也是閉著眼開車。2.2 車載執(zhí)行端不是聽話的啞巴車載控制器不是只執(zhí)行指令的工具它有自己的安全邏輯比如急停、避障、超差保護(hù)。這些邏輯如果調(diào)度系統(tǒng)一概不知就會(huì)出現(xiàn)決策前提失真的情況。舉一個(gè)真實(shí)場(chǎng)景一輛AGV在窄巷道橫移時(shí)激光雷達(dá)檢測(cè)到前方有異常凸起物自動(dòng)停車。如果車載端沒有把非任務(wù)性停車這個(gè)狀態(tài)實(shí)時(shí)上報(bào)給調(diào)度系統(tǒng)后臺(tái)會(huì)一直顯示車輛運(yùn)行中。調(diào)度系統(tǒng)以為車在往前走實(shí)際上車已經(jīng)停下五分鐘了接下發(fā)的任務(wù)分配全建立在錯(cuò)誤前提上。所以在設(shè)計(jì)通信協(xié)議時(shí)一定要明確狀態(tài)上報(bào)的粒度位置上報(bào)頻率、狀態(tài)變化事件、故障碼。寧可多花功夫定義消息字段也不能靠后臺(tái)輪詢猜現(xiàn)場(chǎng)。2.3 通信延遲和定位誤差直接影響調(diào)度策略選擇調(diào)度系統(tǒng)的決策質(zhì)量依賴實(shí)時(shí)數(shù)據(jù)而實(shí)時(shí)數(shù)據(jù)依賴通信鏈路和定位系統(tǒng)?,F(xiàn)場(chǎng)常用Wi-Fi、私有射頻、5G專網(wǎng)。不管用哪種通信延遲和丟包率會(huì)直接限制調(diào)度策略的選擇。假設(shè)一臺(tái)AGV的位置刷新頻率是1Hz那調(diào)度系統(tǒng)看到的車輛位置最多是1秒前的。如果現(xiàn)場(chǎng)車速2m/s車輛實(shí)際已經(jīng)跑出兩米按舊位置做避讓計(jì)算誤差就會(huì)放大。所以很多系統(tǒng)在計(jì)算路段占用和避讓距離時(shí)會(huì)引入位置余量或安全鎖距離本質(zhì)上是為通信和定位的不確定性留出緩沖。這部分可以這樣理解調(diào)度系統(tǒng)像一個(gè)交通指揮中心但它看到的車是有延遲的。如果指揮中心看到的畫面滯后嚴(yán)重它就不敢讓車高速密集通行。項(xiàng)目現(xiàn)場(chǎng)如果要求高節(jié)拍高效率通信和定位的投入不能省。2.4 部署形態(tài)本地機(jī)房還是邊緣計(jì)算調(diào)度系統(tǒng)通常部署在本地機(jī)房或現(xiàn)場(chǎng)邊緣服務(wù)器因?yàn)楫a(chǎn)線業(yè)務(wù)對(duì)實(shí)時(shí)性要求高不適合完全依賴公網(wǎng)云。部署形態(tài)會(huì)影響很多設(shè)計(jì)本地方案網(wǎng)絡(luò)延遲低但需要機(jī)房值守邊緣方案更靈活但要處理設(shè)備冗余和斷電恢復(fù)。有的項(xiàng)目在初期部署時(shí)只配了一臺(tái)服務(wù)器調(diào)度系統(tǒng)和數(shù)據(jù)庫都裝在同一臺(tái)機(jī)器上。車輛數(shù)少的時(shí)候沒問題到三十臺(tái)以上數(shù)據(jù)庫I/O和調(diào)度計(jì)算搶資源系統(tǒng)響應(yīng)就開始變慢。我的建議是數(shù)據(jù)庫和調(diào)度服務(wù)分開部署至少分開磁盤I/O路徑。這不是什么高深的架構(gòu)技巧但能明顯降低后期排障難度。3. 算法選型沒有萬能鑰匙只有適合現(xiàn)場(chǎng)的策略組合3.1 任務(wù)分配從先到先服務(wù)到動(dòng)態(tài)優(yōu)先級(jí)打分調(diào)度算法沒有絕對(duì)最優(yōu)只有在約束條件下較優(yōu)。最基礎(chǔ)的出發(fā)點(diǎn)是任務(wù)優(yōu)先級(jí)?;A(chǔ)場(chǎng)景用FCFS先到先服務(wù)任務(wù)均勻時(shí)簡(jiǎn)單穩(wěn)定。產(chǎn)線場(chǎng)景用優(yōu)先級(jí)隊(duì)列緊急換料、缺料呼叫可以插隊(duì)。高階場(chǎng)景用動(dòng)態(tài)打分把任務(wù)的緊急程度、車輛剩余電量、累計(jì)行駛里程、充電需求綜合加權(quán)。我一般建議先做靜態(tài)優(yōu)先級(jí)把業(yè)務(wù)規(guī)則固化跑通后再加動(dòng)態(tài)因子。如果一上來就上動(dòng)態(tài)打分參數(shù)一多現(xiàn)場(chǎng)稍有變化就難排查。很多項(xiàng)目喜歡一上來調(diào)各種權(quán)重參數(shù)結(jié)果系統(tǒng)像個(gè)黑盒出問題根本沒法定位。等業(yè)務(wù)規(guī)則穩(wěn)定了再把電量均衡、工作量均衡這些因子加進(jìn)去才是正路。3.2 路徑規(guī)劃不是直達(dá)最短就最好很多文章提到AGV路徑規(guī)劃上來就講Dijkstra或A*。A*確實(shí)是最常用的基礎(chǔ)算法但它解決的是最短通行代價(jià)問題。現(xiàn)場(chǎng)還要考慮其他因素路段擁堵程度、死鎖風(fēng)險(xiǎn)、單向限制、充電樁排隊(duì)。只按距離計(jì)算很容易選一條近路結(jié)果前面三輛車排隊(duì)效率反而更低。工程上常用的做法是給路段加權(quán)重通行時(shí)間、擁塞系數(shù)、是否有施工或封鎖。權(quán)重可以動(dòng)態(tài)調(diào)節(jié)。例如某條道路的通行代價(jià)在高峰時(shí)段自動(dòng)上調(diào)車輛會(huì)自動(dòng)選擇繞行。這有點(diǎn)像手機(jī)地圖的路況導(dǎo)航——不是距離最短而是預(yù)計(jì)到達(dá)時(shí)間最短。如果需求再復(fù)雜比如幾十臺(tái)車、上百個(gè)站點(diǎn)的大園區(qū)場(chǎng)景可以在A*基礎(chǔ)上引入分層規(guī)劃先規(guī)劃區(qū)域級(jí)路徑再規(guī)劃通道級(jí)路徑。分層規(guī)劃的好處是縮短計(jì)算時(shí)間避免每次任務(wù)都把全地圖跑一遍。很多商業(yè)系統(tǒng)性能差異表面上是算法不同實(shí)際上是搜索范圍和剪枝策略不同。3.3 交通管理誰先走、誰后走是調(diào)度水平的分水嶺交通管理是AGV調(diào)度里最容易被低估的部分。核心問題很簡(jiǎn)單同一時(shí)間某個(gè)路段只允許一輛車通過那該給誰行業(yè)里常見的策略有四種策略實(shí)現(xiàn)難度并發(fā)效率適用場(chǎng)景全路段鎖低低車少、路徑簡(jiǎn)單的項(xiàng)目分區(qū)域鎖中中大多數(shù)工廠與倉儲(chǔ)場(chǎng)景預(yù)留窗口高高高節(jié)拍、密集運(yùn)行速度調(diào)節(jié)高高車輛帶測(cè)速能力、復(fù)雜路況我個(gè)人的經(jīng)驗(yàn)是項(xiàng)目前期先用區(qū)域鎖區(qū)域劃分做得細(xì)一點(diǎn)穩(wěn)定后再根據(jù)瓶頸優(yōu)化為預(yù)留窗口。這樣甲乙方都容易接受——系統(tǒng)先安全跑起來再談效率提升。一上來就上預(yù)留窗口容易在參數(shù)調(diào)優(yōu)上耗費(fèi)大量時(shí)間項(xiàng)目周期撐不住。3.4 死鎖避免與恢復(fù)預(yù)防機(jī)制和兜底機(jī)制都得有死鎖是AGV多車調(diào)度的經(jīng)典難題。常見場(chǎng)景是兩輛車在一條窄通道里相向而行誰也退不了后面的車又堵上來形成一條死鏈。避免死鎖的思路主要有三種拓?fù)湓O(shè)計(jì)上避免交叉沖突路徑規(guī)劃時(shí)提前預(yù)占區(qū)域鎖粒度細(xì)化。這些屬于預(yù)防。但現(xiàn)實(shí)世界總有意外比如某個(gè)路段因臨時(shí)施工被封鎖原本設(shè)計(jì)好的單向環(huán)流被打亂死鎖就可能冒出來。所以系統(tǒng)必須具備死鎖檢測(cè)與自動(dòng)恢復(fù)能力。我在項(xiàng)目里采用過一套很樸素的救援流程每個(gè)任務(wù)設(shè)置最長(zhǎng)時(shí)間計(jì)時(shí)超時(shí)觸發(fā)異常流程調(diào)度系統(tǒng)先嘗試重新規(guī)劃路徑讓其中一輛車?yán)@行繞行行不通則下發(fā)原路退回最近岔路口指令退回也不成功再派人工介入同時(shí)把故障信息推送運(yùn)維群這套流程看起來不高級(jí)但非常管用。很多系統(tǒng)宣稱有防死鎖算法真正落地時(shí)還是得有這種最后防線。沒有兜底機(jī)制一旦生產(chǎn)高峰出問題整個(gè)區(qū)域停擺的損失會(huì)遠(yuǎn)超預(yù)期。4. 調(diào)度系統(tǒng)必須學(xué)會(huì)配合和MES、WMS、立庫的集成實(shí)戰(zhàn)4.1 上下游系統(tǒng)一條鏈任何一環(huán)掉鏈子都停擺在真實(shí)工廠里AGV調(diào)度系統(tǒng)從來不單獨(dú)存在。最常見的鏈路是這樣MES推送生產(chǎn)工單和物料需求WMS管理庫存和庫位告訴調(diào)度系統(tǒng)貨在哪、空庫位在哪AGV調(diào)度系統(tǒng)接收搬運(yùn)任務(wù)分配車輛執(zhí)行設(shè)備層包括充電樁、自動(dòng)門、電梯、輸送線、立庫堆垛機(jī)如果鏈路上的接口設(shè)計(jì)不嚴(yán)調(diào)度系統(tǒng)內(nèi)部邏輯再完美現(xiàn)場(chǎng)照樣出問題。最常見的坑是MES任務(wù)和WMS庫存信息不一致導(dǎo)致AGV跑到取貨點(diǎn)才發(fā)現(xiàn)托盤不在。這嚴(yán)格來說不是調(diào)度系統(tǒng)的問題但用戶看到的表象就是AGV又停在那里不動(dòng)了。所以做項(xiàng)目時(shí)第一件事不是調(diào)算法而是開接口對(duì)接評(píng)審會(huì)把數(shù)據(jù)流、異常反饋、超時(shí)兜底責(zé)任都攤到桌面上說清楚。4.2 接口設(shè)計(jì)三件套任務(wù)下發(fā)、狀態(tài)回調(diào)、心跳機(jī)制和外部系統(tǒng)對(duì)接協(xié)議通常可以歸為三類消息。不管用什么技術(shù)實(shí)現(xiàn)HTTP/REST、消息隊(duì)列、數(shù)據(jù)庫中間表邏輯上都要有任務(wù)下發(fā)上游把任務(wù)號(hào)、起始地、目的地、優(yōu)先級(jí)、物料信息推給調(diào)度系統(tǒng)狀態(tài)回調(diào)調(diào)度系統(tǒng)把任務(wù)處理狀態(tài)回傳例如接收、執(zhí)行中、完成、失敗心跳機(jī)制調(diào)度系統(tǒng)定期通知上游我還活著上游超時(shí)未收到心跳即可報(bào)警字段設(shè)計(jì)要考慮未來擴(kuò)展比如任務(wù)類型、業(yè)務(wù)批次號(hào)、節(jié)拍要求、協(xié)同工位號(hào)。我見過兩個(gè)系統(tǒng)因?yàn)槿蝿?wù)號(hào)字段不統(tǒng)一聯(lián)調(diào)了半個(gè)月才打通的案例。接口規(guī)范本身不復(fù)雜但一定要寫清楚、定死版本不能各改各的。4.3 和電梯、自動(dòng)門、立庫的握手邏輯必須有超時(shí)調(diào)度系統(tǒng)還要和物理設(shè)備握手。這里有個(gè)容易被忽略的細(xì)節(jié)任何設(shè)備都可能超時(shí)或故障調(diào)度系統(tǒng)必須定義等待多久算失敗。例如AGV進(jìn)入電梯調(diào)度系統(tǒng)向電梯控制系統(tǒng)發(fā)請(qǐng)求電梯響應(yīng)、到達(dá)樓層、開門的每一步都有時(shí)間開銷。如果某一步超時(shí)系統(tǒng)必須決定是繼續(xù)等待、換一臺(tái)電梯還是取消任務(wù)并上報(bào)異常。沒有超時(shí)處理機(jī)制一個(gè)電梯故障就能讓整個(gè)區(qū)域的任務(wù)全部懸掛最后連正常車輛也被卡在后面。4.4 數(shù)據(jù)一致性兩套系統(tǒng)都以為自己在管同一盤貨集成項(xiàng)目里最常見的數(shù)據(jù)問題是同一盤貨在不同的系統(tǒng)里狀態(tài)不一致。MES認(rèn)為任務(wù)已下發(fā)WMS認(rèn)為庫存還未扣減AGV調(diào)度系統(tǒng)認(rèn)為任務(wù)已執(zhí)行完成。生產(chǎn)數(shù)據(jù)出現(xiàn)分叉后后續(xù)所有庫存校驗(yàn)都會(huì)出錯(cuò)。解決思路是設(shè)立統(tǒng)一的任務(wù)狀態(tài)機(jī)。所有系統(tǒng)都遵循同一套狀態(tài)定義待接收、已接收、執(zhí)行中、已完成、已取消、異常。每個(gè)狀態(tài)變更由源頭系統(tǒng)發(fā)起通過消息隊(duì)列廣播給其他系統(tǒng)。狀態(tài)機(jī)定得越早集成階段扯皮越少。這塊工作不顯眼但后期穩(wěn)定性全靠它。5. 現(xiàn)場(chǎng)調(diào)試戰(zhàn)線拉長(zhǎng)后這些坑我基本都踩過5.1 死鎖復(fù)盤兩車面對(duì)面堵死根因在鎖釋放條件回到文章開頭的場(chǎng)景。兩輛AGV在窄通道里面對(duì)面堵死后臺(tái)只顯示任務(wù)超時(shí)。我排查時(shí)先看了路徑規(guī)劃確認(rèn)兩個(gè)任務(wù)的起點(diǎn)和終點(diǎn)確實(shí)都要穿過這條通道。再看交通鎖邏輯問題出在鎖的釋放條件上。當(dāng)時(shí)系統(tǒng)邏輯是車輛進(jìn)入路段時(shí)申請(qǐng)鎖到達(dá)路段終點(diǎn)后判斷能否進(jìn)入下一路段若能則釋放當(dāng)前鎖。這看起來沒問題。但當(dāng)兩輛車在通道中間相遇且通道寬度不允許錯(cuò)車時(shí)死鎖發(fā)生了——兩輛車都停在通道內(nèi)誰也無法前進(jìn)到下一個(gè)路段終點(diǎn)鎖就永遠(yuǎn)不釋放。調(diào)度系統(tǒng)等不到釋放消息就不派新任務(wù)整個(gè)區(qū)域卡死。復(fù)盤結(jié)論鎖的管理不能只依賴車輛到達(dá)終點(diǎn)這個(gè)事件還要考慮車輛無法前進(jìn)的異常狀態(tài)。車載端一旦檢測(cè)到前方阻擋或位置偏差應(yīng)該主動(dòng)上報(bào)讓調(diào)度系統(tǒng)啟動(dòng)繞行或救援流程。5.2 任務(wù)分配不均某幾輛車總是很忙電量長(zhǎng)期失衡還有一次系統(tǒng)表面運(yùn)行正常但看后臺(tái)數(shù)據(jù)發(fā)現(xiàn)3號(hào)車每天跑120個(gè)任務(wù)1號(hào)車只跑40個(gè)1號(hào)車電量長(zhǎng)期在95%以上。車少任務(wù)多時(shí)問題不明顯任務(wù)量上來后3號(hào)車因?yàn)轭l繁充電反而成為瓶頸。根因在任務(wù)分配算法里沒有加入電量均衡因子。當(dāng)時(shí)系統(tǒng)只按當(dāng)前位置和任務(wù)距離做最短匹配離得近的車被持續(xù)分配任務(wù)越跑越遠(yuǎn)最后不得不回充。后來把剩余電量和累計(jì)任務(wù)量加進(jìn)分配權(quán)重狀況立刻改善。順帶說一句充電策略也要一起考慮。是低電量回充還是任務(wù)間隙補(bǔ)電會(huì)直接影響可用車輛數(shù)。有些項(xiàng)目把車輛全部集中在固定充電位排隊(duì)導(dǎo)致高峰期無車可用問題往往不是車不夠而是充電策略太死板。5.3 網(wǎng)絡(luò)延遲導(dǎo)致的指令跳步起初根本查不出來某現(xiàn)場(chǎng)出現(xiàn)了一個(gè)很隱蔽的故障AGV經(jīng)常在轉(zhuǎn)彎時(shí)突然停下再重新起步。從后臺(tái)日志看調(diào)度系統(tǒng)每500ms下發(fā)一次運(yùn)動(dòng)指令車載端每200ms回復(fù)一次狀態(tài)一切似乎正常。后來抓包才發(fā)現(xiàn)現(xiàn)場(chǎng)Wi-Fi在某角落信號(hào)衰減嚴(yán)重指令丟失時(shí)車載端保護(hù)機(jī)制自動(dòng)停車但調(diào)度系統(tǒng)還沒感知到。這個(gè)問題的修復(fù)有三層網(wǎng)絡(luò)層面增加信號(hào)覆蓋、優(yōu)化漫游切換協(xié)議層面增加指令序號(hào)和ACK確認(rèn)車載層面調(diào)整超時(shí)保護(hù)參數(shù)丟一條指令不立即停車等待短窗口后降速過渡可能有人覺得這是通信問題不算調(diào)度問題。但從系統(tǒng)視角看調(diào)度策略必須把通信不確定性當(dāng)作輸入條件不能假設(shè)連接永遠(yuǎn)可靠。我后來養(yǎng)成的習(xí)慣是在項(xiàng)目進(jìn)場(chǎng)前先做網(wǎng)絡(luò)丟包壓測(cè)而不是等現(xiàn)場(chǎng)偶發(fā)再排查。5.4 地圖與實(shí)際偏差一個(gè)坐標(biāo)系帶來的連鎖反應(yīng)地圖精度是另一個(gè)高頻坑。AGV導(dǎo)航依賴地圖調(diào)度系統(tǒng)也依賴地圖。如果地圖坐標(biāo)系和現(xiàn)場(chǎng)實(shí)際布局存在偏差最典型的癥狀是車輛定位正常但停不準(zhǔn)到了站點(diǎn)誤差超出傳感器允許范圍系統(tǒng)不停報(bào)錯(cuò)連續(xù)卡住任務(wù)。這類問題排查起來極費(fèi)時(shí)間。因?yàn)閺恼{(diào)度日志看一切正常從車載端看定位結(jié)果也在正常范圍但就是和實(shí)際物理位置對(duì)不齊。最后發(fā)現(xiàn)是地圖拼接時(shí)某個(gè)區(qū)域的誤差被拉伸了幾處站點(diǎn)坐標(biāo)全部跟著偏。從此我做項(xiàng)目時(shí)多了一個(gè)要求地圖驗(yàn)收必須做點(diǎn)位穿越測(cè)試讓車輛實(shí)際跑一遍所有站點(diǎn)逐個(gè)核對(duì)停車精度而不是只在軟件里看路徑。6. 自研還是采購我的判斷標(biāo)準(zhǔn)和思路6.1 先盤三筆賬資金、團(tuán)隊(duì)、時(shí)間這是每個(gè)準(zhǔn)備上AGV項(xiàng)目的團(tuán)隊(duì)都會(huì)問的問題。我的判斷依據(jù)很簡(jiǎn)單自研不是買不起軟件的替代方案而是一種戰(zhàn)略選擇。如果只是采購一套系統(tǒng)用直接選成熟產(chǎn)品如果想形成自己的物流調(diào)度能力、多項(xiàng)目復(fù)用那再考慮自研。三筆賬要算清楚資金賬自研的軟件投入不僅是開發(fā)費(fèi)用還有后續(xù)升級(jí)維護(hù)、人員穩(wěn)定。如果每年只能招到一個(gè)兼職開發(fā)自研成本會(huì)遠(yuǎn)高于買系統(tǒng)。團(tuán)隊(duì)賬有沒有懂算法和通信協(xié)議的人。有五六個(gè)穩(wěn)定軟件工程師可以自研只有一兩個(gè)人且還要兼顧別的業(yè)務(wù)建議采購或外包。時(shí)間賬生產(chǎn)項(xiàng)目往往等不起。自研第一版通常要三到六個(gè)月穩(wěn)定運(yùn)行可能要一年以上成熟軟件最快幾周就能上線。6.2 如果采購選型時(shí)看哪些硬指標(biāo)如果決定采購不要只盯著宣傳材料里的算法先進(jìn)。我一般看這幾個(gè)硬指標(biāo)評(píng)估維度具體關(guān)注點(diǎn)地圖建模能力支持現(xiàn)場(chǎng)快速建圖嗎地圖更新流程方便嗎車輛接入能力支持多品牌AGV還是必須綁定同一家硬件接口開放性對(duì)外API是否齊全能否和現(xiàn)有MES/WMS快速對(duì)接擴(kuò)展性車輛從10臺(tái)擴(kuò)到100臺(tái)現(xiàn)有架構(gòu)是否需要重構(gòu)售后響應(yīng)故障處理流程、備件情況、關(guān)鍵模塊是否有冗余還有一個(gè)容易被忽略的點(diǎn)調(diào)度系統(tǒng)是否支持仿真回放。成熟產(chǎn)品一般都有離線仿真或歷史回放功能能在不占用現(xiàn)場(chǎng)設(shè)備的情況下復(fù)現(xiàn)故障、驗(yàn)證新策略。這個(gè)能力在項(xiàng)目調(diào)試期價(jià)值極高沒有它的系統(tǒng)出了問題時(shí)排查成本會(huì)成倍上升。6.3 如果自研建議從最小閉環(huán)開始如果決定自研強(qiáng)烈建議不要一開始就規(guī)劃成大而全的平臺(tái)。先做最小閉環(huán)一個(gè)調(diào)度引擎、一個(gè)簡(jiǎn)單通信服務(wù)、一個(gè)地圖編輯器。只要能實(shí)現(xiàn)任務(wù)下發(fā)給指定車輛車按指定路徑走完并回報(bào)就算成型。跑通以后再逐步增加交通管理、動(dòng)態(tài)避障、充電策略。我見過不少團(tuán)隊(duì)想一口氣做對(duì)標(biāo)頭部產(chǎn)品的系統(tǒng)結(jié)果半年過去還在搭框架。調(diào)度系統(tǒng)代碼量其實(shí)不大難的是細(xì)節(jié)而細(xì)節(jié)只有放在現(xiàn)場(chǎng)長(zhǎng)期跑才能發(fā)現(xiàn)。第一版不必完美但一定要能跑、能改、能復(fù)現(xiàn)問題。這套思路不管對(duì)最終做出來還是中途調(diào)整方向都是最穩(wěn)妥的。最后說點(diǎn)實(shí)在的。AGV調(diào)度系統(tǒng)不是靠一個(gè)算法、一個(gè)軟件就能跑好的它是基礎(chǔ)模型、調(diào)度策略、外部協(xié)同和現(xiàn)場(chǎng)調(diào)試經(jīng)驗(yàn)的綜合體。如果你正打算上一套AGV調(diào)度系統(tǒng)我建議先花時(shí)間把業(yè)務(wù)流程和數(shù)據(jù)流吃透再談技術(shù)選型。系統(tǒng)好不好最終不是看演示時(shí)車跑得多順暢而是看在生產(chǎn)節(jié)拍、突發(fā)故障、多車并發(fā)時(shí)它還能不能穩(wěn)住。那些深夜打來的電話才是真正的驗(yàn)收測(cè)試。