记录电赛色块追踪部分

news2024/12/22 20:47:47

代码其实也很简单,我只不过加入了按键控制暂停、蜂鸣器、led和如何控制追踪的效果(调PID)。B站的那些大神早早地完成了要求,我犯了一个不好地错误,企图三连让他们分享思路,这是不对的,电赛本身的意义是让我们提高自己对问题的解决能力、时间管理等,是一项紧急情况下的应对能力,考验我们的综合能力、团队合作能力。

import sensor, image, time,pyb
from pyb import Pin
from pid import PID
from pyb import Servo			#调用库
from pyb import LED

pan_servo=Servo(1)  #p7
tilt_servo=Servo(2)	#p8			

#红色色素块
#red_threshold  = (79, 99, -1, 28, 3, 12) #  (79, 99, -1, 28, 3, 12) ((78, 100, -4, 20, -13, 4)) (72, 85, 18, 100, -3, 16)
red_threshold= [(0, 98, 37, 127, -32, 89)]

#pan_pid = PID(p=0.05,i=0.03,d=0.001 imax=90) #脱机运行或者禁用图像传输,使用这个PID
#tilt_pid = PID(p=0.05,i=0.05, imax=90) #脱机运行或者禁用图像传输,使用这个PID

pan_pid = PID(p=0.06,d=0.001,i=0.02, imax=100)#在线调试使用这个PID
tilt_pid = PID(p=0.11,d=0.001,i=0.04, imax=100)#在线调试使用这个PID

#由于openmv脱机运行帧率会提高,运行性能会有所改变,所以需要设置“在线联机调试”和“脱机运行”的两个参数


sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_gain(False) # 颜色跟踪必须关闭自动增益
sensor.set_auto_whitebal(False) # turn this off.
EXPOSURE_TIME_SCALE = 2.0
#画面翻转
sensor.set_vflip(True)
#sensor.set_hmirror (True)
clock = time.clock() # Tracks FPS.	#基本参数设置

def find_max(blobs):
    max_size=0
    for blob in blobs:
        if blob[2]*blob[3] > max_size:
            max_blob=blob
            max_size = blob[2]*blob[3]
    return max_blob											#找到视野中的最大色素块

#初始角度
#pan_servo.angle(35)#openmv上P7为控制云台上舵机的输出引脚(摄像头上下移动)
#tilt_servo.angle(5)         #物理意义的90度

pan_servo.angle(0) #openmv上P7为控制云台上舵机的输出引脚(摄像头上下移动)
tilt_servo.angle(5) #物理意义的90度

#绿色激光与镜头的x,y距离误差补偿,后来发现用不上,调一下激光笔就好了
#shang_error=160-148
#xia_error=120-100

global  pan_output, tilt_output,flag

#P1蜂鸣器
buzzer_pin = pyb.Pin("P1", pyb.Pin.OUT)

#P2:led
led = pyb.LED(2)

#P3:按键
pin1 = Pin('P3', Pin.IN, Pin.PULL_UP)

flag = 1

while(True):
    clock.tick() # Track elapsed milliseconds between snapshots().
    img = sensor.snapshot() # Take a picture and return the image.
    img.draw_cross(int(img.width()/2),int(img.height()/2),color=(0,0,255),size =5, thickness = 1)
    #img.draw_cross(148,100,color=(0,255,0),size =4, thickness = 1)
    buzzer_pin.high()
    key0 = pin1.value()      ##按键控制

    blobs = img.find_blobs(red_threshold)					
    if blobs:
        max_blob = find_max(blobs)

        #pan_error = img.width()/2-max_blob.cx()				#	x横轴方向上的修正参数
        #tilt_error = img.height()/2-max_blob.cy()			   	#	y纵轴方向上的修正参数
        #print("img.height()/2",img.height()/2)

        pan_error =  -(img.width()/2-max_blob.cx())    #	x横轴方向上的修正参数
        tilt_error = -(img.height()/2-max_blob.cy())   #	y纵轴方向上的修正参数

        #if(pan_error > -100)

        #pan_error =  -(74-max_blob.cx())    #x横轴方向上的修正参数
        #tilt_error = -(50-max_blob.cy())   #y纵轴方向上的修正参数

        print("x_error: ", pan_error) #在参数调试窗口打印色块中心坐标与视野中心坐标的偏离值,便于调试与修正
        print("y_error:",  tilt_error)

        img.draw_rectangle(max_blob.rect()) # rect	#在色块外围四周处画框
        img.draw_cross(max_blob.cx(), max_blob.cy()) # cx, cy     #色块中心坐标处画十字

        pan_output=pan_pid.get_pid(pan_error,1)/2
        tilt_output=tilt_pid.get_pid(tilt_error,1)/2

        #print("pan_output",pan_output)		  	     #在参数调试窗口打印坐标值,便于调试与修正
        #print("tilt_output",tilt_output)

        if key0 == 1 :
               #pid控制
               pan_servo.angle(pan_servo.angle() + pan_output)
               tilt_servo.angle(tilt_servo.angle() - tilt_output)

               if -8<pan_error <8 and -9< tilt_error < 9:
                    buzzer_pin.low()   # 发声
                    print("succes")
                    #pan_servo.angle(pan_servo.angle())
                    #tilt_servo.angle(tilt_servo.angle()
                    flag=0

                    time.sleep(0.5)
                    if key0 == 0 and flag ==0:
                                time.sleep(0.5)
                                buzzer_pin.high()  # 发出声音

                                print("按键按下")
                                       #pan_output =0
                                       #tilt_output =0

                                pan_servo.angle(pan_servo.angle())
                                tilt_servo.angle(tilt_servo.angle())

                                       #flag==0

    #没有色块,复位
   # else:
       #pan_servo.angle(10)
       #tilt_servo.angle(6)

此次电赛,我主要负责的是色块追踪部分,在官方给出的代码基础上加以修改以符合电赛的要求,经过测试其精度达不到要求,即误差大于3cm。一方面是算法的原因,没有深究其原理,做到如何精准识别;另一方面是硬件本身的问题,一个好的硬件往往可以帮助我们节约大量的工作和时间。

比赛时现场作品制作图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/840529.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python之prettytable库的使用

文章目录 一 什么是prettytable二 prettytable的简单使用1. 添加表头2. 添加行3. 添加列4. 设置对齐方式4. 设置输出表格样式5. 自定义边框样式6. 其它功能 三 prettytable在实际中的使用 一 什么是prettytable prettytable是Python的一个第三方工具库&#xff0c;用于创建漂亮…

谷粒商城第九天-解决商品品牌问题以及前后端使用检验框架检验参数

目录 一、总述 二、商品分类问题 三、前端检验 四、后端检验 五、总结 一、总述 在完成完商品分类的时候&#xff0c;后来测试的时候还是发现了一些问题&#xff0c;现在将其进行解决&#xff0c;问题如下&#xff1a; 1. 取消显示的时候&#xff0c;如果取消了显示&…

Unity学习参考文档和开发工具

☺ unity的官网文档&#xff1a;脚本 - Unity 手册 ■ 学习方式&#xff1a; 首先了解unity相关概述&#xff0c;快速认识unity编辑器&#xff0c;然后抓住重点的学&#xff1a;游戏对象、组件|C#脚本、预制体、UI ☺ 学习过程你会发现&#xff0c;其实Unity中主要是用c#进行开…

Javaweb学习(2)

Javaweb学习 一、Maven1.1 Maven概述1.2 Maven简介1.3、Maven基本使用1.4、IDEA配置Maven1.6、依赖管理&依赖范围 二、MyBatis2.1 MyBatis简介2.2 Mybatis快速入门2.3、解决SQL映射文件的警告提示2.4、Mapper代理开发 三、MyBaits核心配置文件四、 配置文件的增删改查4.1 M…

【c++】VSCode配置 c++ 环境(重新制作)

上一篇帖子【c】VSCode配置 c 环境&#xff08;小白教程&#xff09;_vscode配置c/c环境_StudyWinter的博客-CSDN博客 大火&#xff0c;但是依旧有很多小伙伴反应没有配好环境&#xff0c;今天打算重新写一个教程&#xff0c;希望对大家有帮助。 1 MinGW下载安装 在CSDN上传了…

高温环境下光模块光功率降低的原因与解决方案

光模块是光纤通信系统中的关键组件&#xff0c;其稳定的光功率输出对于确保通信质量至关重要。然而&#xff0c;高温环境下光模块的光功率往往会出现下降&#xff0c;本期文章我们将探讨高温环境下光模块光功率降低的原因和解决方案。 一、高温环境下光功率降低的原因 &#…

深入理解@ConfigurationProperties注解的作用和用法

文章目录 前言一、配置文件application.properties二、添加依赖三、创建配置类四、测试总结 前言 ConfigurationProperties是一个用于定义属性的注解&#xff0c;通常用于Spring应用程序的配置类中。 通过使用ConfigurationProperties注解&#xff0c;可以将外部配置文件中的属…

YOLOv5引入FasterNet主干网络,目标检测速度提升明显

目录 一、背景介绍1.1 目标检测算法简介1.2 YOLOv5简介及发展历程 二、主干网络选择的重要性2.1 主干网络在目标检测中的作用2.2 YOLOv5使用的默认主干网络 三、FasterNet简介与原理解析3.1 FasterNet概述3.2 FasterNet的网络结构3.2.1 基础网络模块3.2.2 快速特征融合模块3.2.…

ENSP-PPP Chap双向认证

日期6-26 &#x1f4ce;PPP chap 双向认证.zip &#x1f4ce;PPP chap 双向认证.docx

Linux常用命令——domainname命令

在线Linux命令查询工具 domainname 显示和设置系统的NIS域名 补充说明 domainname命令用于显示和设置系统的NIS域名。 语法 domainname(选项)(参数)选项 -v&#xff1a;详细信息模式&#xff1b; -F&#xff1a;指定读取域名信息的文件。参数 NIS域名&#xff1a;指定要…

ClickHouse(十一):Clickhouse MergeTree系列表引擎 - MergeTree(1)

进入正文前&#xff0c;感谢宝子们订阅专题、点赞、评论、收藏&#xff01;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; &#x1f3e1;个人主页&#xff1a;含各种IT体系技术&#xff0c;IT贫道_Apache Doris,Kerberos安全认证,大数据OLAP体系技术栈-CSDN博客 &…

通义千问7B本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

Flink开发环境准备: centos-jdk8

linux-jdk8 - Flink开发环境准备 一、基本介绍二、环境准备1.1 JDK环境1.2 开发工具1.3 Maven环境 三、flink下载安装配置3.1 Flink下载3.2 flink本地模式安装 - linux3.3 常用配置3.4 日志的查看和配置 四、单机 Standalone 的方式运行 Flink 一、基本介绍 Flink底层源码是基于…

架构,性能和游戏 《游戏编程模式》学习笔记

开新坑&#xff0c;准备把《游戏编程模式》这本书啃完。这是一本讲设计模式的书&#xff0c;针对游戏开发而作&#xff0c;写得很好。 以下是读书笔记&#xff0c;文末有原文链接 每个程序都有一定的软件架构&#xff0c;哪怕是全塞到main里也是一种架构好的架构可以把代码写成…

【LeetCode 75】第二十题(2215)找出两数组的不同

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码运行结果&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 找出两个数组中不一样的数,将nums1中有的数而nums2没有的数放在res[0]中,将nums2中有的数二nums1没有的数放在res[1]中. 那我们…

路由器静态路由实验

介绍 静态路由是由管理员手动配置和维护的路由。 如何理解静态路由了&#xff1f;配置一条静态路由就是告诉路由器怎么去往某个目的ip或ip地址段。去往目的地的时候需要查找路由表。 静态路由优缺点&#xff1a; 优点&#xff1a; 静态路由配置简单&#xff0c;并且无需动态…

03.利用Redis实现缓存功能---解决缓存穿透版

学习目标&#xff1a; 提示&#xff1a;学习如何利用Redis实现添加缓存功能解决缓存穿透版 学习产出&#xff1a; 缓存穿透讲解图&#xff1a; 解决方案&#xff1a; 采用缓存空对象采用布隆过滤器 解决方案流程图&#xff1a; 1. 准备pom环境 <dependency><gro…

完整模型的训练套路

从心所欲 不逾矩 天大地大 皆可去 一、官方模型的初使用 使用VGG16模型 VGG模型使用代码示例&#xff1a; import torchvision.models from torch import nndataset torchvision.datasets.CIFAR10(/cifar10, False, transformtorchvision.transforms.ToTensor())vgg16_true …

百度智能创做AI平台

家人们好&#xff0c;在数字化时代&#xff0c;人工智能正引领着一场前所未有的创新浪潮。今天&#xff0c;我们将为大家介绍百度智能创做AI平台&#xff0c;这个为创意赋能、助力创作者的强大工具。无论你是创意工作者、内容创作者&#xff0c;还是想要释放内心创造力的个人&a…

人工智能巨头齐聚,研究和掌控人工智能

这四家公司表示&#xff0c;他们成立了Frontier Model Forum&#xff0c;以确保"前沿AI模型的安全和负责任的开发"。 四家全球最先进的人工智能公司成立了一个研究日益强大的人工智能并建立最佳控制实践的组织&#xff0c;随着公众对技术影响的担忧和监管审查的增加…