K210学习笔记——三角函数下的目标追踪

news2024/11/16 13:55:32

各位正在读文章的朋友们你们好,本人为非专业学生,如有不对的地方,期待您的指正。

目标追踪的意思是:识别到目标物体,通过舵机转动,朝向目标物体.

实验器材:二自由度舵机云台加两个SG90舵机,K210。

实验分两步走:一是识别到目标物体,二是识别到色块后返回色块位置坐标,进而控制舵机转动指向目标物体。

一:识别目标色块——image.find_blobs函数:

识别颜色方块,在编程环境中,打开工具中的机器视觉、阈值管理器,在网上找一个颜色方块,或者在缓冲区内,选择最佳的颜色跟踪阈值,通过不断调整,使目标物体在二进制图像中呈现白色,其余为黑色。下面的一串数字即为目标物体特定的颜色阈值。

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

image.find_blobs()函数用来识别目标色块。

thresholds为目标色块的颜色阈值。

roi为感兴趣区,我这里只有一个色块,所以不用理它。

x_stride和y_stride分别是查找的色块在x,y方向上的最小宽度的像素。结合实际摄像头到目标色块的距离,设置它的大小,可排除一些误差。

通过此函数,可以获取以下的值:

blobs[0] = 色块外框的X坐标,blobs[1] = 色块外框的Y坐标,blobs[2] = 色块外框的宽度,blobs[3] = 色块外框的高度,blobs[4] = 色块外框的像素数量,blobs[5] = 色块外框的中心点横坐标,blobs[6] = 色块外框的中心点纵坐标。

利用这些值,我们可以在显示屏上“圈住”目标色块、在旁边写单词,画中心叉等。

最重要的就是获取中心点横纵坐标(blobs[5],blobs[6]),用它们来确定色块的位置。

舵机的转动——Servo函数:

舵机的转动是由PWM控制的,利用内部的定时器生成20ms为一个周期的脉冲,只有在此周期下,SG90舵机才能工作,另通过定时器控制高电平的占空比,函数是打包好的,直接就拿来用了。

def Servo(servo,angle):
    S1.duty((angle+90)/180*10+2.5)

比如输入angle = 0 则S1.duty(7.5),对应上图 0度在20ms的工作脉冲中为7.5%的占空比。

总:

import sensor,image,lcd,time
import math
from machine import Timer,PWM
tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PWM)
S1 = PWM(tim, freq=50, duty=0, pin=17)//自由映射在17引脚
S2 = PWM(tim, freq=50, duty=0, pin=15)//自由映射在15引脚

def Servo(servo,angle):
    S1.duty((angle+90)/180*10+2.5)

lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000)
sensor.set_auto_exposure(1)
sensor.set_auto_gain(1)
sensor.set_vflip(1)
sensor.set_hmirror(1)
sensor.run(1)

red_threshold   = ((43, 66, 45, 107, 40, 1))

bfive=[];bsix=[]
while True:
    
    img=sensor.snapshot()
    blobs = img.find_blobs([red_threshold],x_strides=100,y_strides=100)
    if blobs:
        for b in blobs:
            tmp=img.draw_rectangle(b[0:4],color=(225,225,225))##在图像上绘制一个矩形。
            tmp=img.draw_string(b[0],(b[1]-10),"BOX",color=(0,0,255))
            tmp=img.draw_cross(b[5], b[6])##画十字交叉
            bfive.append(b[5]);bsix.append(b[6])
            if len(bfive)==50 and len(bsix)==50:
     

                hengzuobiao=max(bfive,key=bfive.count)
                zongzuobiao=max(bsix,key=bsix.count) 
                print("中心点横坐标为",hengzuobiao)
                print("中心点纵坐标为",zongzuobiao)
                x = hengzuobiao
                y = 240 - zongzuobiao ##相对于舵机云台
                b = 300               ##b为平台到图像之间的距离,假设为300(尚未搭建实验台)
                a = math.sqrt(b*b+(160-x)*(160-x))
                if x <= 160:
                    jiaoA = math.degrees(math.atan((160-x)/b))##角a为水平方向舵机偏转角度,b为舵机云台到图像的距离,为固定已知值
                    jiaoB = math.degrees(math.atan(y/a))      ##角c为垂直方向偏转角度
                else:
                    jiaoA = -math.degrees((math.atan((x-160)/b)))
                    jiaoB = math.degrees(math.atan(y/a))
                bfive=[];bsix=[]
                print("水平方向舵机应偏转角度为:",jiaoA,"度")
                print("垂直方向舵机应偏转角度为:",jiaoB,"度")
                
                Servo(S1,jiaoA)
                time.sleep(1)
                Servo(S2,jiaoB)
                
                time.sleep(1)
                Servo(S1,-jiaoA)
                Servo(S2,-jiaoB)##复位


    lcd.display(img)

math.atan()求出反三角正切值,math.degrees()将弧度制转化为角度值。

注意:

本实验因没有搭建实验台,有些数据是模拟的,若假设摄像截取的图片大小在真实平面中为320dm * 240dm,可参考上面代码,这样对应的坐标值就可以当作长度值用于计算。

垂直方向的舵机起并不是在X-Y平面上的,包括水平方向也是的,有一定高度。

舵机云台放置在正对拍摄面(X-Y),居中位置.

K210返回的坐标值是左上角为原点,水平向右为X轴正方向,垂直向下为Y轴正方向。

实验现象:

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

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

相关文章

预警:传统的QA岗位将被DevOps淘汰

导读在大多数机构或公司里&#xff0c;软件开发过程主要遵循一个或多个开发模型&#xff0c;例如瀑布模型或敏捷模型。在瀑布模型中&#xff0c;测试活动一般都在后期进行。软件开发完成后&#xff0c;缺陷被QA团队找出&#xff0c;然后再被修复。后两个活动不断循环和重复&…

Python基础语法入门(第二十三天)——正则表达式

正则表达式是一种文本模式&#xff0c;用于匹配字符串&#xff0c;它是由字符和特殊字符组成的模式。正则表达式可以用于验证、搜索、替换和提取字符串。其能够应用于各种编程语言和文本处理工具中&#xff0c;如Python、Java、JavaScript等。 正则表达式在线测试工具&#xf…

Spring源码编译-for mac

超详细的spring源码编译 记&#xff1a;编译成功时间&#xff1a;2023.08.19 环境准备&#xff1a; 1.idea 2023.1.1 Community Edition 2.jdk1.8 3.gradlegradle-5.6.4 4.spring源码(版本&#xff1a;spring-framework-v5.2.25.RELEASE) 一.spring源码下载 github 加速网站&…

stm32单片机4个开关控制8个LED灯,4种不同模式参考源代码(附带PROTEUS电路图)

//main.c文件 /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body************************************************************************…

0101前期准备-大数据学习

文章目录 1 前言2 配置VMware虚拟机2.1 设置主机名和固定IP2.2 本地系统与Linux系统配置主机名映射2.3 配置虚拟机之间用户的SSH免密互通2.4 安装JDK环境2.5 关闭防火墙和SELinux2.6 更新时区和同步时间2.7 保存虚拟机快照 结语 1 前言 我们从基础的hadoop开始学起&#xff0c;…

Python上楼梯问题:递归解法探究(斐波那契变种)(记忆化递归)

文章目录 上楼梯问题&#xff1a;递归解法探究问题定义解决方案1. 递归2. 记忆化递归关于python memo{}默认参数和字典的语法语法功能版本信息注意事项 结论 上楼梯问题&#xff1a;递归解法探究 在这篇文章中&#xff0c;将对上楼梯问题进行深入探讨。上楼梯问题是一种常见的…

2D应用开发是选择WebGL 还是选择Canvas?

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 在介绍WebGL和Canvas的区别和联系之前&#xff0c;需要先了解它们各自的定义和特点。 WebGL是一种基于标准HTML5的技术&#xff0c;用于在Web浏览器中实时渲染3D图形。它是由Khronos Group开发的一套…

C++系列-内存模型

内存模型 内存模型四个区代码区全局区栈区堆区内存开辟和释放在堆区开辟数组 内存模型四个区 不同区域存放的数据生命周期是不同的&#xff0c;更为灵活。 代码区&#xff1a;存放函数体的二进制代码&#xff0c;操作系统管理。全局区&#xff1a;存放全局变量&#xff0c;常…

工厂模式的三种姿态?

在软件工程中常见的设计模式——工厂模式。工厂模式是一种有力的工具&#xff0c;用于创建对象实例的方式&#xff0c;可以帮助我们更好地组织代码和降低耦合性。在本文中&#xff0c;我将为大家详细介绍工厂模式的三种姿态&#xff0c;同时通过举例和代码演示来帮助大家更好地…

Docker环境安装elasticsearch和kibana

一、安装elasticsearch 创建es-network&#xff0c;让es、kibana在同一个网段&#xff1a; docker network create --driverbridge --subnet192.168.1.10/24 es-network运行elasticsearch docker run -d \ --name elasticsearch \ # 容器名 --hostname elasticsearch # 主机…

【Redis】Redis中的布隆过滤器

【Redis】Redis中的布隆过滤器 前言 在实际开发中&#xff0c;会遇到很多要判断一个元素是否在某个集合中的业务场景&#xff0c;类似于垃圾邮件的识别&#xff0c;恶意IP地址的访问&#xff0c;缓存穿透等情况。类似于缓存穿透这种情况&#xff0c;有许多的解决方法&#xf…

高效的WMS系统手持盘点方案

WMS系统手持盘点就是指利用WMS系统支持的手持式电子盘点设备进行库存盘点的方式。 具体来说: - 手持盘点设备是一种小型的电子设备,具有移动条形码扫描功能,可以实时与WMS系统联通。 - WMS系统利用手持设备,可以给仓储人员下发具体的盘点任务,例如需要盘点的货位、商品等信息…

mybatis plus 配置自动设置创建时间和创建人id

1.新建 MyMetaObjectHandler package com.ruoyi.framework.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.ruoyi.common.bean.LocalUser; import com.ruoyi.coupon.domain.CouponUser; import org.apache.ibatis.reflection.MetaObjec…

软件报错msvcr90.dll丢失的解决方法,亲测可以修复

我曾经遇到过一个令人头疼的问题&#xff1a;msvcr90.dll丢失。这个问题导致了我的程序无法正常运行&#xff0c;让我感到非常苦恼。然而&#xff0c;在经过一番努力后&#xff0c;我终于成功地修复了这个问题&#xff0c;这让我感到非常欣慰和满足。 msvcr90.dll丢失的原因可能…

python高级基础

文章目录 python高级基础闭包修饰器单例模式跟工厂模式工厂模式单例模式 多线程多进程创建websocket服务端手写客户端 python高级基础 闭包 简单解释一下闭包就是可以在内部访问外部函数的变量&#xff0c;因为如果声明全局变量&#xff0c;那在后面就有可能会修改 在闭包中的…

深入探讨API接口测试:从基础到高级策略

引言&#xff1a;API测试的重要性 在当前的技术趋势中&#xff0c;API&#xff08;应用程序接口&#xff09;已经成为连接各种系统和服务的基石。API不仅仅是大型企业的领域&#xff0c;中小型公司和初创公司也越来越依赖API来拓展他们的业务功能和跨系统通信。正因如此&#…

企业数字化转型大数据湖一体化平台项目建设方案PPT

导读&#xff1a;原文《企业数字化转型大数据湖一体化平台项目建设方案PPT》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 喜欢文章&#xff0c;您可以点赞评论转发…

(搜索) 剑指 Offer 38. 字符串的排列 ——【Leetcode每日一题】

❓剑指 Offer 38. 字符串的排列 难度&#xff1a;中等 输入一个字符串&#xff0c;打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组&#xff0c;但里面 不能有重复元素。 示例: 输入&#xff1a;s “abc” 输出&#xff1a;[“abc”,“acb”,“bac”…

【学习日记】【FreeRTOS】时间片的实现

前言 本文以野火的教程和代码为基础&#xff0c;对 FreeRTOS 中时间片的概念作了解释&#xff0c;并且给出了实现方式&#xff0c;同时发现并解决了野火教程代码中的 bug。 一、时间片是什么 在前面的文章中&#xff0c;我们已经知道任务根据不同的优先级被放入就绪列表中不…

符号随机梯度下降算法SIGNSGD

考虑随机优化问题&#xff1a; 符号随机梯度下降(SIGNSGD)算法&#xff1a; 假设基础&#xff1a; 收敛定理&#xff1a; 联邦优化&#xff1a;