OPENMV和STM32的识别追踪小车(详细版)之OPENMV端

2 篇文章 5 订阅
2 篇文章 7 订阅

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代码。

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端的代码以及讲解~
  • 70
    点赞
  • 516
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
# 基于Openmv的视觉跟踪小车 ## 一、实验原理及实验内容 ### 1.物体识别 本次实验目的是使得小车可以跟踪目标,故首先确定跟踪目标,由于小车整体框架从零开始搭建,并没有太多的金钱可以选择昂贵的摄像头,故本次实验的目标识别选择较为简单的方式以减少硬件压力。本次实验首先识别纯色物体,是完成对纯色物体识别之后更进一步选择跟踪AprilTag。 AprilTag是一个视觉基准系统,可用于各种任务,包括AR,机器人和相机校准。这个tag可以直接用打印机打印出来,而AprilTag检测程序可以计算相对于相机的精确3D位置,方向和id。 AprilTag内容主要包含三个步骤: 第一步是如何根据梯度检测出图像中的各种边缘。 第二步即如何在边缘图像中找出需要的四边形图案并进行筛选,AprilTag尽可能的对检测出的边缘检测,首先剔除非直线边缘,在直线边缘进行邻接边缘查找,最终若形成闭环则为检测到一个四边形。对四边形进行解码确定Apriltag标签。 第三步确定四边形的中心点作为要跟踪的三维左边点。 Openmv对以上步骤进行了函数封装,可以用img.find_apriltags()函数定位Apriltag标签,并且可以通过该函数的返回值的方法确定三维坐标和三维角度:可以用获取x轴坐标tag.x_translation(), tag.y_translation()、tag.z_translation()是y、z轴坐标 。 ### 2.云台追踪 openmv中搜索目标函数的返回值包括了目标物体中心的x、y坐标,原点是在图片的最左下角,就是说如果我们按照直接得到的坐标都是正的,但是我们要求云台追踪目标就是让目标始终出现在视野最中间,都是正的值我们无法判断图片到底是往哪边偏。为了解决这样的问题,我们只需要对得到的坐标进行简单的处理,openmv获得图片宽高都可以用函数获得,故已知图片宽width,高度height,目标中心点坐标x,y。按照相对比例来判断目标点在相机内的相对位置: $$ y1=y/height-0.5 $$ $$ x1=x/width-0.5 $$ 这样x1,y1就是我们最新获得的值,其取值范围均为[-0.5,0.5]。 为了实现云台始终追随目标,我们还需要将得到的坐标值转换为舵机旋转的角度,本实验云台为二自由度云台,如图1.1。下面的舵机控制偏航角与相机x轴相关,上面的舵机负责控制俯仰角与相机y轴相关,偏航角舵机的机械转角范围为[0,180],其中,当角度为0时,舵机朝向右侧,角度为180度时,舵机朝向左侧。俯仰角的机械转角范围为[90,180],其中,当角度为90度时,平台成水平,当角度为180度时,平台垂直水平面。 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
Python是一种高级、通用、解释型的编程语言,由Guido van Rossum于1989年发起,1991年正式发布。Python以简洁而清晰的语法著称,强调代码的可读性和易于维护。以下是Python的一些主要特点和优势: 易学易用: Python的语法设计简单直观,更接近自然语言,使初学者更容易上手。这种易学易用的特性促使了Python在教育领域和初学者中的广泛应用。 高级语言: Python是一种高级编程语言,提供了自动内存管理(垃圾回收)等功能,减轻了程序员的负担,同时具有动态类型和面向对象的特性。 跨平台性: Python具有很好的跨平台性,可以在多个操作系统上运行,包括Windows、Linux、macOS等,使得开发的代码可以轻松迁移。 丰富的标准库: Python内置了大量的模块和库,涵盖了文件操作、网络编程、数据库访问等各个方面。这些标准库使得开发者能够快速构建功能丰富的应用程序。 开源: Python是开源的,任何人都可以免费使用并查看源代码。这种开放性促进了Python社区的发展,使得有大量的第三方库和框架可供使用。 强大的社区支持: Python拥有庞大而活跃的开发社区,这使得开发者可以轻松获取帮助、分享经验,并参与到Python的发展中。 适用于多个领域: Python在各种领域都有广泛的应用,包括Web开发、数据科学、人工智能、自动化测试、网络编程等。特别是在数据科学和人工智能领域,Python成为了主流的编程语言之一。 支持面向对象编程: Python支持面向对象编程,允许开发者使用类和对象的概念,提高了代码的重用性和可维护性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值