OPENMV和STM32的識別追蹤小車(詳細版)之OPENMV端
實現:通過OPENMV識別Apriltags標簽,STM32驅動小車追蹤標簽
博主通過一段時間的學習,做了這個比較簡單的以OPENMV為攝像傳感器STM32為控制器的尋物小車,不多說,直接進入正題!
材料準備
小車底盤&&輪子
直流減速電機
杜邦線若干
7.2V電源
L298N模塊
STM32F407最小系統
OPENMV4 H7
程序設計思路
這里分兩個方面來說,一個是OPENMV的程序,另一個是STM32的程序。其中,最重要的地方是openmv與stm32的通信問題,我也會著重講一下這個問題。由于篇幅比較長,我將分兩篇文章講解。
一:首先說一下OPENMV的介紹和程序
1.1(OPENMV介紹)
OpenMV攝像頭是一款小巧,低功耗,低成本的電路板,它幫助你很輕松的完成機器視覺(machine vision)應用。它可以讓我們直接應用具有人工智能的功能的攝像頭作為我們機器人的視覺傳感器。它可以識別出人臉,方塊,小球,標簽等。
這里,我選擇用來識別Apriltags標簽,OPENMV識別Apriltags標簽可以計算出相對于相機的精確3D位置,方向和id。包括有6個自由度,三個位置,三個角度。這里我選擇X,Z軸的位置數據來進行判斷。 Apriltags標簽一共有6個家族,星瞳科技的例程里面默認是TAG36H11家族,因為它的識別錯誤率比較低,而我選擇TAG16H5,因為可以識別得比較遠。
我的OPENMV4 H7是在星瞳科技買的,在星瞳科技官網有上手教程,其中有介紹到OPENMV的串口通信問題。首先,OPENMV的控制芯片其實就是STM32H7,所以單片機與單片機之間肯定是可以通信的,這一點沒有問題,看一下它的引腳圖
這里可以看到P4和P5是串口,P4是TX,P5是RX.(注意一定要看清楚選對引腳).這就是硬件上的連接,下面來講一下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')#
設置特定格式,以便于stm32分割取得數據,這里設置的格式是精確到兩位小數特別代碼講解如下:在附件中
uart.init(115200,bits=8,parity=None,stop=1)
上面一行是OPENMV的波特率,數據數,校驗位,停止位的設置
print_args = (tag.x_translation(), tag.z_translation())上面一行是選擇要發送的數據,Apriltags標簽可以識別出三維坐標以及偏移量的數值,這里我選擇了發送X軸和Z軸的參數,也就是前后以及左右。
uart.write("x%.2fz%.2fe"% print_args+'\r\n')#設置特定格式,以便于stm32分割取得數據上面這一行是串口發送數據我所需要的格式,這里我是所要的保留兩位小數的格式。也就是說,比如X軸的數據為1,則發送的數據是1.00這種格式。Z軸也是如此!痋r\n’是回車換行的意思,這個回車換行也會被發送過去,到時候也作為STM32端的數據檢測,講到STM32代碼的時候也會說清楚。
51hei.png (7.17 KB, 下載次數: 33)
下載附件
2020-2-25 17:40 上傳
這是OPENMV端的代碼
尋球小車 7.0(no_find優化).7z
(246.8 KB, 下載次數: 123)
2020-2-25 17:41 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
單片機源程序如下:
|