陳塏格,張鳳濤,毛怡琳,李天益,王禹龍
(長春師范大學 工程學院,吉林 長春 130032)
工業技術的不斷升級使得越來越多的人力被機器所替代。而機械制造自動化進程中,其自動化技術不斷改良,甚至和許多新型工業技術融合,衍生出更高端的超越人力所及的機器操作能力,這其中就包括機器視覺技術[1]。機器視覺技術是模擬人類的視覺過程、具有感覺環境的能力和人類視覺功能的技術,它主要通過OpenMV傳感器從客觀事物的圖像中提取信息,進行處理得出結果后,最終應用到實際運行中。相較于人眼來說,機器視覺技術最大的優勢是速度快、信息量大、功能多。隨著科技的進步和我國經濟的快速提升,機器人領域的科研也一次次有了新的進步,機器人的分揀技術一直深受專業人士的關注,機器人和系件特性也在與時俱進[2],人們對機器視覺技術的應用越來越廣泛,基于機器視覺技術的智能堆碼起重機器人便是其中之一。本文著重描述智能堆碼起重機器人中的機器視覺部分。
智能堆碼起重機器人主要完成某品牌箱裝牛奶的分類、抓取、起重、搬運和碼垛等任務,奶箱上貼有不同形狀和顏色的標識,作為分類的重要標志,同時也對應著碼垛的位置信息,如表1所示。在整個控制系統中,視覺傳感器作為智能堆碼起重機器人的“眼睛”,安裝在機器人前進的方向并始終俯視地面。它將完成兩個重要任務:①對奶箱上標識的顏色和形狀進行識別,用以確定該箱牛奶的類別;②在機器人搬運過程中,對地面標識線進行偏差計算,并反饋給機器人,使機器人完成尋跡功能。
視覺傳感器選擇星瞳科技的OpenMV4模塊,該模塊集成了STM32F7系列的單片機,運行速度快,并且使用Python語言進行編程,使得機器視覺算法的編程變得更容易,同時OpenMV提供了專用的IDE編程環境,具有自動提示、代碼高亮、圖像跟蹤、debug終端等工具,使得編程更加便利。在OpenMV上可以完成各種圖像的識別算法,并且可通過編程實現串口輸出結果。機器人控制系統由Arduino MEGA2560作為控制核心,使用串口與OpenMV進行通信即可獲得視覺傳感器反饋的信息。OpenMV4作為從機接收主機發出的兩種指令:形狀顏色識別(用數字1表示)和位置偏差指令(用數字2表示),其工作流程如圖1所示。
表1 不同標識顏色、形狀、牛奶分類與碼垛位置的對應關系
Arduino MEGA2560作為主機向OpenMV發出兩種指令:形狀顏色識別和位置偏差指令。OpenMV接收到不同的指令,按照要求進行圖像識別并反饋對應的信息。
OpenMV作為從機,接收指令時對應的Python代碼如下:
uart = UART(3, 115200)
a=0
b=0
while(True):
clock.tick()
if uart.any():
a=uart.readline().decode().strip()
b=int(a)
if b==1:……#此處完成顏色和形狀識別
if b==2:……#此處完成距離偏差和角度偏差計算
圖1 視覺傳感器的工作流程
在識別過程中先通過圓形和方形識別標識的形狀,再確定標識的顏色。其中圓形和方形可直接調用系統函數find_circles()和find_rects()。
根據像素統計函數get_statistics()的結果中的l_mode()、a_mode()、b_mode()的范圍可確定顏色。注意,該范圍不是固定的,與環境光線、色塊亮度都有關系,需要經過實驗獲得。
以下為識別圓形的Python代碼,方形的識別與其類似,不再給出。
sensor.set_framesize(sensor.QQVGA)
img = sensor.snapshot().lens_corr(1.8)
for c in img.find_circles(threshold = 3500, x_margin = 10, y_margin = 10, r_margin = 10, r_min = 2, r_max = 100, r_step = 2):
area = (c.x()-c.r(), c.y()-c.r(), 2*c.r(), 2*c.r())
statistics = img.get_statistics(roi=area)
if 0 img.draw_circle(c.x(), c.y(), c.r(), color = (0, 255, 0)) print(“紅色圓形”) else: if 0 img.draw_circle(c.x(), c.y(), c.r(), color = (0, 255, 0)) print(“藍色圓形”) 三角形先識別標識的顏色,再確定標識的形狀,調用的是系統函數find_blobs(),找到的色塊面積與其外接矩形面積的比值為1/2,即可確定其為三角形。實際使用過程中是圍繞1/2的一個數字范圍。以下為識別三角形的Python代碼: for blob in img.find_blobs(R_thresholds,pixels_threshold=200,roi = (0,0,320,240),area_threshold=200): if blob.density()>0.25 and blob.density()<0.6: print("紅色三角型") else: #占空比太小的都是干擾可忽略。 print("no dectedtion") for blob in img.find_blobs(B_thresholds,pixels_threshold=200,roi = (0,0,320,240),area_threshold=200): if blob.density()>0.25 and blob.density()<0.6: print("藍色三角型 ") else: #占空比太小的都是干擾可忽略。 print("no dectedtion") OpenMV作為尋跡傳感器,需要先識別出行走路徑上的引導線,然后再調用rho()函數,通過abs(line.rho())-imgTrack.width()/2計算距離偏差。調用theta()函數可直接獲得引導線的偏差角,但theta()函數獲得的角度范圍為0~180°,需減掉90°,映射到-90°~90°之間。以下為偏差計算的Python代碼: sensor.set_framesize(sensor.HQQVGA) CheckForm = 0 imgTrack = sensor.snapshot().binary([THRESHOLD]) line = imgTrack.get_regression([(100,100)], robust = True) if (line): rho_err = abs(line.rho())-imgTrack.width()/2 if line.theta()>90: theta_err = line.theta()-180 else: theta_err = line.theta() imgTrack.draw_line(line.line(), color = 127) if line.magnitude()>8: print(rho_err,theta_err) 本文中每個機器人的視覺傳感器是相互獨立的。從生產車間的實際情況出發,當生產線的數量過多或生產速度提高時,一臺機器人搬運貨物會顯得力不從心[3],這時需要增加機器人的數量來解決問題。為每個機器人分配一條引導線,可有效規避與其他機器人發生碰撞。同時,對于不同種類的箱裝牛奶,機器人可完成自動掃描,并準確地將其投遞至相應位置,從而解放勞動力,提高貨物分揀效率[4]。隨著科技的進步,視覺技術機器人因其防錯性、安全性、低成本、高效率等優勢將被廣泛應用。本文將為其他以OpenMV作為視覺傳感器應用的設計方案提供一定的參考。5 尋跡算法
6 結束語