七轴开源协作机械臂myArm视觉跟踪技术!
引言
ArUco标记是一种基于二维码的标记,可以被用于高效的场景识别和位置跟踪。这些标记的简单性和高效性使其成为机器视觉领域的理想选择,特别是在需要实时和高精度跟踪的场景中。结合机器学习和先进的图像处理技术,使用ArUco标记的机械臂系统可以实现更高级的自动化功能,如精确定位、导航和复杂动作的执行。
本案例旨在展示结合ArUco标记和机械臂运动控制技术,实现对机械臂的高精度控制和姿态跟踪。通过分析和解释脚本的不同组成部分,本文将探讨如何通过机器视觉识别技术和复杂的数据处理算法,来增强机械臂的操作能力。此外,还将展示机械臂在捕捉和响应环境变化方面的能力,以及如何通过编程和算法优化来提高整体系统的效率和准确性。
技术概述
机械臂-myArm 300 Pi
myArm 300 Pi是大象机器人最新出的一款七自由度的机械臂,搭载树莓派4B 4g芯片,专门为机器人定制了ubuntu mate 20.04操作系统。myArm提供了7自由度的灵活性,使它超越6自由度机器人,让机器人手臂的移动可以如同人类手臂一样灵活。
myArm内置接口可以进行超高难度的肘关节姿态变换,在实践教学中,可以用于机器人姿态研究、机器人运动路径规划学习、机器人冗余自由度的管理和利用、正逆运动学、ROS机器人开发环境、机器人应用开发、编程语言开发和底层数据处理等多种机器人相关的学科教育。开放了树莓派4B开发板和末端Atom近乎100%的硬件接口,可以搭配用户个人的树莓派4B及M5Atom的周边配件,进行个性化的场景开发,以满足不同用户的创意开发。
ArUco 码标记
ArUco 标记是一种二维条形码系统,它在机器视觉领域中被广泛用于标记检测和空间定位。这些标记由黑白图案组成,通常呈正方形,中心包含一个独特的二进制模式,使其能够被计算机视觉系统快速而准确地识别。
ArUco 标记的特点:
- 唯一性:每个 ArUco 标记具有独特的编码,允许识别系统轻松区分不同的标记
- 低成本:与其他高级定位系统相比,ArUco 标记不需要昂贵的设备或复杂的安装,可以直接打印ArUco标记。
- 定位和导航:在机器视觉系统中,ArUco 标记被用作参考点,帮助机械臂或移动机器人定位自身位置或导航至特定位置。
- 姿态估计:通过分析摄像头捕捉到的 ArUco 标记图像,系统能够计算出标记相对于摄像头的位置和方向(即姿态)。这对于精确控制机械臂或其他自动化设备至关重要。
相关软件和库
操作系统:Ubuntu mate 20.04
编程语言:Python 3.9+
主要功能包:pymycobot,OpenCV,numpy,math
- pymycobot-控制机械臂运动的库,多种控制接口
- OpenCV- 提供了丰富的图像处理和视频分析功能,包括对象检测,面部识别,运动跟踪,图形滤波等
- Numpy-是一个核心科学计算哭,它提供了高性能的多维数组对象和工具,用于处理大量数据。
- Math-提供了一系列基本的数学运算函数和常量,如三角函数、指数和对数函数、各种数学常数等。
系统设计与实现
物料准备
物料名称 | 数量 |
Computer Camera | 1 |
myArm 300 Pi | 1 |
ArUco 标志物 | 1 |
Keyboard and Mouse | 1 |
Monitor | 1 |
机械臂的姿态跟踪
- 定义:姿态跟踪通常指的是监测和记录一个物体在三维空间中的精确位置(平移)和方向(旋转),即其“姿态”。
- 技术应用:在机械臂的应用中,姿态跟踪涉及到实时监控和控制机械臂自身的各个关节和末端执行器的精确位置和方向。这通常需要复杂的传感器系统和算法,以实现高精度的控制。
- 用途:姿态跟踪对于执行精密的操作任务非常关键,如在制造业中的装配、焊接、在医疗领域中的外科手术辅助
项目组成部分
整个系统的架构主要分为以下几个部分:
- 硬件组成:机械臂,usb摄像头以及使用到的设备。
- 软件和控制系统:通过OpenCV识别ArUco 标记,控制算法,机械臂运动控制的系统来实现案例。
- 数据流程:用于图像的捕捉,图像处理,数据分析和转换,机械臂的执行。
功能实现
- 图像捕捉
使用到OpenCV捕获图像的方法
# 初始化摄像头
cap = cv2.VideoCapture(0) # 0代表默认摄像头的序号#读取图像帧
ret, frame = cap.read()#显示图像
cv2.imshow('video", frame)def capture_video():
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("Can't open camera")
return try:
while True:
ret, frame = cap.read()
if not ret:
print("Can't read the pic from camera")
break cv2.imshow('Video Capture', frame) # enter 'q' quit
if cv2.waitKey(1) & 0xFF == ord('q'):
break
finally:
cap.release()
cv2.destroyAllWindows()
- 图像处理与ArUco标记识别
对摄像头捕获的图像进行处理以及对ArUco的标记码进行识别
#检测ArUco标记
def detect_marker_corners(self, frame: np.ndarray) -> Tuple[NDArray, NDArray, NDArray]:
# 灰度化
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
corners : Any
ids : Any
rejectedImgPoints : Any
corners, ids, rejectedImgPoints = self.detector.detectMarkers(gray)
return corners, ids, rejectedImgPoints #在图像中标记出ArUco码,并且在每个标志上绘制坐标轴
def draw_marker(self, frame: np.ndarray, corners, tvecs, rvecs, ids) -> None:
# cv2.aruco.drawDetectedMarkers(frame, corners, None, borderColor=(0, 255, 0))
cv2.aruco.drawDetectedMarkers(frame, corners, ids, borderColor=(0, 200, 200))
for i in range(len(ids)):
corner, tvec, rvec, marker_id = corners[i], tvecs[i], rvecs[i], ids[i]
cv2.drawFrameAxes(frame, self.mtx, self.dist, rvec, tvec, 30, 2)while True:
ret, frame = cap.read()
corners, ids, rejectedImgPoints = aruco_detector.detect_marker_corners(frame)
if ids is not None:
detector.draw_marker(frame, corners, tvecs, rvecs, ids)
ArucoDetector.draw_position_info(frame, corners, tvecs)
cv2.imshow('Video Capture', frame) # enter 'q' quit
if cv2.waitKey(1) & 0xFF == ord('q'):
break
- 数据解析与处理
因为该案例要做的是姿态跟踪,所以我们在检测ArUco标记的时候得检测该姿态,标注每个旋转向量(rvec)和平移向量(tvecs),这些向量描述了标记相对于摄像头的三位位置和方向。
def estimatePoseSingleMarkers(self, corners):"""
This will estimate the rvec and tvec for each of the marker corners detected by:
corners, ids, rejectedImgPoints = detector.detectMarkers(image)
corners - is an array of detected corners for each detected marker in the image
marker_size - is the size of the detected markers
mtx - is the camera matrix
distortion - is the camera distortion matrix
RETURN list of rvecs, tvecs, and trash (so that it corresponds to the old estimatePoseSingleMarkers())
"""
marker_points = np.array([[-self.marker_size / 2, self.marker_size / 2, 0],[self.marker_size / 2, self.marker_size / 2, 0],[self.marker_size / 2, -self.marker_size / 2, 0],[-self.marker_size / 2, -self.marker_size / 2, 0]], dtype=np.float32)
rvecs = []
tvecs = []for corner in corners:
corner : np.ndarray
retval, rvec, tvec = cv2.solvePnP(marker_points, corner, self.mtx, self.dist, None, None, False,
cv2.SOLVEPNP_IPPE_SQUARE)if retval:
rvecs.append(rvec)
tvecs.append(tvec) rvecs = np.array(rvecs)
tvecs = np.array(tvecs)(rvecs - tvecs).any()return rvecs, tvecs
捕获数据的时候会大量的数据,为了提高检测的准确性需要使用滤波器来进行对数据的处理。
用到了中值滤波器,平均滤波器还有二阶滤波器。
中值滤波器:中值滤波器非常有效于去除所谓的“椒盐”噪声,同时保持信号的边缘信息。它在图像处理中常用于去除噪点,同时不会使图像模糊。
平均滤波器:平均滤波器常用于去除随机噪声、平滑和软化数据。在图像处理中,它可以用于平滑图像,但可能会导致边缘信息丢失,可以看到图像处理过后会模糊一些。
二阶滤波器:精确控制信号频率成分时使用,例如在信号处理和控制系统中,用于减少振荡和提高稳定性,特别是在姿态估计和精确运动控制中。
def median_filter(pos, filter, filter_len):if not np.any(filter):# 如果滤波器为空,用pos填充滤波器filter[:] = pos# 将pos加入滤波器filter[filter_len - 1] = pos# 移动滤波器中的元素for i in range(filter_len - 1):filter[i] = filter[i + 1]# 计算中值并存储到输出数组中
output = np.median(filter)return outputdef Average_filter(pos, filter, filter_len):if not np.any(filter):# 如果滤波器为空,用pos填充滤波器filter[:] = pos# 将pos加入滤波器filter[filter_len - 1] = pos# 移动滤波器中的元素for i in range(filter_len - 1):filter[i] = filter[i + 1]# 计算中值并存储到输出数组中
output = np.mean(filter)return output
def twoorder_filter_single_input(input):global prev1global prev2global prev_out1global prev_out2if np.array_equal(prev1, np.zeros(3)):
output, prev1, prev_out1 = input, input, inputreturn outputif np.array_equal(prev2, np.zeros(3)):
prev2, prev_out2 = prev1, prev_out1
output, prev1, prev_out1 = input, input, inputreturn output fc = 20 # Hz 截止频率 (设计的滤波器频率)
fs = 100 # Hz 斩波频率 (采样频率)
Ksi = 10 # 品质因数 temp1 = (2 * 3.14159 * fc)**2
temp2 = (2 * fs)**2
temp3 = 8 * 3.14159 * fs * Ksi * fc
temp4 = temp2 + temp3 + temp1 K1 = temp1 / temp4
K2 = 2 * K1
K3 = K1
K4 = 2 * (temp1 - temp2) / temp4
K5 = (temp1 + temp2 - temp3) / temp4 output = K1 * prev2 + K2 * prev1 + K3 * input - K4 * prev_out2 - K5 * prev_out1# 更新全局变量
prev2, prev1, prev_out2, prev_out1 = prev1, input, prev_out1, outputreturn output
从检测到的标记(如ArUco标记)中提取机械臂或相机的姿态信息,并对提取的角度数据进行滤波处理,最终获得目标的坐标。
- 机械臂控制命令生成
在机械臂运动控制的方式上,我们得设置它的运动模式
# Set end coordinate system 1-tool
arm.set_end_type(1)
time.sleep(0.03)
# Set tool coordinate system
arm.set_tool_reference([-50, 0, 20, 0, 0, 0])
time.sleep(0.03)
# Set command refresh mode
arm.set_fresh_mode(0)
time.sleep(0.03)
在获取到目标坐标,就得发送给机械臂去执行命令。
from pymycobot import MyArm
arm = MyArm("COM11",debug=False)
# 发送坐标控制机械臂运动
arm.send_coords(target_coords, 10, 2)
关键技术点
关键的技术点主要在几个方面:
- ArUco 检测:
ArUco 标记的检测是整个系统运行的基础。通过摄像头识别这些标记,系统能够获取关于标记位置和方向的关键信息。这些信息对于机械臂的精确控制和操作至关重要,尤其是在需要精确位置调节的应用中,如在自动化、机器人编程和增强现实中。
使用图像处理技术,用openCV库从摄像头捕获的图像中识别标记,并且提取他们的位置和姿态信息。
- 滤波技术:
在处理图像数据或机械臂传感器数据时,滤波技术是保证数据质量和系统稳定性的关键。它们帮助去除数据中的噪声和误差,从而提高系统的准确性和可靠性。
- 机械臂控制:
在开始实现机械臂姿态跟踪前提,需要设置其运动模式。确保机械臂的运动与预期任务相匹配、提高操作的精度和可靠性非常关键。通过调整坐标系统、工具参考点和指令执行方式,可以使机械臂更加适应特定的操作环境和任务需求。
https://twitter.com/i/status/1733806097050558951
总结
在该项目中,深入了解图像处理和机器视觉的原理,特别是ArUco标记检测和位姿最终方面。可以掌握各种滤波技术的应用,理解它们在提高数据质量和系统性能中的重要。总而言之,该项目可以实践应用各个方面。
相关文章:
七轴开源协作机械臂myArm视觉跟踪技术!
引言 ArUco标记是一种基于二维码的标记,可以被用于高效的场景识别和位置跟踪。这些标记的简单性和高效性使其成为机器视觉领域的理想选择,特别是在需要实时和高精度跟踪的场景中。结合机器学习和先进的图像处理技术,使用ArUco标记的机械臂系统…...
etcd初探
官方网站 https://etcd.io/ etcd是什么 etcd is a strongly consistent, distributed key-value store that provides a reliable way to store data that needs to be accessed by a distributed system or cluster of machines. It gracefully handles leader elections du…...
微信小程序如何实现WXML和js文件之间的数据交互
在微信小程序中,WXML负责页面结构的描述,而js文件则负责页面的逻辑处理和数据交互。要实现WXML和js文件之间的数据交互,可以通过以下几种方法: JS传输数据到WXML 数据绑定:在WXML中使用{{}}语法将js文件中的数据绑定…...
计算机网络基础——以太网类型,常见标准和架构
一、标准以太网 标准以太网(10Mbit/s)通常只定位在网络的接入层,新一代多媒体、影像和数据库产品很容易将10Mbit/s运行的以太网的带宽吞没。10Mbit/s 的以太网可以实现100m距离的连接。 二、快速以太网 数据传输速率为100Mbps 的快速以太网…...
HarmonyOS(二)—— 初识ArkTS开发语言(下)之ArkTS声明式语法和组件化基础
前言: 通过前面ArkTS开发语言(上)之TypeScript入门以及ArkTS开发语言(中)之ArkTS的由来和演进俩文我们知道了ArkTS的由来以及演进,知道了ArkTS具备了声明式语法和组件化特性,今天,搭…...
VUE篇之日历组件
1.简单日历组件展示 思路:根据当前月的第一天是星期几,来显示日期 <template><div class"wrap"><el-button click"preMonth">上个月</el-button><el-tag>当前年份{{ curYear }}</el-tag><e…...
【selenium】自动化使用 chrome 的 user-data-dir
jwensh2023.12.18 文章目录 背景当前位置默认位置windowsMac OS XLinuxChrome操作系统AndroidiOS系统 覆盖用户数据目录命令行环境(Linux)编写 AppleScript 包装器 (Mac OS X) 用户缓存目录在 Mac OS X 和 iOS 上,用户缓存目录源自配置文件目…...
pythonUnitTest框架
UnitTest框架 UnitTest参考文章:https://blog.csdn.net/qq_54219272/article/details/123265794 目标(看完UnitTest框架该有的收获) 掌握UnitTest框架的基本使用方法掌握断言(判断实际结果和预期结果是否一致)的使用方…...
微服务最佳实践:构建可扩展且高效的系统
微服务架构彻底改变了现代软件开发,提供了无与伦比的敏捷性、可扩展性和可维护性。然而,有效实施微服务需要深入了解最佳实践,以充分发挥微服务的潜力,同时避免常见的陷阱。在这份综合指南中,我们将深入研究微服务的关…...
源码赏析: 数据结构转换工具 configor (一)
一、configor 先贴地址 configor,先看configor的特性: Header-only & STL-likeCustom type conversion & serializationComplete Unicode supportASCII & Wide-character support 说白了,这个工具用于自定义类型的转换和序列化…...
使用java调用python批处理将pdf转为图片
你可以使用Java中的ProcessBuilder来调用Python脚本,并将PDF转换为图片。以下是一个简单的Java代码示例,假设你的Python脚本名为pdf2img.py: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader…...
机器学习——自领域适应作业
任务 游戏里面的话有很多跟现实不一样的情况。 想办法让中间的特征更加的接近,让feat A适应feat B,产生相对正常的输出。 在有标签数据和没有数据的上面进行训练,并能预测绘画图像。 数据集 训练5000张总数,每类有500张测试100…...
ValidatorUtil字段验证工具类
字段验证工具类 package com.aa.bb.cc.common.utils;import com.aa.bb.cc.common.exception.BusinessException; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils;import javax.validation.ConstraintViolation; import…...
Python 自动化之处理图片(一)
图片美化与大小调整 文章目录 图片美化与大小调整前言一、基本结构二、引入库三、用户输入模块四、图片美化模块五、大小调整模块总结 前言 本文主要分为两部分。一是图片的美化吧算是,主要从亮度、对比、色彩饱和度、锐度四个方面进行美化;二是图片的像…...
Axure动态面板的应用与ERP系统登录界面、主页左侧菜单栏、公告栏的绘制
目录 一、动态面板 1.1 简介 1.2 使用动态面板的原因 二、动态面板之轮播图实现案例 2.1 完成步骤 2.2 最终效果 三、动态面版之多方式登录案例 四、动态面板之后台主界面左侧菜单栏 五、ERP登录界面 六、ERP主界面菜单栏 七、ERP公告栏 八、登录页面跳转公告栏 一…...
电机(按工作电源分类)介绍
文章目录 一、什么是电机?二、按工作电源分类直流电机1.直流有刷电机结构工作原理:直流减速电机 2.直流无刷电机结构工作原理: 3.总结结构和工作原理:效率和功率损耗:调速性能:寿命和可靠性:应用…...
Web前端JS通过使用AudioWorkletNode() 获取 Video/Audio 视音频声道(左右声道|多声道)
写在前面: 在之前的博文Web前端JS如何获取 Video/Audio 视音频声道(左右声道|多声道)、视音频轨道、音频流数据中,介绍了通过使用AudioContext.createScriptProcessor()方法来获取视音频音轨(声道)数据。但由于W3C不再推荐使用该A…...
力扣LeetCode75题
为了面试,小伙伴们可以平时练下算法题,有备无患。 LeetCode 75 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台...
如何向领导汇报工作?一篇文章告诉你!
给领导汇报工作可以从两个方面考虑:一是工作汇报文件的制作;一是汇报方式。一份全面、清晰且准确的文件,加上一目了然的、科技满满的汇报方式,相比领导不满意都难~下面就让你全部get! 一、工作汇报的文字内…...
GPT-4.5!!!
GPT-4 还没用明白,GPT-4.5 就要发布了。 最近,OpenAI 泄露了 GPT-4.5 的发布页面,除了进一步增强复杂推理和跨模态理解,GPT-4.5 增加了一个更加强大的功能——3D。 3D 功能的进一步支持,也就意味着多模态最后一块版图…...
kafka入门(四):kafka生产者发送消息
创建生产者实例和构建消息之后,就可以开始发送消息了。 发送消息主要有三种模式:发后即忘、同步、异步。 发后即忘: 就是直接调用 生产者的 send方法发送。 发后即完,只管往 kafka中发送消息,而不关心消息是否正确…...
redis集群模糊获取缓存redisKey
redis cluster集群删除指定模糊redisKey的信息 **public int deleteRedisKey(String key){AtomicReference<Integer> result new AtomicReference<>(0);busnessLogger.info("开始删除指定业务的模糊Key,deleteRedisKey:{}",key);try{Set<HostAndPor…...
100GPTS计划-AI翻译TransLingoPro
地址 https://poe.com/TransLingoPro https://chat.openai.com/g/g-CfT8Otig6-translingo-pro 测试 输入: 我想吃中国菜。 预期翻译: I want to eat Chinese food. 输入: 请告诉我最近的医院在哪里。 预期翻译: Please tell me where the nearest hospital is. 输入: 明天…...
Linux install manual 1Panel
前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。1Panel 的功能和优势包括: 快速建站:深度集成 Wordpress 和 Halo,域名绑定、SSL 证书配置等一键搞定;高效管理:通过 Web 端轻松管理 Linux 服务器,包括主机监控、文件管理、数据库管理、容器管理等;安全可…...
母婴服务品牌网站的效果如何
随着三胎政策落实及人们生活水平提升,母婴市场发展迅速上升,加之以90后、00后适龄生育的人群悦己消费加强,孕前孕后及婴儿本身就会使用相当好的服务,这也为市场带来了较大机会。 近几年,老品牌在不断加力,…...
C语言--有一个3*4的矩阵,求出其中最大值的那个元素的值,以及其所在的行号和列号
一.题目描述 有一个3*4的矩阵,要求求出其中最大值的那个元素的值,以及其所在的行号和列号 比如:给定一个3*4的矩阵如下 输出结果:最大值为 12 ,行号为3, 列号为2 二.思路分析 打擂台算法: 先思考…...
安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换
安全算法(二):共享密钥加密、公开密钥加密、混合加密和迪菲-赫尔曼密钥交换 本章介绍了共享密钥加密、公开密钥加密,和两种加密方法混合使用的混合加密方法;最后介绍了迪菲-赫尔曼密钥交换。 加密数据的方法可以分为…...
MYSQL练题笔记-高级字符串函数 / 正则表达式 / 子句-简单3题
这个系列先写了三题,比较简单写在一起。 1.修复表中的名字相关的表和题目如下 看题目就知道是有关字符串函数的,于是在书里查询相关的函数,如下图,但是没有完全对口的函数,所以我还是去百度了。 然后发现结合上面的4个…...
vue扭蛋机抽奖游戏
简易扭蛋机demo 这是一个使用CSS3和JavaScript实现的扭蛋机抽奖游戏。该游戏的主要功能是通过点击按钮进行抽奖,抽奖过程中会显示滚动的小球,最终随机停止并显示一个中奖小球。 该游戏的抽奖过程如下: 当用户点击抽奖按钮时,首先检查当前是否正在进行抽奖任务或者当前有小…...
代码随想录27期|Python|Day16|二叉树|104.二叉树的最大深度|111.二叉树的最小深度|222.完全二叉树的节点个数
二叉树专题,重点掌握后续的递归和中间节点的处理。 104. 二叉树的最大深度 - 力扣(LeetCode) 本题在前一章已经解决了层序遍历的解法,现在来聊一下递归法。 首先需要明确两个概念:深度和高度。(注意&…...
一款非常不错的seo网站优化公司源码/安卓手机优化神器
csdn查看自己所有资源被下载次数 隐藏接口API如下: https://download-console-api.csdn.net/v1/user/sources/getUploadListByUserName?status2&pageNum1&pageSize100...
校园二手网站源码/长沙关键词优化推荐
WSGI是Web服务器网关接口。它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架有bottle,DJan…...
南宁seo网站建设/重庆森林经典台词罐头
上一篇文章写了ReactNative自带的MapView,很显然不是我们想要的。 今天我们介绍一下一个开源的百度地图开源组件,详细描述它的使用方法。 开源地址:https://github.com/lovebing/react-native-baidu-map 百度地图 React Native 模块&#…...
泉州网站建设方案详细/网站免费搭建
前言最近XCodeGhost事件闹得沸沸扬扬,各路大神一路狂喷,不管搞没搞过开发,更不管搞没搞过移动开发,搞产品的,搞web的,搞安全的,搞服务器的都来了……然而,我还是那个观点,…...
wordpress模板是什么意思/石家庄网站建设培训
五种常见的 PHP 设计模式策略模式策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。策略模式指的是程序中涉及决策控制的一种模式。策略模式功能非常强大,因为这个设计模式本身的核心思想就是面向对象编程的多形性思想。策…...
网软志成个人商城网站/济南竞价托管
Dreamweaver CC2018怎么写div自适应页面布局?一般网页都是固定的宽度,所以不能自适应网页窗口大小。我们可以把宽度设置为百分比,这样就可以啦。只不过需要自己算好百分比的数值,接下来小编就给大家详细的介绍一下Dreamweaver CC2…...