一舶沛、前言
關(guān)于2019年RoboMaster(全國(guó)大學(xué)生機(jī)器人比賽)中的能量機(jī)關(guān)晰房,也就是“大風(fēng)車”拉庵,作為2018年賽季參賽者,一開(kāi)始看到這道題的時(shí)候浸间,大概有兩個(gè)感覺(jué):(1)視覺(jué)難度降低了(2)彈道要求提高了太雨。估計(jì)很多人都有這種感覺(jué),因?yàn)闆](méi)了手寫(xiě)數(shù)字的識(shí)別魁蒜,變成了一個(gè)8m定點(diǎn)打靶的任務(wù)囊扳,靶子的識(shí)別,相信做過(guò)自瞄的同學(xué)兜看,會(huì)認(rèn)為難度不大宪拥,關(guān)鍵是是否能打中。這么分析铣减,今年的視覺(jué)難度真的就降低了嗎她君?可能沒(méi)那么簡(jiǎn)單。
有幸參與了官方賽事預(yù)研項(xiàng)目葫哗,參與了能量機(jī)關(guān)任務(wù)技術(shù)調(diào)研(實(shí)際上就是進(jìn)行能量機(jī)關(guān)任務(wù)技術(shù)研發(fā)缔刹,沒(méi)啥技術(shù)含量)。
二劣针、能量機(jī)關(guān)算法方案
拿到題目校镐,第一步大概是審題,腦海里需要構(gòu)建一個(gè)能量機(jī)關(guān)任務(wù)的一個(gè)輪廓捺典,有了2018年參賽經(jīng)驗(yàn)鸟廓,不難得到這么一個(gè)流程:
獲取圖像——>圖像處理——>運(yùn)動(dòng)預(yù)測(cè)——>轉(zhuǎn)動(dòng)云臺(tái)及射擊
- 獲取圖像:使用攝像頭獲取能量機(jī)關(guān)圖像
- 圖像處理:識(shí)別算法部分,識(shí)別一些關(guān)鍵元素襟己,如裝甲板引谜,旋轉(zhuǎn)中心,旋轉(zhuǎn)臂的燈效種類擎浴。
- 運(yùn)動(dòng)預(yù)測(cè):由于大風(fēng)車是在運(yùn)動(dòng)员咽,還需要進(jìn)行大風(fēng)車運(yùn)動(dòng)預(yù)測(cè),同時(shí)子彈的運(yùn)動(dòng)不是一條直線贮预,也需要進(jìn)行子彈彈道補(bǔ)償贝室。
- 轉(zhuǎn)動(dòng)云臺(tái)及射擊:預(yù)測(cè)過(guò)后契讲,就能得到云臺(tái)所要旋轉(zhuǎn)的pitch,yaw角,發(fā)送給stm32底層滑频,完成控制捡偏。
step1.獲取圖像
關(guān)于獲取圖像步驟,即需要考慮相機(jī)的要求峡迷,主要有兩個(gè)因素需要考慮:
- 相機(jī)安裝位置
- 相機(jī)鏡頭焦距選擇
相機(jī)安裝位置選擇:
- 由于大風(fēng)車在固定位置旋轉(zhuǎn)霹琼,攝像頭安裝在底盤(pán)上,底盤(pán)保持不動(dòng)凉当,則攝像頭相對(duì)大風(fēng)車是靜止的枣申,可以大大簡(jiǎn)化圖像計(jì)算,并且避免了不必要的干擾看杭。
- 相對(duì)于安裝云臺(tái)上忠藤,提高了準(zhǔn)確率和速度。
相機(jī)鏡頭焦距計(jì)算
相機(jī)參數(shù)
- 采用1/2” CMOS傳感器芯片楼雹,130萬(wàn)像素分辨率
- 像素尺寸 4.8μm×4.8μm
- 分辨率 1280(H)×1024(V)
焦距計(jì)算公式:
具體計(jì)算:
- 風(fēng)車半徑為0.8m,則大小為1.6*1.6m模孩,需要圖像留有余量,方便機(jī)器人對(duì)位贮缅,這里視野取目標(biāo)的3倍榨咐,則視野大小應(yīng)為4.8 *4.8m。
- 大風(fēng)車距離橋頭(鏡頭)距離為8m
- 相機(jī)尺寸為4.8um*1024=4.8mm
則
所以谴供,最終块茁,考慮選擇8mm的鏡頭。
step2桂肌、圖像處理
根據(jù)比賽規(guī)則数焊,能量機(jī)關(guān)具有大量發(fā)光特征,應(yīng)該充分利用崎场,可以方便視覺(jué)進(jìn)行處理佩耳,相信做過(guò)自瞄算法的同學(xué)一定不會(huì)陌生。這里可以參考官方ICRA步兵開(kāi)源項(xiàng)目RoboRTS( https://github.com/RoboMaster/RoboRTS ) ,其中的roborts_detection 包中的armor_detection/constraint_set下的相關(guān)識(shí)別算法可以借鑒谭跨。
圖像處理結(jié)果大致如下:(僅供參考)
- 第一幅圖為原圖干厚。
- 第二幅圖為處理后的二值圖,過(guò)濾掉背景噪音后螃宙,在二值圖上可以方便的提取關(guān)鍵元素蛮瞄。
提取關(guān)鍵元素:
- 裝甲板:提取裝甲板,后續(xù)可以使用pnp算法解算位置污呼,得到打擊目標(biāo)位置裕坊。
- 旋轉(zhuǎn)臂:由于需要區(qū)分激活狀態(tài)的旋轉(zhuǎn)臂和未激活的旋轉(zhuǎn)臂包竹,所以需要提取該部分元素進(jìn)行區(qū)分燕酷。
- 旋轉(zhuǎn)中心:發(fā)光R籍凝,由于大風(fēng)車處于旋轉(zhuǎn)狀態(tài),需要進(jìn)行圓周預(yù)測(cè)苗缩,那么圓心位置是必不可少的饵蒂。
如何提取關(guān)鍵元素:
- 相信大家在二值圖上已經(jīng)肉眼可見(jiàn)這些關(guān)鍵元素了,而且這些元素非常獨(dú)立酱讶,非常容易進(jìn)行提取退盯。
- 這個(gè)就和自瞄算法提取裝甲板用的方法一樣,如果是使用opencv泻肯,可以使用兩個(gè)非常強(qiáng)大的函數(shù) findcontours()和minAreaRect() 渊迁,然后使用約束條件進(jìn)行匹配選擇,如長(zhǎng)寬比灶挟,大小琉朽,角度等。當(dāng)然這只是其中一種方法稚铣,限于才能箱叁,只能給大家介紹這一種了。
上述列舉的主要的普通關(guān)鍵元素惕医,也不是所有關(guān)鍵元素都是必須的耕漱,也可以自己構(gòu)建其它關(guān)鍵元素,如不使用裝甲板抬伺,提取整個(gè)旋轉(zhuǎn)臂元素螟够,利用旋轉(zhuǎn)臂來(lái)做PnP解算位置也是可以的。
step3峡钓、運(yùn)動(dòng)預(yù)測(cè)
大風(fēng)車運(yùn)動(dòng)模型:
由于大風(fēng)車旋轉(zhuǎn)齐鲤,對(duì)于識(shí)別到的打擊目標(biāo),需要進(jìn)行預(yù)測(cè)才能真正的打中目標(biāo)椒楣。大風(fēng)車做勻速圓周運(yùn)動(dòng)给郊,需要獲取圓周運(yùn)動(dòng)的圓心(待測(cè)),半徑(已知)和速度(已知)捧灰,通過(guò)建立大風(fēng)車運(yùn)動(dòng)模型來(lái)進(jìn)行預(yù)測(cè)淆九。
這里給出幾種預(yù)測(cè)方案:
- 方案一:記錄多個(gè)裝甲板點(diǎn)(開(kāi)始只進(jìn)行圖像處理),建立裝甲板運(yùn)動(dòng)在3維空間的圓的方程毛俏,從而進(jìn)行預(yù)測(cè)炭庙。
- 方案二:平面簡(jiǎn)化版模型,在圖像上煌寇,得到大風(fēng)車中心點(diǎn)焕蹄,得到裝甲板目標(biāo)中心,直接得到圖像平面圓方程阀溶,從而進(jìn)行預(yù)測(cè)腻脏。
由于方案一比較復(fù)雜鸦泳,這里為大家介紹一種簡(jiǎn)單近似方案,即求平面圓的方案二永品。
二維簡(jiǎn)化模型:
并且鼎姐,進(jìn)一步簡(jiǎn)化模型剥哑,即固定預(yù)測(cè)時(shí)間t抡诞,從而固定的預(yù)測(cè)旋轉(zhuǎn)角度theta确沸。
- 固定預(yù)測(cè)時(shí)間t:在stm32端實(shí)現(xiàn)利虫,采用一個(gè)定時(shí)器,固定延時(shí)發(fā)射子彈献宫。
方案二的優(yōu)芋肠、缺點(diǎn)很明顯,
- 優(yōu)點(diǎn):簡(jiǎn)單遵蚜,便于實(shí)現(xiàn)帖池。
- 缺點(diǎn):對(duì)于打擊能量機(jī)關(guān)的位置很敏感,必須正對(duì)能量機(jī)關(guān)吭净,不正對(duì)會(huì)帶來(lái)預(yù)測(cè)誤差睡汹。
子彈拋物模型:
由于距離較遠(yuǎn),必須考慮重力對(duì)子彈的影響寂殉,可以建立重力模型囚巴,對(duì)子彈進(jìn)行建模,從而對(duì)云臺(tái)所需要的仰角進(jìn)行補(bǔ)償友扰。
在官方ICRA步兵開(kāi)源項(xiàng)目RoboRTS(https://github.com/RoboMaster/RoboRTS) 中彤叉,有一個(gè)一個(gè)拋物線彈道修正模型,可以進(jìn)行參考村怪。
在這里秽浇,依然采用簡(jiǎn)化模型,主要考慮到是定點(diǎn)打靶甚负,所以重力偏移變化不會(huì)太大柬焕,所以給出一下方案:
- 建立一個(gè)pitch偏移表,通過(guò)偏移量查表來(lái)進(jìn)行補(bǔ)償梭域。
方案總結(jié)
大致的能量機(jī)關(guān)方案設(shè)計(jì)如上所述斑举,總結(jié)一下,就是下面一張(看似簡(jiǎn)單的)圖病涨。
三富玷、誤差分析
在經(jīng)過(guò)測(cè)試后,對(duì)能量機(jī)關(guān)打擊任務(wù)進(jìn)行了分析,發(fā)現(xiàn)打不中目標(biāo)的概率較大赎懦,對(duì)于打不中目標(biāo)給出合理解釋雀鹃,對(duì)于誤差來(lái)源大概從以下幾個(gè)方面分析:
- 相機(jī)標(biāo)定誤差
- 相機(jī)安裝位置誤差
- 算法誤差(圖像識(shí)別與單目定位)
- 彈道誤差
1.相機(jī)標(biāo)定誤差:
由于涉及視覺(jué)測(cè)量,相機(jī)參數(shù)在進(jìn)行視覺(jué)測(cè)量中铲敛,具有重要的作用褐澎,其誤差會(huì)直接導(dǎo)致視覺(jué)測(cè)量誤差会钝。所以伐蒋,需要減小其相機(jī)標(biāo)定誤差。
減小誤差方法:
- 多次標(biāo)定迁酸,去掉偏差較大的標(biāo)定結(jié)果先鱼,取中位標(biāo)定結(jié)果。
2.機(jī)機(jī)安裝位置誤差:
由于相機(jī)安裝在底盤(pán)上奸鬓,相機(jī)與發(fā)射云臺(tái)有個(gè)坐標(biāo)變換焙畔,包含一個(gè)平移向量和一組旋轉(zhuǎn)參數(shù),理想安裝位置串远,相機(jī)與云臺(tái)安裝沒(méi)有旋轉(zhuǎn)關(guān)系宏多,只有平移關(guān)系。
- 平移向量直接采用直尺測(cè)量澡罚,精度在mm級(jí)別伸但,不會(huì)引入太大誤差。
- 旋轉(zhuǎn)參數(shù)選擇參數(shù)采用歐拉角方式留搔,理想狀態(tài)均為0更胖,由于誤差,其真實(shí)值并不為0隔显。
- 目前却妨,通過(guò)經(jīng)驗(yàn)補(bǔ)償方式減小誤差。
3.算法誤差
目前能量機(jī)關(guān)算法括眠,通過(guò)識(shí)別裝甲板矩形目標(biāo)彪标,采用PnP定位算法,來(lái)對(duì)目標(biāo)進(jìn)行定位掷豺。
在動(dòng)態(tài)能量機(jī)關(guān)測(cè)試中:
裝甲板矩形的像素大小大概為30×56捐下,在識(shí)別過(guò)程中,像素波動(dòng)在1個(gè)像素左右萌业。
- 定位深度距離誤差估計(jì)為坷襟。
同時(shí)使用三維數(shù)據(jù)可視化軟件,將所有定位結(jié)果畫(huà)在3D散點(diǎn)圖上生年,如下圖所示:
- 第一個(gè)是正視圖:理想是一個(gè)圓婴程,效果較為理想。
- 第二個(gè)是俯視圖:理想是一條直線抱婉,效果不理想档叔。
所以桌粉,算法測(cè)量誤差主要來(lái)源于深度信息的誤差,經(jīng)過(guò)測(cè)量衙四,最大誤差在基本上在20cm左右铃肯,與之前估計(jì)的16cm相差不大,定位的像素不穩(wěn)定传蹈,這是誤差的來(lái)源押逼。
- 對(duì)于單目測(cè)距來(lái)說(shuō),遠(yuǎn)距離識(shí)別誤差大惦界,很大原因是被測(cè)量物體分辨率不夠挑格,像素波動(dòng)對(duì)于定位誤差影響很大。
- 可以考慮其他的一些高精度定位方案沾歪,如雙目定位等漂彤,來(lái)減小算法誤差。
4.彈道誤差
由于能量機(jī)關(guān)需要射擊灾搏。彈道誤差對(duì)于能量激光的實(shí)現(xiàn)也影響重大挫望,在進(jìn)行射擊測(cè)試時(shí),發(fā)現(xiàn)誤差主要來(lái)源與兩個(gè)因素狂窑。
- 機(jī)械因素:包含槍管等子彈發(fā)射經(jīng)過(guò)的機(jī)構(gòu)設(shè)計(jì)媳板,導(dǎo)致子彈發(fā)射并不是平行于槍管中軸線,而形成散射的效果蕾域。
- 射速因素:由于遠(yuǎn)距離設(shè)計(jì)拷肌,子彈并不是直線發(fā)射,所以旨巷,還受發(fā)射速度的影響巨缘,不穩(wěn)定的發(fā)射速度也會(huì)影響彈道的上下偏移。
射速影響理論計(jì)算:(理想拋物線模型)
在距離8m若锁,速度為23m/s的情況下,計(jì)算速度波動(dòng)1m/s情況下:
- 在0度仰角下斧吐,偏移誤差為5cm左右又固。
- 在25度仰角下,為6cm煤率。
誤差總結(jié)
總的來(lái)說(shuō)仰冠,能量機(jī)關(guān)任務(wù)實(shí)現(xiàn)不了,誤差是來(lái)自多方面原因的蝶糯。
- 相機(jī)標(biāo)定誤差和相機(jī)位置誤差是絕對(duì)誤差洋只,是可以通過(guò)修正方式進(jìn)行補(bǔ)償?shù)摹?/li>
- 算法定位誤差(識(shí)別像素波動(dòng))和彈道誤差是隨機(jī)誤差,只能通過(guò)改變手段來(lái)減小誤差。
同時(shí)由于子彈射擊目標(biāo)识虚,由于目標(biāo)具有一定大小肢扯,是允許一定誤差的,在進(jìn)行方案設(shè)計(jì)時(shí)担锤,需要考慮各個(gè)因素引入的誤差蔚晨,并不斷減小誤差。
四肛循、結(jié)果與總結(jié)
a.結(jié)果
目前铭腕,在比較穩(wěn)定的彈道下,測(cè)試了靜止能量機(jī)關(guān)和動(dòng)態(tài)能量機(jī)關(guān)(正常狀態(tài))育拨,可以達(dá)到的精度如下:
- 靜止能量機(jī)關(guān):平均擊中一個(gè)目標(biāo)所消耗子彈1-1.5谨履。
- 動(dòng)態(tài)能量機(jī)關(guān):平均擊中一個(gè)目標(biāo)所消耗子彈2左右欢摄。
這個(gè)結(jié)果雖然不是很好熬丧,但是還算勉強(qiáng)完成了能量機(jī)關(guān)任務(wù)。
b.關(guān)于賽題的總結(jié)
對(duì)于2019年的能量機(jī)關(guān)怀挠,或許視覺(jué)算法真的不難析蝴,視覺(jué)難度真的降低了,但是確實(shí)是一個(gè)好的題目绿淋,整體難度并沒(méi)有降低闷畸,比較鍛煉人的綜合能力,給了我們很大的空間去分析一個(gè)問(wèn)題吞滞。
在實(shí)現(xiàn)能量機(jī)關(guān)算法的過(guò)程中佑菩,由于本身存在的一些誤差,包括一些步驟由于采用了近似處理或近似方案而引入的誤差裁赠,導(dǎo)致最后實(shí)現(xiàn)的結(jié)果并不是太樂(lè)觀殿漠,沒(méi)法達(dá)到百發(fā)百中,特別對(duì)于動(dòng)態(tài)佩捞,效果不是很理想绞幌。
其中的誤差分析,本文分析的還比較粗略一忱,遠(yuǎn)遠(yuǎn)達(dá)不到工程要求莲蜘,甚至還有一些錯(cuò)誤,不過(guò)帘营,在分析的過(guò)程中也逐漸深入理解這個(gè)任務(wù)票渠,不同于看題目一開(kāi)始,知道這個(gè)題目難芬迄,但不知難在哪里问顷,不知道從哪一步解決問(wèn)題,拿到題無(wú)從下手。
c.關(guān)于技術(shù)的總結(jié)
在做能量機(jī)關(guān)任務(wù)時(shí)择诈,并沒(méi)有用到什么高深的理論械蹋,高深的技術(shù),學(xué)到的更多的是工程分析羞芍,不至于盲目下手哗戈,而無(wú)從下手,在做技術(shù)的過(guò)程中荷科,也不是一開(kāi)始就分析到位的唯咬,也發(fā)現(xiàn)自己很多低效的開(kāi)發(fā),缺乏一個(gè)分析流程畏浆,等到無(wú)從下手時(shí)的一步胆胰,才開(kāi)始分析一步,沒(méi)法做到先分析刻获,再解決問(wèn)題的流程蜀涨,不過(guò)這確實(shí)是需要經(jīng)驗(yàn)積累的,做這個(gè)項(xiàng)目也相當(dāng)一次技術(shù)積累吧蝎毡,也確實(shí)從這個(gè)任務(wù)學(xué)習(xí)到了一些開(kāi)發(fā)經(jīng)驗(yàn)厚柳。
(本文遵循開(kāi)源協(xié)議:CC-BY-SA 4.0。首發(fā)于RoboMaster論壇 )