|
OPENMV和STM32的識(shí)別追蹤小車(詳細(xì)版)之OPENMV端
實(shí)現(xiàn):通過(guò)OPENMV識(shí)別Apriltags標(biāo)簽,STM32驅(qū)動(dòng)小車追蹤標(biāo)簽
博主通過(guò)一段時(shí)間的學(xué)習(xí),做了這個(gè)比較簡(jiǎn)單的以O(shè)PENMV為攝像傳感器STM32為控制器的尋物小車,不多說(shuō),直接進(jìn)入正題!
材料準(zhǔn)備
小車底盤&&輪子
直流減速電機(jī)
杜邦線若干
7.2V電源
L298N模塊
STM32F407最小系統(tǒng)
OPENMV4 H7
程序設(shè)計(jì)思路
這里分兩個(gè)方面來(lái)說(shuō),一個(gè)是OPENMV的程序,另一個(gè)是STM32的程序。其中,最重要的地方是openmv與stm32的通信問(wèn)題,我也會(huì)著重講一下這個(gè)問(wèn)題。由于篇幅比較長(zhǎng),我將分兩篇文章講解。
一:首先說(shuō)一下OPENMV的介紹和程序
1.1(OPENMV介紹)
OpenMV攝像頭是一款小巧,低功耗,低成本的電路板,它幫助你很輕松的完成機(jī)器視覺(jué)(machine vision)應(yīng)用。它可以讓我們直接應(yīng)用具有人工智能的功能的攝像頭作為我們機(jī)器人的視覺(jué)傳感器。它可以識(shí)別出人臉,方塊,小球,標(biāo)簽等。
這里,我選擇用來(lái)識(shí)別Apriltags標(biāo)簽,OPENMV識(shí)別Apriltags標(biāo)簽可以計(jì)算出相對(duì)于相機(jī)的精確3D位置,方向和id。包括有6個(gè)自由度,三個(gè)位置,三個(gè)角度。這里我選擇X,Z軸的位置數(shù)據(jù)來(lái)進(jìn)行判斷。 Apriltags標(biāo)簽一共有6個(gè)家族,星瞳科技的例程里面默認(rèn)是TAG36H11家族,因?yàn)樗淖R(shí)別錯(cuò)誤率比較低,而我選擇TAG16H5,因?yàn)榭梢宰R(shí)別得比較遠(yuǎn)。
我的OPENMV4 H7是在星瞳科技買的,在星瞳科技官網(wǎng)有上手教程,其中有介紹到OPENMV的串口通信問(wèn)題。首先,OPENMV的控制芯片其實(shí)就是STM32H7,所以單片機(jī)與單片機(jī)之間肯定是可以通信的,這一點(diǎn)沒(méi)有問(wèn)題,看一下它的引腳圖
這里可以看到P4和P5是串口,P4是TX,P5是RX.(注意一定要看清楚選對(duì)引腳).這就是硬件上的連接,下面來(lái)講一下OPENMV代碼。
.2(OPENMV代碼)
先貼出代碼
mport sensor, image, time, math,pyb
from pyb import UART
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False) # must turn this off to prevent image washout...
sensor.set_auto_whitebal(False) # must turn this off to prevent image washout...
clock = time.clock()
uart = UART(3, 115200)#串口波特率
uart.init(115200,bits=8,parity=None,stop=1)
f_x = (2.8 / 3.984) * 160 # find_apriltags defaults to this if not set
f_y = (2.8 / 2.952) * 120 # find_apriltags defaults to this if not set
c_x = 160 * 0.5 # find_apriltags defaults to this if not set (the image.w * 0.5)
c_y = 120 * 0.5 # find_apriltags defaults to this if not set (the image.h * 0.5)
def degrees(radians):
return (180 * radians) / math.pi
while(True):
clock.tick()
img = sensor.snapshot()
for tag in img.find_apriltags(families=image.TAG16H5,fx=f_x, fy=f_y, cx=c_x, cy=c_y): # defaults to TAG16H5
img.draw_rectangle(tag.rect(), color = (255, 0, 0))
img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
print_args = (tag.x_translation(), tag.z_translation())
uart.write("x%.2fz%.2fe"% print_args+'\r\n')#
設(shè)置特定格式,以便于stm32分割取得數(shù)據(jù),這里設(shè)置的格式是精確到兩位小數(shù)特別代碼講解如下:在附件中
uart.init(115200,bits=8,parity=None,stop=1)
上面一行是OPENMV的波特率,數(shù)據(jù)數(shù),校驗(yàn)位,停止位的設(shè)置
print_args = (tag.x_translation(), tag.z_translation())上面一行是選擇要發(fā)送的數(shù)據(jù),Apriltags標(biāo)簽可以識(shí)別出三維坐標(biāo)以及偏移量的數(shù)值,這里我選擇了發(fā)送X軸和Z軸的參數(shù),也就是前后以及左右。
uart.write("x%.2fz%.2fe"% print_args+'\r\n')#設(shè)置特定格式,以便于stm32分割取得數(shù)據(jù)上面這一行是串口發(fā)送數(shù)據(jù)我所需要的格式,這里我是所要的保留兩位小數(shù)的格式。也就是說(shuō),比如X軸的數(shù)據(jù)為1,則發(fā)送的數(shù)據(jù)是1.00這種格式。Z軸也是如此!痋r\n’是回車換行的意思,這個(gè)回車換行也會(huì)被發(fā)送過(guò)去,到時(shí)候也作為STM32端的數(shù)據(jù)檢測(cè),講到STM32代碼的時(shí)候也會(huì)說(shuō)清楚。
這是OPENMV端的代碼
尋球小車 7.0(no_find優(yōu)化).7z
(246.8 KB, 下載次數(shù): 123)
2020-2-25 17:41 上傳
點(diǎn)擊文件名下載附件
單片機(jī)源程序如下:
|
評(píng)分
-
查看全部評(píng)分
|