梁睿哲 李承蒙 謝祥平 謝昊璋 唐 亮
(桂林電子科技大學(xué)機(jī)電工程學(xué)院,廣西 桂林 541004)
RoboMaster機(jī)甲大師賽是大疆創(chuàng)新發(fā)起創(chuàng)建的機(jī)器人競(jìng)技與學(xué)術(shù)交流平臺(tái),其為我們提供了很好的計(jì)算機(jī)視覺(jué)應(yīng)用開(kāi)發(fā)平臺(tái),需要機(jī)器人在賽場(chǎng)實(shí)現(xiàn)識(shí)別追蹤、目標(biāo)檢測(cè)、預(yù)判以及精準(zhǔn)打擊等功能。本文基于RoboMaster2020~2021賽季比賽內(nèi)容,以機(jī)器人所需的視覺(jué)功能為背景,研究計(jì)算機(jī)視覺(jué)領(lǐng)域下的多種技術(shù)的開(kāi)發(fā)和應(yīng)用。
自動(dòng)瞄準(zhǔn)作為RoboMaster視覺(jué)中最基礎(chǔ)的功能,自動(dòng)瞄準(zhǔn)裝甲板大幅度提高打擊效率。機(jī)器人身上的裝甲板是主要承受傷害的區(qū)域,有兩根平行的燈條,中間是數(shù)字或者兵種圖標(biāo),所以需要從眾多的燈條中準(zhǔn)確地篩選出真正的裝甲板,以確定最佳目標(biāo)進(jìn)行瞄準(zhǔn)打擊[1]。
首先對(duì)從攝像頭獲取的圖像做預(yù)處理操作,好的二值化處理可以真實(shí)地還原燈條的輪廓,減少燈條的篩選錯(cuò)誤;以上一幀圖像的識(shí)別到的裝甲板為中心,從長(zhǎng)寬兩個(gè)方向擴(kuò)大合適的倍數(shù)作為ROI區(qū)域,可以減少跳變,再對(duì)ROI圖像進(jìn)行處理可以提高圖像處理的速度,提高數(shù)據(jù)的連續(xù)性,而后對(duì)找到的所有輪廓進(jìn)行篩選;將獲得的燈條放入數(shù)組中逐個(gè)進(jìn)行配對(duì),圖像中的燈條相對(duì)于真實(shí)的燈條可能會(huì)有一些變形,通過(guò)合成裝甲板的角度與燈條角度之差,刪除誤差較大的裝甲板,再通過(guò)RGB判斷燈條顏色是否為應(yīng)該識(shí)別顏色,最后通過(guò)BP模型判斷得到的裝甲板中間是否為數(shù)字或者兵種圖標(biāo),得到正確的裝甲板,并且保持了較高的圖像處理幀率。
通過(guò)燈條配對(duì)的裝甲板依然有誤識(shí)別現(xiàn)象出現(xiàn)的可能,所以需要判斷裝甲板中間是否有數(shù)字或圖標(biāo),我們采用了BP(back propagation)神經(jīng)網(wǎng)絡(luò)來(lái)分類(lèi)各種數(shù)字和圖標(biāo)。BP神經(jīng)網(wǎng)絡(luò)是一種多層前饋神經(jīng)網(wǎng)絡(luò),該網(wǎng)絡(luò)的主要特點(diǎn)是信號(hào)前向傳遞,誤差反向傳播?;舅枷胧翘荻认陆?,最終讓網(wǎng)絡(luò)的實(shí)際輸出值和期望輸出值的誤差均方差最小;訓(xùn)練的核心算法為前向傳播和反向傳播[2]。
研究表明,隱含層的節(jié)點(diǎn)數(shù)表示該網(wǎng)絡(luò)的數(shù)據(jù)處理能力。為了保證程序的運(yùn)算速度,這里BP模型的隱藏層只有一層,樣本的分辨率是20×20,隱藏層的結(jié)點(diǎn)為64。輸出層為7類(lèi),分別是數(shù)字1(英雄)、2(工程)、3(步兵)、4(步兵)、8(前哨站)、9(基地)、7(哨兵),因?yàn)槭褂么司W(wǎng)絡(luò)用于多分類(lèi),tanh函數(shù)在特征相差明顯時(shí)的效果會(huì)更好,在循環(huán)過(guò)程中會(huì)不斷擴(kuò)大特征效果,所以隱藏層激活函數(shù)使用了tanh函數(shù)。整個(gè)過(guò)程如下:
(1)樣本采集
我們采集了每個(gè)種類(lèi)的樣本圖片800張,樣本的亮度在一個(gè)范圍之內(nèi),可以減少燈光條件對(duì)識(shí)別的影響。
(2)數(shù)據(jù)預(yù)處理
將樣本處理成一個(gè)xml文件作為網(wǎng)絡(luò)訓(xùn)練的輸入文件。
(3)網(wǎng)絡(luò)訓(xùn)練
①先設(shè)置每層神經(jīng)元個(gè)數(shù),初始化權(quán)重。
②輸入訓(xùn)練文件。
③設(shè)置閾值、學(xué)習(xí)速率和激活函數(shù)。
④訓(xùn)練,達(dá)到停止訓(xùn)練的條件后停止。
⑤保存模型,樣本測(cè)試。
(1)坐標(biāo)變換
從相機(jī)中我們可以獲取到目標(biāo)在圖像上的位置,我們通過(guò)針孔相機(jī)模型來(lái)構(gòu)建這種從二維到三維的對(duì)應(yīng)關(guān)系。
針孔相機(jī)模型描述了三維空間中的點(diǎn)的坐標(biāo)與其在理想針孔相機(jī)的圖像平面上的投影之間的數(shù)學(xué)關(guān)系,將相機(jī)光圈視為一個(gè)點(diǎn),根據(jù)小孔成像原理來(lái)形成投影。針孔相機(jī)模型是理想化的模型,我們引入了畸變參數(shù)來(lái)修正形變,畸變參數(shù)可以在相機(jī)標(biāo)定過(guò)程中求得。在針孔相機(jī)模型下,我們可以用矩陣來(lái)表示坐標(biāo)系之間的線性關(guān)系,從而實(shí)現(xiàn)不同坐標(biāo)系下的坐標(biāo)相互轉(zhuǎn)換。我們用到了3個(gè)坐標(biāo)系:圖像物理坐標(biāo)系、圖像像素坐標(biāo)系、相機(jī)坐標(biāo)系。圖像物理坐標(biāo)系為二維平面坐標(biāo)系,用來(lái)描述投影實(shí)像中的點(diǎn),以投影像中心為原點(diǎn);圖像像素坐標(biāo)系用來(lái)描述二維圖像中的點(diǎn),原點(diǎn)一般為圖像左上角并以像素為單位;相機(jī)坐標(biāo)系為右手系,以相機(jī)光心為原點(diǎn)[3]。
根據(jù)小孔成像原理,我們可以得到相機(jī)坐標(biāo)與圖像物理坐標(biāo)之間的關(guān)系:
其中x、y為圖像物理坐標(biāo)系下的坐標(biāo),X,Y,Z為相機(jī)坐標(biāo)系下的坐標(biāo),fx、fy為相機(jī)焦距。
圖像物理坐標(biāo)系到圖像像素坐標(biāo)系的變換需要平移和縮放,使其原點(diǎn)重合單位統(tǒng)一,這種對(duì)應(yīng)關(guān)系可以這樣描述:
其中u、v為圖像像素坐標(biāo)系下的坐標(biāo),x、y為圖像物理坐標(biāo)系下的坐標(biāo),dx、dy為單位轉(zhuǎn)化系數(shù),u0、v0為圖像物理坐標(biāo)系原點(diǎn)在圖像像素坐標(biāo)系下的坐標(biāo)。
因此,圖像像素坐標(biāo)寫(xiě)成齊次坐標(biāo)形式后與相機(jī)坐標(biāo)之間的線性關(guān)系可以用矩陣描述為:
兩個(gè)矩陣的乘積即為相機(jī)的內(nèi)參矩陣,內(nèi)參矩陣與相機(jī)畸變參數(shù)可以由張正友標(biāo)定法求得。但圖像畢竟是二維的,想要求得三維世界中的真實(shí)坐標(biāo)還需要更進(jìn)一步計(jì)算。
(2)PnP解算求解坐標(biāo)
為了能精準(zhǔn)打擊到敵方裝甲板,需要知道敵方裝甲板中心在相機(jī)坐標(biāo)系下的坐標(biāo)。每塊裝甲板上都有一對(duì)燈條,燈條的長(zhǎng)度和燈條之間的間距是已知的。因此,可以引入第四個(gè)坐標(biāo)系——世界坐標(biāo)系,并以燈條矩形中心為世界坐標(biāo)系的原點(diǎn),根據(jù)矩形的尺寸賦給矩形四個(gè)點(diǎn)相應(yīng)的世界坐標(biāo)系下的值,從而將其視作一個(gè)PnP(Perspective-n-Point)問(wèn)題。
通過(guò)PnP解算獲得A、B、C三個(gè)點(diǎn)的相機(jī)坐標(biāo)后,可以使用ICP(Iterative Closest Point)的方式迭代求解相機(jī)的位姿,最終解出旋轉(zhuǎn)矩陣R與平移向量T。由于我們選定燈條矩形中心為世界坐標(biāo)系的原點(diǎn),因此,解出的平移向量T就是矩形中心在相機(jī)坐標(biāo)系下的坐標(biāo)。
(3)預(yù)判打擊
預(yù)判打擊需要結(jié)合相機(jī)和陀螺儀兩個(gè)傳感器的數(shù)據(jù)。相機(jī)獲得到的目標(biāo)圖像經(jīng)過(guò)識(shí)別和解算后,即可得到相機(jī)坐標(biāo)系下目標(biāo)的坐標(biāo)數(shù)據(jù),而陀螺儀則反映了當(dāng)前云臺(tái)的姿態(tài)。陀螺儀的零點(diǎn)在忽略零漂的情況下是不會(huì)發(fā)生變化的,因此,可以根據(jù)陀螺儀的角度數(shù)據(jù)將相機(jī)坐標(biāo)系進(jìn)行反向旋轉(zhuǎn)得到一個(gè)坐標(biāo)系。該坐標(biāo)系除原點(diǎn)會(huì)隨著戰(zhàn)車(chē)移動(dòng)外,各個(gè)坐標(biāo)軸方向是固定不變的。
至此,已獲得了一個(gè)相對(duì)靜止的坐標(biāo)系,通過(guò)這個(gè)坐標(biāo)系即可將預(yù)判打擊轉(zhuǎn)換為一個(gè)運(yùn)動(dòng)學(xué)問(wèn)題。將我方戰(zhàn)車(chē)視為靜止?fàn)顟B(tài),通過(guò)觀測(cè)一段連續(xù)時(shí)間中目標(biāo)的位置變化即可近似計(jì)算出目標(biāo)此時(shí)的運(yùn)動(dòng)狀態(tài)(速度、加速度)。
接下來(lái)是通過(guò)當(dāng)前時(shí)刻的運(yùn)動(dòng)狀態(tài)來(lái)推算正確的彈丸落點(diǎn),使得敵方目標(biāo)到達(dá)該處時(shí)我們的彈丸剛好可以打擊到??梢允褂玫▉?lái)求得飛行時(shí)間的近似解。將彈丸飛行至當(dāng)前時(shí)刻目標(biāo)位置所用的時(shí)間設(shè)為迭代初值t0并開(kāi)始迭代。計(jì)算出經(jīng)過(guò)t0時(shí)間后目標(biāo)所處的位置p1,求得彈丸飛行至p1所用時(shí)間t1。用t1與t0作差得到時(shí)間差△t,并將△t作為本次迭代的步長(zhǎng)。用t1加上步長(zhǎng)得到t2,并將t2作為新的迭代初值進(jìn)行下一輪迭代。當(dāng)△t小于一定值或迭代次數(shù)到達(dá)上限即停止迭代,可獲得最終的彈丸飛行時(shí)間tn??梢越o△t乘上一個(gè)系數(shù)α,通過(guò)調(diào)節(jié)α的值來(lái)縮短迭代時(shí)間,但要注意α的取值以防發(fā)散。最后用tn求得最終的預(yù)判坐標(biāo)。
能量機(jī)關(guān)的激活在RoboMaster比賽中非常重要,大幅度的攻防屬性加成往往決定著比賽的勝負(fù)走向。
(1)能量機(jī)關(guān)定位圓心的識(shí)別
根據(jù)傳入的類(lèi)正方形的輪廓和矩形進(jìn)行判別。遍歷所有的輪廓和矩形,先在形態(tài)學(xué)上進(jìn)行篩選,如果滿足形態(tài)學(xué)條件,那么獲取該矩形。在原圖的對(duì)應(yīng)坐標(biāo)位置,截取出比該矩形略大的ROI區(qū)域,然后對(duì)ROI區(qū)域進(jìn)行歸一化,傳入SVM進(jìn)行二分類(lèi)。
這里重點(diǎn)運(yùn)用了機(jī)器學(xué)習(xí)中的SVM(支持向量機(jī)),簡(jiǎn)單應(yīng)用了其二分類(lèi)的功能。我們利用OpenCV中的ml庫(kù)封裝好的SVM類(lèi)建立起一套完整的SVM的項(xiàng)目。首先,我們利用上面的識(shí)別部分獲取樣本。采集樣本時(shí)便同時(shí)將其分類(lèi),以是否為正確的圓心R圖像為標(biāo)準(zhǔn),分為正負(fù)兩類(lèi)樣本,按照1/4的比例分為測(cè)試集和訓(xùn)練集(此比例是參考周治華老師編寫(xiě)的《機(jī)器學(xué)習(xí)》一書(shū))。其次,對(duì)樣本進(jìn)行歸一化操作后,通過(guò)調(diào)用SVM類(lèi)中的外部接口進(jìn)行訓(xùn)練,得出訓(xùn)練結(jié)果xml文件。然后,通過(guò)調(diào)用預(yù)測(cè)函數(shù)對(duì)測(cè)試集進(jìn)行測(cè)試,反復(fù)測(cè)試后得到最好的xml文件。
(2)懸臂擊打狀態(tài)的識(shí)別判定
當(dāng)懸臂未發(fā)光時(shí),該懸臂處于未打擊狀態(tài);當(dāng)懸臂出現(xiàn)流水燈時(shí),則該懸臂處于待打擊狀態(tài);當(dāng)懸臂燈光常亮?xí)r,則該懸臂處于已打擊狀態(tài)。將已獲取的圓心坐標(biāo)和每一塊裝甲板矩形進(jìn)行連線,并把這條線段四等分。在原圖像上截取垂直于每一條線段,并且靠近裝甲板的矩形作為待識(shí)別區(qū)域,獲得該旋轉(zhuǎn)矩形的外接矩形作為ROI區(qū)域。對(duì)此,ROI區(qū)域先將選裝矩形外的部分填充為黑色。然后,進(jìn)行預(yù)處理獲得ROI區(qū)域的二值圖。因?yàn)橐汛驌舻膽冶鄢尸F(xiàn)常亮狀態(tài),未打擊的懸臂只有中間的主區(qū)域呈現(xiàn)流水燈狀態(tài),二值圖下兩個(gè)狀態(tài)的白色像素點(diǎn)數(shù)量具有很明顯的界限。統(tǒng)計(jì)每個(gè)ROI區(qū)域的白色像素點(diǎn)數(shù)量,尋找數(shù)量最小的ROI區(qū)域。
能量機(jī)關(guān)有大小兩個(gè)模式,大能量機(jī)關(guān)的旋轉(zhuǎn)策略為角速度關(guān)于正弦函數(shù)變化,如下所示。
其中 spd的單位為rad/s,t 的單位為s;小能量機(jī)關(guān)的旋轉(zhuǎn)策略為固定轉(zhuǎn)速10rpm。
首先確定基準(zhǔn),以能量機(jī)關(guān)圓心R的中心點(diǎn)為基準(zhǔn)點(diǎn),沿圖像二維坐標(biāo)系的X軸正方向作射線,以此為基準(zhǔn)線。計(jì)算出每一幀圖像中待打擊裝甲板的中心和圓心R的連線與基準(zhǔn)線的角度。每次處理記錄上一次的角度,根據(jù)角度的變化判斷出能量機(jī)關(guān)的旋轉(zhuǎn)方向。特別地,要剔除掉懸臂跳變的情況,當(dāng)角度變化過(guò)大時(shí)認(rèn)為懸臂發(fā)生跳變現(xiàn)象。依然根據(jù)角度變化再計(jì)算角速度的極值,每0.1s計(jì)算一次,當(dāng)極值連續(xù)固定達(dá)到一定次數(shù),認(rèn)為計(jì)算出了正確的極值。記錄現(xiàn)在的角速度和上一次計(jì)算的角速度,判斷出現(xiàn)在能量機(jī)關(guān)處于加速還是減速狀態(tài)。根據(jù)以上給出的目標(biāo)函數(shù)式反解出當(dāng)前所處的時(shí)刻。然后進(jìn)行決策,若是勻速,則為小能量機(jī)關(guān),那么每一次預(yù)置固定的預(yù)判量;若是非勻速,則為大能量機(jī)關(guān),那么就要根據(jù)計(jì)算出的實(shí)際角速度和時(shí)刻,利用給出的正弦函數(shù)式進(jìn)行積分,獲得角度變化。
雷達(dá)站機(jī)器人作為RoboMaster機(jī)甲大師賽中唯一的輔助類(lèi)型機(jī)器人,它的任務(wù)主要是監(jiān)控全場(chǎng),從繁雜的信息中提取出對(duì)我方有效的信息,從而達(dá)到輔助我方取得比賽勝利的目的。
(1)數(shù)據(jù)采集和預(yù)處理
前期測(cè)試使用RoboMaster機(jī)甲大師賽官方提供的RoboMaster 2019比賽目標(biāo)檢測(cè)數(shù)據(jù)集,該數(shù)據(jù)集已經(jīng)標(biāo)注了object的name屬性、armor的armor_color屬性以及若干本文未使用的屬性。其中name屬性有5種屬性值,分別為car,watcher,base,ignore,armor。armor_color有3種屬性值,分別為red、blue、gray。前者用于區(qū)分機(jī)器人種類(lèi),后者區(qū)分機(jī)器人所屬陣營(yíng)。從中隨機(jī)抽取5 000張樣本作為訓(xùn)練集,該數(shù)據(jù)集的原始圖片大小為1 920×1 080。
訓(xùn)練前,須將數(shù)據(jù)集圖片統(tǒng)一修改為608×608,以提高訓(xùn)練速度。除此以外,還會(huì)通過(guò)去除相似圖片來(lái)達(dá)到提高模型的精度。
(2)YOLOV4算法
YOLOV4網(wǎng)絡(luò)可以劃分為Backbone、Neck、Head三部分,其中Backbone采用CSPDarknet53作為骨干網(wǎng)絡(luò),Neck使用PANet和SPP(空間金字塔池化)來(lái)加強(qiáng)特征融合,而Head則沿用YOLOV3檢測(cè)頭。
在YOLOV4網(wǎng)絡(luò)中,它首先會(huì)將一張圖片劃分成N×N個(gè)網(wǎng)格,如果某個(gè)機(jī)器人的中心落在某個(gè)網(wǎng)格內(nèi),則這個(gè)網(wǎng)絡(luò)就負(fù)責(zé)預(yù)測(cè)這個(gè)機(jī)器人對(duì)象。每個(gè)網(wǎng)格需要預(yù)測(cè)M個(gè)邊界框的位置和置信度,位置信息包括模型預(yù)測(cè)的對(duì)象的中心坐標(biāo)及寬高aw、ah。
下一步是利用模型預(yù)測(cè)的中心坐標(biāo)和寬高求出預(yù)測(cè)框的中心坐標(biāo)(bx,by)及寬高bw、bh。
將bx、by、bw、bh除以對(duì)應(yīng)的特征圖尺寸,再乘以原始輸入圖片尺寸(608×608)便可得到預(yù)測(cè)的邊界框在原圖中的實(shí)際坐標(biāo)。
預(yù)測(cè)位置和預(yù)測(cè)種類(lèi)是同時(shí)進(jìn)行的,每張圖片劃分的N2個(gè)網(wǎng)格都會(huì)預(yù)測(cè)一個(gè)分類(lèi)值,代表的是待測(cè)物在每個(gè)邊框上的概率。
現(xiàn)在已經(jīng)預(yù)測(cè)出了N×N×M個(gè)目標(biāo)窗口,再根據(jù)設(shè)定的閾值篩出一定的低概率窗口,最后利用非極大值抑制法來(lái)選擇置信度高的目標(biāo)窗口。
機(jī)器智能化的前提是其得具有感知能力,而計(jì)算機(jī)視覺(jué)給予了機(jī)器“看”的感知能力。本項(xiàng)目不僅能夠完成基本的燈光和數(shù)字的識(shí)別鎖定,還能進(jìn)行精準(zhǔn)的測(cè)量與打擊,并且可以對(duì)目標(biāo)的運(yùn)動(dòng)進(jìn)行預(yù)判。將項(xiàng)目實(shí)際運(yùn)用于RoboMaster機(jī)甲大師賽,有著很好的自適應(yīng)性,高內(nèi)聚低耦合使其更具實(shí)用性。