七轴开源协作机械臂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

机械臂的姿态跟踪

  1. 定义:姿态跟踪通常指的是监测和记录一个物体在三维空间中的精确位置(平移)和方向(旋转),即其“姿态”。
  2. 技术应用:在机械臂的应用中,姿态跟踪涉及到实时监控和控制机械臂自身的各个关节和末端执行器的精确位置和方向。这通常需要复杂的传感器系统和算法,以实现高精度的控制。
  3. 用途:姿态跟踪对于执行精密的操作任务非常关键,如在制造业中的装配、焊接、在医疗领域中的外科手术辅助

项目组成部分

整个系统的架构主要分为以下几个部分:

  1. 硬件组成:机械臂,usb摄像头以及使用到的设备。
  2. 软件和控制系统:通过OpenCV识别ArUco 标记,控制算法,机械臂运动控制的系统来实现案例。
  3. 数据流程:用于图像的捕捉,图像处理,数据分析和转换,机械臂的执行。

功能实现

  1. 图像捕捉

使用到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()

  1. 图像处理与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

  1. 数据解析与处理

因为该案例要做的是姿态跟踪,所以我们在检测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[+ 1]

    # 计算中值并存储到输出数组中
    output = np.median(filter)

    return output

def 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[+ 1]

    # 计算中值并存储到输出数组中
    output = np.mean(filter)

    return output
def twoorder_filter_single_input(input):
    global prev1
    global prev2
    global prev_out1
    global prev_out2

    if np.array_equal(prev1, np.zeros(3)):
        output, prev1, prev_out1 = input, input, input
        return output
    
    if np.array_equal(prev2, np.zeros(3)):
        prev2, prev_out2 = prev1, prev_out1
        output, prev1, prev_out1 = input, input, input
        return 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, output
    
    return output

从检测到的标记(如ArUco标记)中提取机械臂或相机的姿态信息,并对提取的角度数据进行滤波处理,最终获得目标的坐标。

  1. 机械臂控制命令生成

在机械臂运动控制的方式上,我们得设置它的运动模式

# 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标记检测和位姿最终方面。可以掌握各种滤波技术的应用,理解它们在提高数据质量和系统性能中的重要。总而言之,该项目可以实践应用各个方面。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

爬虫国密加密案例:某医保服务

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cHM6Ly9mdXd1Lm5oc2EuZ292LmNuL25hdGlvbmFsSGFsbFN0LyMvc2VhcmNoL21lZGljYWw/Y29…

HTML---CSS美化网页元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.div 标签&#xff1a; <div>是HTML中的一个常用标签&#xff0c;用于定义HTML文档中的一个区块&#xff08;或一个容器&#xff09;。它可以包含其他HTML元素&#xff0c;如文本、图像…

adb: error: cannot create file/directory ‘d:/1.png‘: No such file or directory

将文件从设备读取到PC 由于权限问题&#xff0c;不能直接pull到电脑磁盘根目录&#xff0c;否则会报错&#xff1a; adb pull <remote> <local> eg: C:\Users\admin>adb pull /sdcard/server.log C:\Users\admin\Desktop /sdcard/server.log: 1 file pulled.…

AI创作系统ChatGPT网站源码,支持AI绘画,支持GPT语音对话+智能思维导图生成

一、前言 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统&#xff0c;支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Ch…

客观题测试-第7章查找

第1关&#xff1a;查找客观题测试&#xff08;一&#xff09; 1、关键字可以唯一地标识一个数据元素。 A、对 B、错 2、二叉排序树是一个动态查找表。 A、对 B、错 3、如果顺序表中各元素的查找概率相同&#xff0c;在顺序查找时&#xff0c;查找不成功的平均查找长度因…

nodejs微信小程序+python+PHP国漫推荐系统-计算机毕业设计推荐

目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性&#xff1a;…

TrustZone之其他设备及可信基础系统架构

一、其他设备 最后,我们将查看系统中的其他设备,如下图所示: 我们的示例TrustZone启用的系统包括一些尚未涵盖的设备,但我们需要这些设备来构建一个实际的系统。 • 一次性可编程存储器(OTP)或保险丝 这些是一旦写入就无法更改的存储器。与每个芯片上都包含相同…

【Vue2】Component template should contain exactly one root element.

问题描述 [plugin:vite:vue2] Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.原因分析 这个错误通常是由于 Vue 组件的模板中包含多个根元素导致的。Vue 要求组件模板中只…

图片速览 PoseGPT:基于量化的 3D 人体运动生成和预测(VQVAE)

papercodehttps://arxiv.org/pdf/2210.10542.pdfhttps://europe.naverlabs.com/research/computer-vision/posegpt/ 方法 将动作压缩到离散空间。使用GPT类的模型预测未来动作的离散索引。使用解码器解码动作得到输出。 效果 提出的方法在HumanAct12&#xff08;一个标准但小规…

13.FTP

FTP FTP配置 添加一个本地用户 设置个密码 服务类型是FTP 工作路径授权给用户 设置用户角色为网络管理员 开启FTP服务 R2的路径下有这些文件 在R1进行测试&#xff0c;输入刚才创建的用户密码 get 获取文件 put上传文件 也可以在PC进行访问 可以升级路由器系…

阅览窗格功能虽然便利,但有时会出错,特别是在Word和Excel文件中更为常见

当你打开预览窗格功能时&#xff0c;每次你打开Windows文件资源管理器并选择任何文件&#xff0c;你将在屏幕的右窗格上看到该文件的小预览缩略图。 由于这个新功能&#xff0c;你可以在Windows资源管理器的右窗格上以缩略图的形式看到文件的小预览。此功能在更快地识别文件方…

SVN小白常见操作流程

SVN小白常见操作流程 一、什么是Subversion&#xff1f;二、TortoiseSVN客户端安装教程三、SVN 操作3.1 SVN Ckeckout(检出)3.2 Add(新增文件)3.3 SVN Commit(提交)3.4 SVN Update(更新操作)3.5SVN Delete(删除操作)3.6 SVN Revert to a revision(版本回溯)3.7 不同版本内容之间…

三大主流前端框架介绍

在前端项目中&#xff0c;可以借助某些框架&#xff08;如React、Vue、Angular等&#xff09;来实现组件化开发&#xff0c;使代码更容易复用。此时&#xff0c;一个网页不再是由一个个独立的HTML、CSS和JavaScript文件组成&#xff0c;而是按照组件的思想将网页划分成一个个组…

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型

目录 前言 1 风速数据EMD分解与可视化 1.1 导入数据 1.2 EMD分解 2 数据集制作与预处理 2.1 先划分数据集&#xff0c;按照8&#xff1a;2划分训练集和测试集 2.2 设置滑动窗口大小为96&#xff0c;制作数据集 3 基于Pytorch的EMD-CNN-GRU并行模型预测 3.1 数据加载&a…

ElementUI,修改el-cascader的默认样式

Element UI 中的下拉弹窗是通过在整个body标签末尾动态添加div实现的&#xff0c;所以修改样式时&#xff0c;必须要定义全局样式才能实现样式覆盖&#xff0c;那怎样才能避免全局的样式污染呢&#xff1f; 解决办法&#xff1a;通过给组件添加自定义的 popper-class 属性来避…

「新版」PyCharm 加载condav Environment / Conda executableis not found

在新版的 PyCharm 配置中&#xff0c;设置Conda环境不再与旧版本保持一致&#xff0c;对于新手而言可能不清楚如何加载&#xff0c;作者也是郁闷了好久&#xff0c;经过一顿输出发现需要通过加载conda配置&#xff0c;才调取conda虚拟环境&#xff0c;而不再是直接调取conda的虚…

06_Web框架之Django三

Web框架之Django三 学习目标和内容 1、能够通过ORM模型创建数据表 2、能够通过ORM模型对数据进行操作 3、能够理解ORM模型对应关系 一、ORM概念 1、ORM介绍 对象关系映射 用于实现面向对象编程语言里不同类型系统数据之间的转换。 其就是使用面向对象的方式&#xff0c;操作…

Convolutional Neural Network(CNN)——卷积神经网络

1.NN的局限性 拓展性差 NN的计算量大性能差&#xff0c;不利于在不同规模的数据集上有效运行若输入维度发生变化&#xff0c;需要修改并重新训练网络容易过拟合 全连接导致参数量特别多&#xff0c;容易过拟合如果增加更多层&#xff0c;参数量会翻倍无法有效利用局部特征 输入…

EnvoyFilter API

目录 原文链接 https://onedayxyy.cn/docs/EnvoyFilter-API 本节实战 实战名称&#x1f6a9; 实战&#xff1a;EnvoyFilter API-全局范围-2023.12.18(测试成功)&#x1f6a9; 实战&#xff1a;EnvoyFilter API-配置优先级-2023.12.18(测试成功)&#x1f6a9; 实战&#xff1a…

每日一题:LeetCode-LCR 016. 无重复字符的最长子串

每日一题系列&#xff08;day 15&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…