概覽
目標(biāo)預(yù)測(cè)應(yīng)該是RM視覺(jué)中最難也是最重要的部分了速警,預(yù)測(cè)直接決定了子彈發(fā)射后的命中率掺冠,實(shí)話實(shí)說(shuō)我預(yù)測(cè)做得不好。預(yù)測(cè)之所以難做有很多原因腿宰,我覺(jué)得最困難的地方在于預(yù)測(cè)是需要上下位機(jī)配合的雁刷,也就是妙算/微型電腦與戰(zhàn)車(chē)上的STM32需要配合起來(lái)才可以達(dá)到比較好的效果。
我雖然也會(huì)寫(xiě)一些嵌入式上的程序?qū)TM32也比較了解保礼,但水平太差沛励。17年比賽的時(shí)候基地的自瞄和電控都是我負(fù)責(zé)的,當(dāng)時(shí)我連基地自轉(zhuǎn)都控制不好比賽時(shí)候總撞墻炮障,自瞄做了等于白做目派。。胁赢。
言歸正傳企蹭,雖然我預(yù)測(cè)做得不怎么樣,但是對(duì)這方面也還是有點(diǎn)經(jīng)驗(yàn)可以與大家分享的智末。
為什么要進(jìn)行目標(biāo)預(yù)測(cè)
首先說(shuō)一下預(yù)測(cè)的必要性谅摄,為什么要進(jìn)行目標(biāo)預(yù)測(cè)。因?yàn)閿z像頭和微型電腦性能的限制系馆,幀率不會(huì)達(dá)到很高送漠。
每次攝像頭在拍攝到戰(zhàn)車(chē)的裝甲的時(shí)候會(huì)有8ms左右的延遲(按120fps算)之后再加上處理花費(fèi)的時(shí)間和串口傳輸?shù)臅r(shí)間,這樣從裝甲板出現(xiàn)到識(shí)別到發(fā)出控制指令就已經(jīng)有十幾毫秒過(guò)去了由蘑。
下位機(jī)接收到數(shù)據(jù)后云臺(tái)也需要一定的時(shí)間才能旋轉(zhuǎn)到指定位置的闽寡,當(dāng)云臺(tái)旋轉(zhuǎn)到位后此時(shí)裝甲板早已不在之前出現(xiàn)的位置了。
若敵方車(chē)輛不斷移動(dòng)尼酿,那自瞄將總是滯后于裝甲板的實(shí)際位置爷狈,若敵方的車(chē)輛是小陀螺不斷自旋就更難打中了。
預(yù)測(cè)問(wèn)題的幾種情況及分析
- 攝像頭在小車(chē)底盤(pán)上裳擎,小車(chē)不動(dòng)
- 攝像頭在小車(chē)槍管上涎永,小車(chē)不動(dòng)
- 攝像頭在小車(chē)底盤(pán)上,小車(chē)動(dòng)
- 攝像頭在小車(chē)槍管上句惯,小車(chē)動(dòng)
第一種情況是最簡(jiǎn)單的土辩。在第一種情況下攝像頭是第三視角,相當(dāng)于小車(chē)坐標(biāo)系和大地坐標(biāo)系是等價(jià)的抢野。通過(guò)識(shí)別裝甲板得到的位置就是敵方戰(zhàn)車(chē)裝甲板在大地坐標(biāo)系下的坐標(biāo)拷淘,這樣通過(guò)相鄰兩幀間的時(shí)間差和位置差就可以得到裝甲板移動(dòng)的速度,進(jìn)而通過(guò)速度乘以時(shí)間即可得到預(yù)測(cè)量進(jìn)行預(yù)測(cè)補(bǔ)償指孤。
第二種情況下攝像頭是第一視角启涯,攝像頭會(huì)隨著云臺(tái)的運(yùn)動(dòng)而運(yùn)動(dòng)贬堵,此時(shí)測(cè)得的裝甲板位置是相對(duì)于攝像頭的也就是相對(duì)于槍管的,若想預(yù)測(cè)則需要知道槍管當(dāng)前偏轉(zhuǎn)的角度進(jìn)而進(jìn)行坐標(biāo)換算结洼,把裝甲板位置換算得出的轉(zhuǎn)角加上槍管當(dāng)前的轉(zhuǎn)角就能得到物體實(shí)際的轉(zhuǎn)角黎做,進(jìn)而可以計(jì)算角速度再得到預(yù)測(cè)量進(jìn)行補(bǔ)償。
第三和第四種情況下小車(chē)是動(dòng)的松忍,這就意味著小車(chē)坐標(biāo)系和大地坐標(biāo)系不再重合蒸殿,如果想要得到準(zhǔn)確的預(yù)測(cè)結(jié)果就需要規(guī)定一個(gè)原點(diǎn),在此基礎(chǔ)上測(cè)出小車(chē)的位移鸣峭,再將其與裝甲板位置及槍管的轉(zhuǎn)角進(jìn)行疊加轉(zhuǎn)換得到大地坐標(biāo)系下的位置進(jìn)而進(jìn)行補(bǔ)償宏所。
怎樣做預(yù)測(cè)
從上面的分析中我們可以看出,預(yù)測(cè)最重要的就是確定敵方裝甲板在大地坐標(biāo)系(可以用直角坐標(biāo)系也可以是極坐標(biāo)系)下的位置摊溶。
而在現(xiàn)實(shí)中小車(chē)往往是在運(yùn)動(dòng)的爬骤,慣性導(dǎo)航又很難做,所以可以退而求其次用小車(chē)坐標(biāo)系近似大地坐標(biāo)系莫换。因?yàn)樵趯?shí)戰(zhàn)中大多數(shù)情況是停下來(lái)打的霞玄,而且當(dāng)小車(chē)運(yùn)動(dòng)速度不快時(shí)造成的誤差也不會(huì)太大。
一般來(lái)說(shuō)大家都會(huì)把攝像頭裝在槍管上拉岁,這樣得到的裝甲板位置就是以攝像頭所在位置為原點(diǎn)在攝像頭坐標(biāo)系下的位置坷剧。
首先需要將該位置坐標(biāo)的z軸和y軸進(jìn)行偏移(假設(shè)攝像頭的是放在槍管上面且放在正中間,則x軸正好在槍管的中間處不需要偏移)喊暖。
偏移后就得到了以云臺(tái)為原點(diǎn)的坐標(biāo)听隐,再將此時(shí)裝甲板的坐標(biāo)通過(guò)反三角函數(shù)轉(zhuǎn)換成角度(把裝甲板位置換算成角度比把槍管轉(zhuǎn)角換算成三維坐標(biāo)容易),之后把裝甲板的角度和槍管的角度相加就能得到了在小車(chē)坐標(biāo)系下的角度哄啄。
用這個(gè)角度通過(guò)卡爾曼濾波或者簡(jiǎn)單的兩幀相減就能得到角速度雅任,進(jìn)而將其乘以預(yù)測(cè)時(shí)間得到預(yù)測(cè)量進(jìn)行補(bǔ)償。
如果覺(jué)得預(yù)測(cè)難做其實(shí)不做預(yù)測(cè)也是可以的只是效果差些咨跌,在妙算上直接將得到的相對(duì)于攝像頭的裝甲板偏轉(zhuǎn)角作為誤差傳給pid進(jìn)行控制(pid本自身就有預(yù)測(cè)作用)沪么,可以實(shí)現(xiàn)在目標(biāo)運(yùn)動(dòng)時(shí)速度無(wú)靜差而位置有靜差而在目標(biāo)停下時(shí)位置靜差會(huì)消除的跟蹤瞄準(zhǔn)效果,而且運(yùn)動(dòng)時(shí)的靜差會(huì)隨著攝像頭幀率的提高而減小锌半,在使用330fps的攝像頭時(shí)若識(shí)別到裝甲板不會(huì)跟丟且誤差在一個(gè)裝甲板內(nèi)禽车。
如果進(jìn)行預(yù)測(cè),則預(yù)測(cè)在STM32上做比較好刊殉。上位機(jī)命令的發(fā)送頻率畢竟比下位機(jī)的控制頻率低殉摔,可以通過(guò)串口把每次識(shí)別到裝甲板后換算得到的轉(zhuǎn)角發(fā)送給下位機(jī),然后下位機(jī)每個(gè)控制周期對(duì)裝甲板位置進(jìn)行預(yù)測(cè)后再控制云臺(tái)的旋轉(zhuǎn)记焊,可以得到比較好的結(jié)果逸月。
關(guān)于預(yù)測(cè),大疆官方有一篇知乎可以看看 https://zhuanlan.zhihu.com/p/38745950
這一篇沒(méi)有代碼只講了思路遍膜,因?yàn)槲易约阂矝](méi)有做得很好碗硬,今年分區(qū)賽前沒(méi)有做預(yù)測(cè)瓤湘,因?yàn)榘褦z像頭得到的相對(duì)位置當(dāng)成了速度來(lái)做預(yù)測(cè)(云臺(tái)跟隨時(shí)每次得到轉(zhuǎn)角可以看成是相對(duì)速度,但是若云臺(tái)轉(zhuǎn)過(guò)后會(huì)馬上變?yōu)樨?fù)從而會(huì)抵消之前的預(yù)測(cè)效果)恩尾,一直沒(méi)有效果(被自己蠢哭)弛说,到最后又因?yàn)殡娍夭唤o力無(wú)法得到槍管的pitch和yaw轉(zhuǎn)角(臨近考試周又還有好幾輛車(chē)的程序要寫(xiě),所以電控就沒(méi)時(shí)間來(lái)做這一塊了)就沒(méi)有做預(yù)測(cè)翰意。
申請(qǐng)了一個(gè)自己的公眾號(hào) 江達(dá)小記 木人,打算將自己的學(xué)習(xí)研究的經(jīng)驗(yàn)總結(jié)下來(lái)幫助他人也方便自己。感興趣的朋友可以關(guān)注一下冀偶。