当前位置: 首页 > news >正文

【2023年电赛】运动目标控制与自动追踪系统(E 题)最简单实现

本方案的思路是最简单的不涉及复杂算法:识别矩形框,标记矩形框,输出坐标和中心点,计算长度,控制舵机移动固定长度!仅供完成基础功能参考,不喜勿喷!

# 实现运动目标控制与自动追踪系统

## 任务概述
本文将介绍如何使用OpenMV开发板和舵机构建一个运动目标控制与自动追踪系统。该系统包括模拟目标运动的红色光斑位置控制系统和指示自动追踪的绿色光斑位置控制系统。通过本文的实现,我们可以在图像中识别目标,控制舵机沿着目标移动,并输出目标矩形框的中心位置和长度。

## 硬件准备
1. OpenMV H7 Plus开发板
2. 红色和绿色激光笔
3. 两个舵机(连接到OpenMV开发板)

## 硬件连接
将两个舵机分别连接到OpenMV开发板的舵机引脚(根据实际引脚选择)。

## 相机设置
在代码中,我们将相机设置为QVGA分辨率和RGB565格式。

import sensor, image, math, pyb# 初始化相机
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)# 其他代码...

## 目标检测与跟踪(目标检测部分代码实测过!)
### 寻找矩形函数
为了在图像中识别目标矩形框,我们需要编写一个寻找矩形函数。该函数将返回第二大的矩形区域,以便我们可以找到目标的位置。

# 寻找矩形函数,返回第二大的矩形区域
def find_second_largest_rectangle(blobs):max_area = 0max_blob = Nonesecond_max_area = 0second_max_blob = Nonefor blob in blobs:area = blob.area()if area > max_area:second_max_area = max_areasecond_max_blob = max_blobmax_area = areamax_blob = blobelif area > second_max_area:second_max_area = areasecond_max_blob = blobreturn second_max_blob

## 主循环
在主循环中,我们将不断获取图像并进行目标检测和跟踪。

while True:img = sensor.snapshot() # 获取图像blobs = img.find_blobs([black_threshold], pixels_threshold=200, area_threshold=200)if blobs:# 寻找第二大的矩形区域second_max_blob = find_second_largest_rectangle(blobs)if second_max_blob:img.draw_rectangle(second_max_blob.rect(), color=(255, 0, 0), thickness=4) # 绘制第二大的矩形框,颜色为红色# 其他代码...

## 舵机控制
为了实现目标跟踪,我们需要控制舵机使其沿着矩形框移动一圈,并回到中心点。这里我们使用了`pyb.Servo()`来控制舵机运动。

# 舵机参数
servo_pan_pin = 1 # 舵机1的引脚编号
servo_tilt_pin = 2 # 舵机2的引脚编号
servo_pan = pyb.Servo(servo_pan_pin) # 初始化舵机1
servo_tilt = pyb.Servo(servo_tilt_pin) # 初始化舵机2
servo_speed = 50 # 舵机转动速度(0-100,越大越快)
servo_pan_range = (0, 180) # 舵机1转动范围(角度)
servo_tilt_range = (0, 180) # 舵机2转动范围(角度)# 控制舵机沿着矩形框移动一圈,并回到中心点
for angle in range(servo_pan_range[0], servo_pan_range[1], servo_speed):servo_pan.angle(angle) # 控制舵机1水平旋转servo_tilt.angle(angle) # 控制舵机2垂直旋转pyb.delay(100) # 延时一段时间,控制舵机转动速度# 将舵机回到中心点
servo_pan.angle((servo_pan_range[0] + servo_pan_range[1]) // 2)
servo_tilt.angle((servo_tilt_range[0] + servo_tilt_range[1]) // 2)

## 结果输出
在检测到目标后,我们将输出目标矩形框的中心位置和长度。同时,我们会在图像中标记出矩形框的位置。(测试坐标和长度还是比较准备 )

# 获取矩形框的中心点坐标
x, y = second_max_blob.cx(), second_max_blob.cy()# 计算矩形框的长度和宽度(单位:厘米)
width_cm = 2 * distance_cm * math.tan(math.radians(H_FOV / 2)) * (second_max_blob.w() / img.width())
height_cm = 2 * distance_cm * math.tan(math.radians(V_FOV / 2)) * (second_max_blob.h() / img.height())# 输出矩形框的中心点坐标和长度(单位:厘米)
print("Rectangle Center Coordinates (cm): x={}, y={}".format(x, y))
print("Rectangle Width (cm): {}, Height (cm): {}".format(width_cm, height_cm))# 绘制黄色圆点标记矩形框中心位置
img.draw_circle(x, y, 5, color=(255, 255, 0), thickness=2)

## 运行效果
将硬件连接好后,上传代码到OpenMV开发板,并调整舵机参数和位置。运行代码后,你将看到舵机沿着目标矩形框移动,并在图像中标记出矩形框的位置和中心点。

## 结束语
通过本文的实现,我们成功搭建了一个运动目标控制与自动追踪系统。通过使用OpenMV开发板和舵机,我们能够在图像中识别目标,并控制舵机使其跟踪目标。

## 参考链接
1. OpenMV官方网站: https://openmv.io/
2. Pyb Servo文档: https://docs.openmv.io/library/pyb.Servo.html

欢迎大家提出宝贵的意见和建议,共同探讨学习和改进。谢谢阅读!

http://www.lryc.cn/news/106588.html

相关文章:

  • 【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)
  • 宝塔安装ModStart,快速开启高效开发之旅!
  • 第六章 HL7 架构和可用工具 - 定义新的消息类型和结构类型
  • 通向架构师的道路之Tomcat性能调优
  • vue03 es6中对数组的操作,vue对数据监控的原理(分别对对象和数组的监控)
  • 微信小程序 - 解析富文本插件版们
  • 工厂方法模式(Factory Method)
  • js如何将图片转成BASE64编码,网页跟uniapp开发的app的区别?
  • 1400*C. Computer Game
  • windows10访问Ubuntu 18.04共享目录(已验证)
  • Linux安装redis执行make命令报错:gcc not found和*** [adlist.o] Error 1
  • R语言glmnet包详解:横截面数据建模
  • LeetCode257. 二叉树的所有路径
  • ajax、axios、fetch的区别
  • Liunx开发工具
  • Docker入门之运行Nginx案例
  • 【深度学习环境】安装anaconda、tensorflow、pycharm
  • mockery 模拟
  • 汽车后视镜反射率检测系统
  • uni-app引用外部图标库(阿里矢量图)
  • day49-Todo List(待办事项列表)
  • 寻找丢失数字:数学与位运算的解密之旅
  • 数论分块学习笔记
  • 【基础理论】了解点过程
  • 深入理解Spring MVC中的@ResponseBody注解
  • 大数据学习教程:Linux高级教程(下)
  • 1.Oracle建表及使用
  • 《网络是怎样连接的》(二.2)
  • MySQL加密插件安装
  • 新手入门Jenkins自动化部署入门详细教程