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,所以单片机与单片机之间肯定是可以通信的,这一点没有问题。
我们来看一下它的引脚图

安卓opencv识别移动物体 openmv识别物体抓取_人工智能


这里可以看到P4和P5是串口,P4是TX,P5是RX.(注意一定要看清楚选对引脚).这就是硬件上的连接,下面来讲一下OPENMV代码。

1.2(OPENMV代码)

先贴出代码

import 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代码的时候也会说清楚。

这是OPENMV端的代码,下一篇文章,我将写一下STM32端的代码以及讲解~