基于OpenMV 双轴机械臂 机器学习

文章目录

  • 一、项目简要
  • 二、目标追踪
    • 1. 色块识别与最大色块筛选
    • 2. PID位置闭环
  • 三、机器学习
    • 1. Device1
    • 2. Device2
  • 四、效果演示


一、项目简要

两套二维云台设备,Device1通过摄像头捕捉目标物块点位进行实时追踪,再将自身点位传到Device2,Device2学习Device1动作,控制误差<=1°。
在这里插入图片描述

二、目标追踪

以摄像头左上角为坐标原点建立坐标系,通过识别目标物块 获取物块的中心坐标点位,以识别到的点位作为实际点位,摄像头的中心坐标作为目标点位,引用PID算法分别在x轴和y轴上设计两套位置闭环,将输出信号赋给舵机,使其收敛于目标点位。

在物块识别中,是通过颜色进行区分,所以这里难免会出现误差,为了避免一些小杂物扰乱采集,则在图像中使用物块面积计算过滤掉小的物块,筛选出最大的目标物块

1. 色块识别与最大色块筛选

red_threshold  = (4, 92, -103, 104, -18, -99)   #色块阈值def find_max(blobs):                           #寻找最大色块函数max_size=0for blob in blobs:if blob[2]*blob[3] > max_size:max_blob=blobmax_size = blob[2]*blob[3]return max_blobwhile(True):clock.tick()                               #帧率控制img = sensor.snapshot()                    #图像截取blobs = img.find_blobs([red_threshold])    #发现色块if blobs:max_blob = find_max(blobs)             #筛选色块

2. PID位置闭环

pan_servo=Servo(1)          #水平方向的舵机 
tilt_servo=Servo(2)         #垂直方向的舵机   pan_pid = PID(p=0.07, i=0, imax=90)       #水平PI参数调整 
tilt_pid = PID(p=0.05, i=0, imax=90)      #垂直PI参数调整      pan_error = max_blob.cx()-img.width()/2            #水平方向误差
tilt_error = max_blob.cy()-img.height()/2          #垂直方向误差
pan_output=pan_pid.get_pid(pan_error,1)/2		   #水平PID计算
tilt_output=tilt_pid.get_pid(tilt_error,1)		   #垂直PID计算
pan_servo.angle(pan_servo.angle()+pan_output)	   #水平舵机反馈
tilt_servo.angle(tilt_servo.angle()+tilt_output)   #垂直舵机反馈

在这里插入图片描述

三、机器学习

在目标追踪的基础上,第二套设备只需要去模仿第一套设备的动作,两者之间通过串口传输数据,再计算出实际角度与目标角度之间的误差。

1. Device1

将Device1的自身点位发送到Device2

from pyb import UART
uart = UART(3, 115200)#获取本装置二维云台实时转动角度
data = str(int(pan_servo.angle())) + ':' + str(int(tilt_servo.angle()))  
data_bytes = data.encode()    #格式转换
uart.write(data_bytes)        #串口发送

2. Device2

  • 接收来自Device1发过来的实时点位
# 将接收到的字节串解码为字符串并去除首尾的空白字符
received_data = uart.readline().decode().strip()  
num1, num2 = map(int, received_data.split(':'))    #解析数据
  • 控制二维云台学习Device1
pan_servo.angle(num1)        #水平转动
tilt_servo.angle(num2)       #垂直转动
  • 计算转动误差并发送到PC上位机
a=num1-pan_servo.angle()           #获取自身水平转动角度误差
b=num2-tilt_servo.angle()          #获取自身垂直转动角度误差data = str(int(a)) + ':' + str(int(b))+' '    #数据打包
data_bytes = data.encode()                    #格式转换
uart.write(data_bytes)                        #串口发送

如下图可见,水平误差和垂直误差 控制在1°,满足需求
在这里插入图片描述

四、效果演示

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开发 Chrome 浏览器插件入门

前言 简介 Chrome 插件是扩展 Chrome 浏览器的功能的软件程序。它们可以执行各种任务&#xff0c;例如阻止广告、增强隐私、添加新功能等等。 要开始编写 Chrome 插件&#xff0c;你需要掌握以下&#xff1a; 1.JavaScript语言 2.html 3.css 4.会使用chrome扩展开发手册…

opencv绘制线段------c++

绘制线段 bool opencvTool::drawLines(std::string image_p, std::vector<cv::Point> points) {cv::Mat ima cv::imread(image_p.c_str()); // 读取图像&#xff0c;替换为你的图片路径 cv::Scalar red cv::Scalar(0, 0, 255); // Red color int thickness 2;// 遍…

微信小程序开发:2.小程序组件

常用的视图容器类组件 View 普通的视图区域类似于div常用来进行布局效果 scroll-view 可以滚动的视图&#xff0c;常用来进行滚动列表区域 swiper and swiper-item 轮播图的容器组件和轮播图的item项目组件 View组件的基本使用 案例1 <view class"container"&…

Jrebel无法启动项目

使用Jrebel的debug模式无法启动项目&#xff0c;而使用Jrebel的普通模式可以。 debug模式输出日志如下&#xff0c;只有jrebel&#xff0c;没有出现系统启动日志&#xff0c;开始以为是断点&#xff0c;禁用也无法正常启动。而其他项目则jrebel 的debug可以 解决办法&#xff…

【算法刷题 | 贪心算法02】4.24(摆动序列)

文章目录 3.摆动序列3.1题目3.2解法&#xff1a;贪心3.2.1贪心思路3.2.2代码实现 3.摆动序列 3.1题目 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。 第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素…

【综述】DSP处理器芯片

文章目录 TI DSP C2000系列 TMS320F28003X 典型应用 开发工具链 参考资料 TI DSP TI C2000系列 控制领域 TI C5000系列 通信领域 TI C6000系列 图像领域 C2000系列 第三代集成了C28浮点DSP内核&#xff0c;采用了65nm工艺&#xff08;上一代180nm&#xff09; 第四代正在…

uniapp制作安卓原生插件踩坑

1.uniapp和Android工程互相引用讲解 uniapp原生Android插件开发入门教程 &#xff08;最新版&#xff09;_uniapp android 插件开发-CSDN博客 2.uniapp引用原生aar目录结构 详细尝试步骤1完成后生成的aar使用&#xff0c;需要新建nativeplugins然后丢进去 3.package.json示例…

数据聚类:Mean-Shift和EM算法

目录 1. 高斯混合分布2. Mean-Shift算法3. EM算法4. 数据聚类5. 源码地址 1. 高斯混合分布 在高斯混合分布中&#xff0c;我们假设数据是由多个高斯分布组合而成的。每个高斯分布被称为一个“成分”&#xff08;component&#xff09;&#xff0c;这些成分通过加权和的方式来构…

Bert基础(十八)--Bert实战:NER命名实体识别

1、命名实体识别介绍 1.1 简介 命名实体识别&#xff08;NER&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一项关键技术&#xff0c;它的目标是从文本中识别出具有特定意义或指代性强的实体&#xff0c;并对这些实体进行分类。这些实体通常包括人名、地名、组织…

小龙虾优化算法(Crayfish Optimization Algorithm,COA)

小龙虾优化算法&#xff08;Crayfish Optimization Algorithm&#xff0c;COA&#xff09; 前言一、小龙虾优化算法的实现1.初始化阶段2.定义温度和小龙虾的觅食量3.避暑阶段&#xff08;探索阶段&#xff09;4.竞争阶段&#xff08;开发阶段&#xff09;5.觅食阶段&#xff08…

高速风筒电源IC辉芒微FT8440E /FT8440A

深圳市三佛科技有限公司分享相关资料&#xff0c;高精度、高效率、低成本离线式功率开关 FT8440x是-款高性能、高精度、低成本的非隔离PWM功率开关。它包含一个专门]的电流模PWM控制器和一个高压功率开关管。内置的误差放大器经过优化保证优越的动态响应。高精度的内部分压电阻…

深度学习-线性代数

目录 标量向量矩阵特殊矩阵特征向量和特征值 标量由只有一个元素的张量表示将向量视为标量值组成的列表通过张量的索引来访问任一元素访问张量的长度只有一个轴的张量&#xff0c;形状只有一个元素通过指定两个分量m和n来创建一个形状为mn的矩阵矩阵的转置对称矩阵的转置逻辑运…

【LLMOps】小白详细教程,在Dify中创建并使用自定义工具

文章目录 博客详细讲解视频点击查看高清脑图 1. 搭建天气查询http服务1.1. flask代码1.2. 接口优化方法 2. 生成openapi json schema2.1. 测试接口2.2. 生成openapi schema 3. 在dify中创建自定义工具3.1. 导入schema3.2. 设置工具认证信息3.3. 测试工具 4. 调用工具4.1. Agent…

【JavaWeb】Day51.Mybatis动态SQL(一)

什么是动态SQL 在页面原型中&#xff0c;列表上方的条件是动态的&#xff0c;是可以不传递的&#xff0c;也可以只传递其中的1个或者2个或者全部。 而在我们刚才编写的SQL语句中&#xff0c;我们会看到&#xff0c;我们将三个条件直接写死了。 如果页面只传递了参数姓名name 字…

Multitouch 1.27.28 免激活版 mac电脑多点触控手势增强工具

Multitouch 应用程序可让您将自定义操作绑定到特定的魔术触控板或鼠标手势。例如&#xff0c;三指单击可以执行粘贴。通过执行键盘快捷键、控制浏览器的选项卡、单击鼠标中键等来改进您的工作流程。 Multitouch 1.27.28 免激活版下载 强大的手势引擎 精心打造的触控板和 Magic …

iOS 模拟请求 (本地数据调试)

简介 在iOS 的日常开发中经常会遇到一下情况&#xff1a;APP代码已编写完成&#xff0c;但后台的接口还无法使用&#xff0c;这时 APP开发就可能陷入停滞。此时iOS 模拟请求就派上用场了&#xff0c;使用模拟请求来调试代码&#xff0c;如果调试都通过了&#xff0c;等后台接口…

迁移学习基础知识

简介 使用迁移学习的优势&#xff1a; 1、能够快速的训练出一个理想的结果 2、当数据集较小时也能训练出理想的效果。 注意&#xff1a;在使用别人预训练的参数模型时&#xff0c;要注意别人的预处理方式。 原理&#xff1a; 对于浅层的网络结构&#xff0c;他们学习到的…

matplotlib绘图

matplotlib版本&#xff1a;3.7.5 numpy版本&#xff1a;1.24.3 pandas版本&#xff1a;2.0.3 导包构造数据 import matplotlib.pyplot as plt import numpy as np import pandas as pd# %matplotlib inlinea np.linspace(0, 2 * np.pi, 100) asin np.sin(a) acos np.cos(…

c++理论篇(一) ——浅谈tcp缓存与tcp的分包与粘包

介绍 在网络通讯中,Linux系统为每一个socket创建了接收缓冲区与发送缓冲区,对于TCP协议来说,这两个缓冲区是必须的.应用程序在调用send/recv函数时,Linux内核会把数据从应用进程拷贝到socket的发送缓冲区中,应用程序在调用recv/read函数时,内核把接收缓冲区中的数据拷贝到应用…

Bert语言大模型基础

一、Bert整体模型架构 基础架构是transformer的encoder部分&#xff0c;bert使用多个encoder堆叠在一起。 主要分为三个部分&#xff1a;1、输入部分 2、注意力机制 3、前馈神经网络 bertbase使用12层encoder堆叠在一起&#xff0c;6个encoder堆叠在一起组成编码端&#xf…