余善恩, 李 真, 鄧文渝
(杭州電子科技大學自動化學院,杭州 310018)
當前,機器人系統最廣泛的一個應用就是獲取環境的信息,并且應用在對人類生存安全有著重要影響的一些場景,例如高空作業、有毒氣體泄露追蹤[1]、海洋環境監測及污染物追蹤[2-3]、遇險者營救以及起火源定位[4-5]和無線傳感器節點的信號追蹤[6]等。
本設計的四旋翼飛行器以TM4C123GH6單片機作為控制芯片,飛行器的姿態控制和動作功能在前期已經基本完成。本文主要研究系統在視覺處理方面的設計:基于OpenMV4和ARM A53環境,通過二次開發,實現對桿塔、線纜的檢測和條形碼、二維碼的照相。
如圖1所示為場地的示意圖,場地內敷設材料為各寬20 mm的灰白相間條紋,圖2為桿塔B上二維碼的位置示意圖。巡線機器人從距A桿塔1 m范圍內的起飛點起飛,以1 m定高繞桿巡檢,巡檢流程為:起飛→桿塔A→電力線纜→繞桿塔B→電力線纜→桿塔A,然后穩定降落;巡檢期間,巡線機器人激光筆軌跡應落在地面虛線框內。拍攝所發現線纜異物上的條形碼圖片和B桿的二維碼圖片存儲到SD卡,巡檢結束后在顯示裝置上清晰顯示。

圖1 場地桿塔與線纜示意圖(cm)

圖2 桿塔B二維碼位置示意圖
視覺系統的主要功能是通過攝像頭采集周圍環境圖像之后,得到當前位置和狀態,再將需要執行的指令用串口通訊發送給飛控,同時飛控也會把正在執行的指令狀態和高度等信息發送給視覺系統進行統籌決定。圖3為視覺系統的設計方案,包括了3個攝像頭5個任務。

圖3 視覺系統方案圖
攝像頭1主要用于獲取飛行器當前光流數據,即速度。由于場地是密集條紋,圖像出現摩爾紋干擾,市面上一般的光流模塊無法正常使用,所以需要自己來解決這個問題。對于密集條紋的地面,稀疏光流無法獲取有效的特征點,故選用稠密光流,但稠密光流對計算量要求較大。Raspberry Pi Model A+的CPU配置是ARM1176JZF-S主頻700 MHz,而OpenMV4搭載的是STM32H743VI主頻480 MHz。OpenMV4不能滿足高幀數的稠密光流計算,無法滿足飛行器飛行過程中對速度數據的需求,所以使用Raspberry Pi搭載OpenCV環境來實現。對于摩爾紋干擾,經過各種嘗試,最后通過使用長焦鏡頭,放大條紋間隔,提高幀數來解決[7-8]。
攝像頭2和3都是基于OpenMV4使用MicroPython來編寫程序的,OpenMV4相較于樹莓派來說更方便調試,可以即插即用,缺點是運行速度較低,需要在不同功能中切換來保證圖像采集和運算速度。
攝像頭2主要實現兩個任務。第1個是飛行器定點起飛時對黑色圓盤的檢測,將圓心坐標發送給飛控部分,保證在起飛過程中不會發生偏離。使用霍夫變換算法來檢測圓需要遍歷圓的半徑r,但飛行器起飛到指定高度過程中,攝像頭看到的圓半徑變化較大,如果直接遍歷這個半徑區間會極大地降低速度。所以這里融合了飛控發過來的高度信息,將不同高度區間分段成不同的半徑區間,這樣就極大地提高了圓的檢測速度和位置信息的有效性,同時也減小了誤判率[9]。第2個是路徑檢測,在完成定點起飛動作之后進入路徑檢測狀態,利用下方密集條紋的分布信息,檢測有條紋與無條紋區域的分界線,利用這條線為飛行器提供飛行參考坐標,避免路徑產生偏離。之所以不選擇線纜作為路徑參考坐標是因為線纜太細不易檢測,且飛行器高度的變化會對這個坐標產生影響,所以使用核濾波的方法對條紋進行多次濾波突出邊界線來實現更穩定的位置信息反饋[10]。
攝像頭3用于完成A、B黑桿的檢測以及條形碼、二維碼的檢測和拍照儲存。飛行器主要實現的動作流程如圖4所示。這個動作過程是由攝像頭3檢測信息時統籌飛控傳回當前任務狀態來判斷決策的,即在特定的位置發送動作指令控制飛行器執行相應動作。正常狀態下攝像頭獲取的是其最大可視范圍,這才能保證檢測到黑桿時及時地發出指令,避免響應不及時導致飛出場地。但條形碼無法在這樣的大視野低分辨率下清晰識別,所以要先檢測黃色物塊(條形碼背景色為黃色),在一定的圖像模糊處理后找出黃色物塊,以此黃色物塊為坐標讓飛行器定點暫停移動,再縮小圖像范圍提高分辨率拍下可識別的條形碼。二維碼在正常圖像視野范圍也能直接檢測到,但為了保證照片能夠準確識別,仍選擇相同方法放大圖像后拍照保存。飛行器繞B桿時需要按一定半徑飛行,避免撞桿或者偏離軌道,但黑桿較細無法用超聲波或者激光測距模塊獲取距離數據,為了減小復雜程度,增加閉環穩定性,這里選擇用圖像中黑桿的面積或寬度換算成飛行器與桿的距離,實現了單目攝像頭測距功能[11]。

圖4 飛行器動作流程
3個攝像頭的安裝位置如圖5所示。攝像頭1檢測并向飛控發送光流數據(始終運行)。飛行器定點起飛的過程中攝像頭2檢測圓并返回圓心坐標,計時結束后發送巡線指令。在巡線狀態下攝像頭2處理下方條紋圖像并返回邊界坐標固定飛行器的Y軸。攝像頭3開始檢測黃色異物以及黑桿,檢測到黃色異物時發送定點指令返回黃色異物坐標固定飛行器X軸;定點穩定后,放大圖像并拍攝條形碼,拍攝之后發送指令繼續巡線。同理,檢測到B桿后發送B桿坐標定點,攝像頭3放大圖像并拍攝二維碼,拍攝結束發送繞桿指令,返回桿坐標以及離桿距離,直到飛控返回繞桿結束信息。繞桿結束后繼續巡線,直到檢測到黑桿A,發送黑桿坐標定點,準確定點后發送降落指令。

圖5 攝像頭位置實物圖
3個攝像頭協同工作,提供飛行器的速度信息,除高度以外的另外兩軸的位置信息,并通過對數據的優化處理和濾波,保證了飛行器的閉環穩定飛行控制。利用多傳感器的信息統籌決策,便于功能調試和切換,提高了整個項目方案的可行性和穩定性。
根據場地要求,場地內敷設材料為各寬20 mm的灰白相間條紋。當使用市面上的成品光流模塊來檢測飛行器飛行中的光流數據時,發現光流數據失效,甚至還產生了很大的干擾,導致無法正確地得知自己的瞬時速度。無法得到有效的光流數據有兩個主要原因,①由于場地的條紋導致拍攝得到的圖片產生了摩爾紋干擾,這種無規律的干擾對光流檢測有極大影響;②飛行器在移動過程中密集條紋本身光流檢測難度就比較大。本設計中,首先嘗試了通過使用稠密光流并選用更快的處理器得到更高的運行速度提升幀率,同時還從摩爾紋產生的原理出發去除摩爾紋帶來的干擾。
光流是指圖相中像素點的瞬時速度,包含了運動速度和運動方向信息,利用前后兩幀圖像中特征點位置變化的偏移及時間計算得到。而稠密光流對圖像中每個像素點都進行運算,所以準確率高,缺點是運算量很大。因為飛行器下方是密集條紋,用稀疏光流無法得到有效的光流數據,所以本設計中使用了OpenCV庫里的cv2.calcOpticalFlowFarneback()函數,利用Gunnar Farneback算法來實現利用稠密光流來獲取速度信息。
摩爾紋是指因為物理上的差拍原理產生的一種現象。因為場地是規律的密集條紋,所以具有固定的空間頻率,飛行器掛載的攝像頭,其光學元件也有相應的空間頻率。當這兩個空間頻率接近時,拍攝出的圖像就會出現摩爾紋。由于摩爾紋受拍攝角度和拍攝距離等影響,所以其產生幾乎是無規律不可預測的。圖6為拍攝時摩爾紋產生的原理。

圖6 拍攝時摩爾紋產生示意圖
飛行器需要光流數據,在有摩爾紋的情況下無法獲得有效的光流數據,光流數據會出現無規律的波動。要去除或者減少摩爾紋可以改變拍攝對象或者感光元器件的空間頻率、改變拍攝角度、改變拍攝距離。由于設計要求中飛行器與拍攝對象的角度和距離固定,那就只能考慮改變光學元件或者拍攝對象的空間頻率,也就是條紋密度。
本設計的解決方法是使用長焦鏡頭,放大了拍攝對象,改變了拍攝對象的空間頻率,并且適當減小了圖像視野,調節了分辨率,讓其可以在不產生摩爾紋的前提下保證高幀率地進行稠密光流的檢測,以獲得優質的光流數據[12]。
本設計中巡線是主要功能,需要飛行器能夠自主在A、B桿之間巡線。在巡線設計中采取的方案是以飛行器正下方的條紋場地邊緣為檢測目標,以此邊緣坐標為基礎加偏置來確定Y軸坐標。該方案需要檢測條紋敷設材料的邊緣,主要用到了核濾波、膨脹等圖像處理方法。
在從A桿到B桿再從B桿到A桿的中間還有一個關鍵動作,繞B桿180°。繞桿作為巡線的中間動作采取的方案是固定半徑半圓軌道旋轉繞桿,讓攝像頭3始終對準桿B,根據桿B坐標以及桿與飛行器的距離來確定飛行器的X、Y軸,讓飛行器在旋轉中繞桿飛行180°。
核濾波是一種對圖像濾波的濾波器,又叫卷積核。圖像求導是像素的顏色值在某一個方向變化的速度,即如果對X正方向求導,那么在這個方向上顏色變化大的點求導之后的值越大,也就是說可以利用求導這種方法把特定方向的顏色突變的線條標記出來。一個二維圖像的像素點周圍有一圈像素點,要獲取二維圖像顏色突變的像素位置即圖像輪廓,就需要用到一個二維的卷積核。在待處理圖像的每個像素點用卷積核進行對應元素乘積相加,也就是卷積計算,就可以得到相應的圖像。得到的圖像顯示原圖像的哪種特征與卷積核的選取有關。比如Sobel邊緣檢測算子可以強調邊緣相鄰的影響,或者高斯模糊也是用相同的原理。卷積核的中心元素去對準每一個像素點,相應元素乘積求和計算公式為:飛行器飛行場地的條紋如圖7所示,要求灰白條紋各寬20 mm,灰色的紅綠藍三原色參數為R-178、G-178、B-178,場地寬為±60 cm,場地外無條紋,如圖7中條紋上方邊緣可用Sobel算子濾波得到一條虛線,再通過膨脹等處理可得到圖7中條紋下方邊緣的直線。處理得到了這條直線就得到了巡線的Y軸坐標,即路徑數據。為了使飛行器在規定場地內飛行,在這個坐標上加合適的偏置,只要保證攝像頭能夠看到條紋邊緣即可[13]。


圖7 對條紋邊緣濾波示意圖
用MicroPython的morph()函數進行核濾波的圖像變換,這里運用到的卷積核是Sobel邊緣檢測算子,特別是:

可以將X軸的水平邊緣檢測出來,過濾掉不需要的條紋邊緣[14]。
黑桿檢測用到的方法是色塊檢測。一般情況下設定色塊的顏色閾值、檢測區域,在看見目標色塊時就可以檢測出來,但由于是側面的攝像頭,背景非常復雜。如果只設置顏色閾值會出現大量誤檢。所以在此基礎上還要限制色塊的長寬或者面積,過小或過大的都會被過濾掉,以提高檢測的準確性,設計中采用MicroPython里的image.find_blobs()函數來實現。
由于需要繞桿以固定半徑旋轉180°,所以需要在檢測到黑桿的基礎上得到飛行器離黑桿的距離。這里運用下式來實現單目攝像頭的測距。因為

即實際長度Lm和攝像頭里的像素Bpix成反比,等號右邊為一個常數。即“距離=一個常數/直徑的像素”,利用該式就可以得到距離數據進而實現繞桿旋轉的動作。但實際測試中發現由于黑桿較細且飛行器不能離桿太近,為了得到較快的運算速度,一般設置圖像分辨率為320×240,這導致一個像素點的波動很可能導致距離數據出現5~7 cm的波動。優化方案是檢測到黑桿后切換成640×480分辨率,同時為保證檢測速度只選取一個窄區域進行檢測,如圖8所示。因為桿的高不作為判斷元素,這樣切換分辨率既滿足了測距需要又不會對圖像幀數和視野范圍產生影響,取得了較好的效果。

圖8 黑桿的檢測
本設計中飛行器的第1個動作是以一個圓為起點定點起飛,并在達到指定高度后懸停,在該過程中要保證飛行器在圓心上方不發生偏離。另外,在巡線過程中還有額外任務,檢測并拍照保存條形碼和二維碼。檢測圓用到的方法是霍夫變換檢測圓,難度在于保證實時性;條形碼和二維碼檢測的難度在于保證拍照的清晰度。
一個圓可以用圓心坐標(a,b)和圓半徑r來確定,實際采集的圖像如果不考慮復雜背景,那就是一個單獨的圓,使用霍夫變換的方法就可以把這個圓的圓心坐標和半徑確定下來,也就檢測出了這個圓。檢測的過程一般是先對原圖進行邊緣檢測,如果圖像中有可見的圓,那么圓的輪廓必然會是前景點。在邊緣檢測之前可以對圖像做平滑濾波過濾掉噪聲,這樣得到的前景點更有效。得到了圓的輪廓后就可以估計圓心坐標和圓半徑了,先設置最小半徑、最大半徑以及半徑遍歷的分度值,以邊界點為圓心,以估計半徑為圓半徑,就可以得到如圖9右部分的圖形,當這些曲線的交點最多時,這個交點就是估計得到的圓心,得到這個點時的半徑就是估計得到的圓半徑。這就是霍夫變換檢測圓的方法。
在此基礎上還有一些優化的算法,比如霍夫梯度法,用到了Sobel算子計算梯度,可以得到圓到圓心的方向,同樣利用圓輪廓得到的前景點向圓心畫線,交點越多越可能是圓。
在實現時調用image.find_circles()函數就可以方便地使用霍夫變換檢測圓,但霍夫變換檢測圓也有缺點,比如圓半徑范圍較大時需要對半徑范圍進行遍歷導致計算量巨大;再比如無法檢測同心圓等。這就需要對半徑條件、檢測區域、圓估計的閾值進行合適的調試才能得到適用的檢測函數[15]。
檢測圓在本項目的運用場景是飛行器定點起飛,起飛點為一個已知圓。在起飛到達到規定高度的過程中,圖像中的圓半徑變化較大,為了保證程序運行速度和位置坐標的有效性,選擇了融合高度信息,將高度分段分別對應半徑區間的分段,在不同高度遍歷不同的半徑范圍,極大地提高了運行速度,也減小了誤檢的可能性。
條形碼的檢測使用了MicroPython的find_barcodes()函數,其支持所有的一維條形碼檢測。項目中使用該函數對圖像進行水平和垂直兩個方向的掃描。由于條形碼需要足夠的分辨率才可以被識別,所以需采用640×480分辨率進行檢測和拍攝。然而,在飛行器飛行過程中側部圖像檢測使用的是320×240分辨率,故無法檢測出條形碼并定位。考慮到條形碼背景色為黃色,如圖10所示,在分辨率較低的情況下可以對圖像進行高斯模糊等運算,將條形碼識別為一個黃褐色物塊。先通過色塊檢測發現條形碼,再讓飛行器暫停移動,以色塊坐標為位置信息進行定點,然后切換到高分辨率檢測條形碼并保存圖片。

圖10 條形碼示例
二維碼檢測需要對圖像畸變進行校正,但畸變矯正會加大運算量,為了免除畸變矯正過程,側面攝像頭可采用無畸變鏡頭,本設計中使用了lens_corr()函數來矯正。二維碼檢測的方案與條形碼檢測方案類似,因為二維碼位置固定在B桿,故當檢測到B桿時就可以停下再將攝像頭切換到高分辨率狀態檢測二維碼并拍照保存。本設計使用了MicroPython的find_qrcodes()函數來檢測二維碼。
設計的以TM4C123GH6芯片為主控芯片的四旋翼飛行器,在OpenMV4和ARM A53的環境下,通過3個攝像頭進行圖像采集及處理,實現了對桿塔、線纜的檢測和條形碼、二維碼的采集功能。主要完成:①對地面路況進行檢測,返回地面狀態和相關數據,實現對起飛點的識別和環形圓板的識別和定位;②對塔桿進行檢測,并返回相關數據,實現對飛行器與塔桿之間的距離控制和繞桿控制,同時實現對條形碼和二維碼的拍照和存儲功能;③對電線的狀態進行檢測,檢測異物的存在。飛行器基于超聲波、光流、慣性傳感器、3個攝像頭的數據,對其姿態、空間位置、速度進行控制。經過測試,設計的視覺系統有著較高的穩定性與可靠性,飛行器可以實現巡線、條形碼及二維碼的記錄功能,可擴展性強,可有效地應用到部分實際場景去。