朱成彪 ,張陸翔 ,2,趙奉奎
(1.南京林業大學,江蘇 南京 210037; 2.南京奧聯新能源有限公司,江蘇 南京 210037)
隨著國家大力支持研發和使用智能設備,AGV(Automated Guided Vehicle)小車憑借其智能化、自動化和高柔韌性等優點,應用范圍越來越廣。 除了物流行業,AGV 小車還被廣泛地應用在汽車、醫藥、化工等行業中。 AGV 小車的運用,有利于優化產業結構,提高生產效率和加快物流等產業的升級。
AGV 小車智能高效的運作離不開可靠的引導方式, 目前主流的引導方式主要包括電磁引導[1]、慣性引導[2]、激光引導[3]和視覺引導。 Hyunhak Cho等人(2017)提出了利用磁編碼器的電磁引導AGV系統[4]。 李照和舒志兵(2017)提出利用模糊算法來調控AGV 兩個主動輪速度從而優化電磁引導AGV 系統[5]。 Ti-chun Wang(2020)提出了基于多傳感器的慣性引導AGV 系統[6]。張東等人(2019)提出利用模糊 PID 算法優化慣性引導 AGV 系統[7]。Kyunghoon Jung(2014)提出利用無跡卡爾曼濾波器和模糊推理系統進行定位改進的激光引導AGV 系統[8]。 王心越(2019)等人設計了用于汽車防撞預警的激光引導 AGV 系統[9]。劉康婷(2021)等人研究了基于視覺引導的AGV 系統[10]。 與前三種引導方式相比,視覺引導具有設備成本低、識別能力強、不易積累誤差和高柔韌性等特點[11-12]。
本文從引導線檢測和轉向控制兩方面入手,設計了基于視覺引導的AGV 系統, 并通過試驗證明搭載該系統的小車可以完成自動引導。
如圖1 所示是AGV 小車的結構圖, 小車包括Jetson Nano 主板、散熱器、攝像頭、無線網卡、天線、碳纖維底盤、橡膠輪胎、電機、舵機和避震器等部分。圖2 是AGV 系統的基本框架,小車通過攝像頭獲取前方路徑的圖像信息, 將信息傳入Ubuntu 操作系統中,在Ubuntu 操作系統內利用Python 語言對圖像信息進行處理和分析。 Ubuntu 操作系統運行在Nvidia Jetson Nano 主板中, 程序將根據圖像信息處理結果將AGV 轉向和驅動命令通過IIC 發送給驅動板, 驅動板則對舵機和電機進行驅動,實現AGV 小車的循跡行駛。

圖1 AGV 小車結構圖Figure 1 AGV Car structure diagram

圖2 AGV 系統的基本框架Figure2 Basic framework of AGV system
引導線檢測是本系統設計的基礎,檢測流程如圖3 所示。 首先通過 Canny 算法,對攝像頭獲取的圖像信息進行邊緣檢測, 檢測出圖像中的邊緣信息;再利用ROI 函數進行剔除操作,將車道外的邊緣信息剔除,只保留需要的區域,通過霍夫變換將該區域內的邊緣信息進行整合分類,利用離群值過濾去除分類里誤差較大的邊緣信息;最后通過最小二乘擬合將處理好的邊緣信息進行擬合,并使用畫線函數將擬合得到的線段在圖像上繪制出來以便后續操作。

圖3 邊緣檢測流程圖Figure 3 Flow chart of edge detection
進行引導線檢測的第一步就是通過邊緣檢測將圖片的邊緣信息提取出來,之后再判斷這些邊緣是否屬于引導線, 所以說邊緣檢測是很重要的環節。 機器視覺上進行邊緣檢測,一個通用的算法為Canny 算法。Canny 算法的基本步驟依次為:利用高斯模糊去除噪聲、計算梯度的方向和大小、對梯度幅值進行非極大值抑制、選擇閾值、檢測和連接邊緣等[13-14]。 Canny 算法中梯度方向 θ 和大小 M 的計算公式如式1 所示。

Canny 算法是通過求取圖像上每一個像素點周圍像素變化的梯度來確定這個點是不是邊緣[15]。圖4 是Canny 邊緣檢測示例圖,圖中橫向為梯度方向,沿著梯度方向有三個點:C,A 和B,可以很明顯看到A 點是處在邊緣上的點,B 點和C 點沒有處在邊緣上。沿著梯度方向對這三個點周邊的像素值求梯度,會發現C 點左右像素值大致相等,沿著橫向方向的梯度接近于0,B 點同理。 而對于A 點,其左右像素值相差較大,對其左右兩邊的像素值求梯度,A 點處的梯度值會非常大。因此,可以通過求某點周圍像素值的梯度來反映其是否是邊緣點,如果該點左右兩邊梯度值較大,則該點便極大概率為一個邊緣點。

圖4 Canny 邊緣檢測示例圖Figure 4 Flow chart of edge detection
在實際的引導線檢測過程中,往往還會受到許多其他因素影響,例如光照、攝像頭像素等。受到這些因素的影響,會導致檢測出現錯誤,此時就需要利用Canny 算法對梯度設上閾值和下閾值,如圖5所示。

圖5 上下閾值示例圖Figure 5 Example diagram of upper and lower thresholds
對于一些梯度超過上閾值的點, 如圖中的A點,則認為A 點是個邊緣點。 然后對于那些梯度小于下閾值的點,如圖中D 點,則認為D 點不是一個邊緣點。然而還有一些點的梯度正好介于上閾值和下閾值之間,如圖中B 點和C 點,這兩點有可能是邊緣點,也有可能不是邊緣點,無法對B 點和C 點進行準確判斷。 對此,Canny 算法中應用了關聯討論:將梯度高于上閾值的點稱為強邊緣點,如強邊緣A 點; 將梯度在上閾值和下閾值之間的點稱為弱邊緣點,如弱邊緣B 點和弱邊緣C 點。 任何一個弱邊緣點,如果它與強邊緣點相連,如圖中弱邊緣B 點與強邊緣A 點相連, 此時就認為B 點是真正的邊緣點;如果弱邊緣不與強邊緣相連,如圖中C點,則認為C 點不是一個邊緣點。 通過這種方式,即可實現弱邊緣的檢測處理。 本論文調用OpenCV函數庫中的cv2.Canny 函數對圖像進行Canny 算法檢測。Canny 邊緣檢測結果如圖6 所示,圖6a)為原始圖片,圖6b)為Canny 邊緣檢測的結果。 由圖可知,利用Canny 邊緣檢測可以準確提取出圖像中的邊緣信息。

圖6 Canny 邊緣檢測結果圖Figure 6 Canny edge detection result graph
通過前文的Canny 邊緣檢測算法,成功提取圖像中的邊緣信息,這些邊緣信息里,既包括小車運行車道的邊緣信息,也包括其他車道部分的邊緣信息。 圖像中其他車道部分的邊緣信息,對于檢測引導線來說是沒有意義的,會造成干擾,所以需要把這些無關的信息剔除。因為本文檢測數據集的特殊性,小車運行車道的圖像信息一直分布在圖像中一個類似梯形的區域內,如圖7 所示。

圖7 感興趣區域示例圖Figure 7 Example map of the region of interest
此時需要使用 ROI(Region of Interest)函數,把圖像中這個梯形區域以外的那些邊緣信息剔除掉,只保留梯形區域里的信息,這樣就實現了對這些無關信息的過濾剔除。本論文通過調用OpenCV 函數庫中的 cv2.fillPoly 函數, 并結合圖 7 中 1 號點、2號點、3 號點和4 號點的像素坐標進行感興趣區域提取。 感興趣區域提取結果如圖8 所示。

圖8 感興趣區域提取結果Figure 8 Region of interest
通過前文感興趣區域的提取獲取了圖中兩條引導線所在的梯形區域。下一步將利用這個梯形區域,從中提取出屬于引導線的線段,從而得到這兩條引導線的具體位置, 此時就需要用到霍夫變換。霍夫變換的基本原理是利用點和線的對偶性,即在原始二維圖像坐標系下的一個點對應了參數坐標系中的一條直線;同樣,參數坐標系的一條直線對應了原始二維坐標系下的一個點,原始坐標系下直線上所有的點,它們的斜率和截距是相同的,所以它們在參數坐標系下對應于同一個點。這樣在將原始坐標系下的各個點投影到參數坐標系下之后,看參數坐標系下有沒有聚集點,類似的聚集點就對應了原始坐標系下的直線[15-16]。
因為引導線分為左引導線和右引線,兩條引導線存在差異,所以在進行霍夫變換前需要先定義一個按照斜率分類的函數,將檢測出來的線段按照斜率分成兩類,即一類是左引導線,另一類是右引導線。 本文通過調用OpenCV 函數庫中 cv2.Hough LinesP 函數進行霍夫變換。霍夫變換檢測結果為左引導線分類里有77 條線段,右引導線分類里有74條線段。利用霍夫變換成功將感興趣區域中的線段進行整合分類。
利用霍夫變換成功將所有感興趣區域內的線段按照斜率分成了左引導線和右引導線兩類,但是其中可能會有一些誤差線段。霍夫變換一共識別出151 條線段,這些線段并不全屬于左引導線或右引導線,其中可能包含無用的線段,例如噪點的連線也會被識別成一條線段。 這些點需要過濾掉。 通過對Canny 邊緣檢測結果圖的觀察可以發現引導線共同的一個特征,就是屬于引導線的線段的斜率應該是大致相同的。 對此,可以求梯形內所有的線段集合,取斜率,找那些斜率與平均斜率相差特別大的線段,即為不屬于需要檢測的引導線。 在此就需要使用離群值過濾函數。
本論文通過使用函數reject_abnormal_lines(lines,threshold=0.2),函數中 threshold 參數的閾值設置為0.2, 即如果某條線段的斜率與平均斜率相差超過0.2 就會被檢測出來。 利用剔除函數將被檢測出來的線段進行剔除, 通過不斷循環此函數,直到所有線段的斜率與平均斜率相差都小于或等于0.2,就完成了離群值過濾,利用保留下來的線段完成后續檢測。離群值過濾檢測結果為左引導線分類里保留69 條線段, 右引導線分類里保留52 條線段。通過使用離群值過濾可以成功將斜率誤差較大的線段去除,與霍夫變換檢測結果相比,共去除了30 條線段。
通過離群值過濾去除了分類里的誤差線段,保留了符合檢測要求的線段,此時需要使用最小二乘擬合將左引導線和右引導線分類里的線段各擬合成一條線段[16]。本論文通過調用函數np.polyfit 進行最小二乘擬合,并利用畫線函數將擬合得到的線段在原圖上繪制出來以便后續操作,繪制結果如圖9所示。

圖9 引導線檢測結果Figure 9 Leading line detection results
利用檢測出的引導線信息可實現小車在車道內的直線運行,但對于一個AGV 系統,還需要考慮小車的自動轉向問題。 對此,需要在上文的引導線檢測基礎上,再添加檢測一條輔助線,來幫助實現AGV 智能小車的轉向控制。 本論文中選擇通過檢測AGV 小車行駛路徑上一段連續路徑的中心線,并將檢測得到的線段作為輔助線, 圖10 為轉向輔助線檢測結果。 當路徑發生轉向時,中心線也會發生偏移,檢測出來的輔助線也會發生偏移,而輔助線偏移的方向就是AGV 智能小車行駛路徑前方路段的變化方向。

圖10 轉向輔助線檢測圖Figure 10 Inspection diagram of steering assist line
通過對路徑中心線的檢測,得到了用于辨別方向變化的輔助線, 但是AGV 智能小車的轉向控制還需要得到偏移角度,對此需要求出轉向輔助線的斜率。 在普通的二維坐標系中,想要得到一條線的斜率,只需要這條線上的兩點就可以完成,在圖像的像素坐標系中也是類似。 利用坐標檢測函數,對轉向輔助線兩個頂點進行檢測, 得到這條線段兩個頂點的像素坐標 P1(X1,Y1)和 P2(X2,Y2),利用這兩個頂點坐標就可以求出這條輔助線的斜率K。考慮到AGV 智能小車實際行駛的路徑情況,有一部分的路線是直線,此時沒有轉向的需求,因此需要在求取斜率時檢測兩個頂點坐標的第一個值是否相同。
本論文通過使用IF 判斷函數, 用以判斷兩頂點像素坐標的第一個數值的差是否為0, 即判斷(X2-X1)是否為 0。 如果為 0 則代表 AGV 智能小車運行前方路徑沒有發生轉向,后續轉向控制就不需要執行;如果不為0,則代表AGV 智能小車運行前方路徑發生轉向,需要執行后續轉向控制。 本文使用函數 K=(y2-y1)/(x2-x1)求取斜率,利用該方法成功得到轉向輔助線的斜率K。
利用兩個頂點像素坐標成功求得轉向輔助線斜率K 之后, 此時就需要使用反三角函數中的反正切函函數,如圖11 所示,利用公式S=arctanK 得到輔助線與像素坐標中X 軸的夾角S,然后再利用D=90°-S 就可以得到AGV 智能小車行駛前方路徑相對于小車當前行駛方向的偏轉角度。

圖11 偏移角度示例圖Figure 11 Example diagram of offset angle
通過利用輔助線得到AGV 智能小車的偏移角度,AGV 智能小車就可以利用這個數據進行方向修正以實現轉向。 但在方向修正之前,還需要進一步處理, 因為AGV 智能小車本身行駛時可能會有一個初始轉向系數。 這里用A 表示這個轉向系數,A0表示初始轉向系數, 正常情況下轉向系數A 的取值區間為(-1,1),其中-1 和 1 表示小車完全向左轉和完全向右轉。 如果直接用這個初始值A0加上前文得到的偏移角度D,會因為兩個數據類型不同而產生錯誤,無法實現方向修正。因此,需要使用AGV 智能小車自帶的PID 控制將前文得到的偏移角度轉化為實際的轉向系數A1, 將轉向系數A1輸入AGV 智能小車舵機驅動控制系統中替換初始值A0,讓舵機調整小車行駛方向,從而完成轉向控制。PID 比例微分積分控制, 其公式如式2 所示。 PID控制器的參數選擇必須考慮動態和靜態性能指標的要求。 通過試驗得到優化的Kp、Ki和Kd三個參數值,從而完成轉向控制。

通過引導線檢測和轉向控制兩部分的設計,便完成了基于機器視覺引導的AGV 系統, 將系統傳入小車開始試驗。AGV 小車運作流程如圖12 所示。

圖12 AGV 小車運作流程圖Figure 12 Operation flow chart of AGV trolley
擺好并啟動小車后, 驅動電機控制小車向前行駛,車載攝像頭會不斷獲取前方路徑圖像信息,然后將信息傳入Jetson Nano 主板中。 主板會根據代碼指令對圖像信息進行分析處理, 得到小車當前的行駛數據和小車運行前方的路徑信息, 并通過這些數據判斷小車是否需要轉向。 如果需要轉向, 就會將利用輔助線計算得到的偏移角度發送給小車里的PID 控制,PID 控制利用偏移角度計算得到小車需要的轉向系數, 將轉向系數傳給小車的舵機驅動,舵機驅動控制舵機使小車完成轉向。如果不需要轉向就判斷小車是否需要停車, 如果需要停車就停止驅動電機,使小車結束運行;如果不需要停車, 就再通過攝像頭獲取新的路徑信息進行數據處理和后續的判斷操作。 通過不斷循環收集數據、處理信息和判斷執行等操作,以此完成小車的自動引導。
本文主要介紹了基于視覺引導的AGV 系統設計,系統主要通過引導線檢測和轉向控制兩部分實現。系統試驗中引導線檢測程序能夠準確檢測并提取引導線,信息分析程序能夠對提取到的引導線信息進行正確分析處理,并且控制程序能使小車自動沿引導線行駛。 試驗結果表明基于機器視覺的AGV 小車能夠實現自動引導功能。