教育场景中的自动化分拣系统!基于大象机器人UltraArm P340机械臂和传送带的实现

news2024/11/17 20:12:20

引言

今天我们将展示一个高度自动化的模拟场景,展示多个机械臂与传送带协同工作的高效分拣系统。在这个场景中,机械臂通过视觉识别技术对物体进行分类,并通过精确的机械操作将它们放置在指定的位置。这一系统不仅提高了分拣的速度和准确性,还展示了现代自动化技术在工业领域的巨大潜力。无论是处理大量的日常物品,还是在复杂的工业流程中应用,这种自动化分拣解决方案都体现出了极高的灵活性和效率。

场景描述

在这个高度自动化的分拣场景中,主要设备包括两个机械臂和一条800mm的传送带。右侧的上料机器人负责识别和抓取标记物,并将它们放置到传送带上。传送带将标记物运输到左侧的下料机器人工作范围内。下料机器人则根据分类要求识别标记物,并将它们有序地放置在指定区域。

放个视频gif

接下来我们简要介绍产品的相关参数

产品

NAME

QUANTITY

UltraArm P340

2

USB Camera 2D

2

Conveyor belt

1

Conveyor Controller

1

Vertical suction pump

2

Quick-change servos

2

Kit base Plate

1

列表中是几个主要的产品。

UltraArm P340

ultraArm 是4自由度的机械臂,全身采用经典金属设计结构,本体占用体积只有A4纸张的一半,搭载高性能的步进电机,能够实现±0.1mm重复定位精度和高稳定性。

高性能的步进电机能够进行7*24的工作时长,且保持性能良好,也是比较适合高度自动化这一场景的选择。

Conveyor belt

这个也是步进电机来进行驱动的传送带,需要用到Arduino mega 2560开发板来作为控制器,给物体提供运输的一个设备。

USB Camera 2D

摄像头作为机器视觉必不可少的一部分,是获取标记物的重要设备,usb 摄像头,能够提供画面,通过各种机器视觉的算法来确定标记物的具体位置,坐标来反馈给机械臂去执行抓取。

工作原理

整个项目的被分为以下几个功能模块,以实现整个自动化分拣场景。

我们具体看看各个功能模块的功能是如何在代码当中实现的。

Visual recognition module

本次项目用的标记物是Aruco码,是一种广泛使用的二进制方形标记,主要用于增强现实和机器人导航等场景中,Aruco码的设计使得它们在图像中易于检测和识别,有以下几个特点。

1易于检测和识别:Aruco码的设计使得它们在图像中易于检测和识别

2 唯一性和抗误识别:每个Aruco码都有一个唯一的ID,具有一定的纠错能力

3姿态估计:Aruco码不仅可以用于识别和定位,还可以用于估计相机相对于标记的姿态(位置和方向)。

4开源和易于使用:OpenCV库提供了对Aruco码的完整支持,包括生成、检测和解码。

5灵活性和多样性:Aruco码可以生成各种尺寸和复杂度的码,以适应不同的应用需求。

6低成本:生成和使用Aruco码的成本非常低。它们可以简单地打印在纸上,或者制作在物体表面,不需要昂贵的硬件设备。

#导入库
import cv2.aruco as aruco

#加载字典
aruco_dict = aruco.Dictionary_get(aruco.DICT_6X6_250)
parameters = aruco.DetectorParameters_create()

#灰度处理并且识别
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)   
                corners, ids, rejectImaPoint = cv.aruco.detectMarkers(
                    gray, self.aruco_dict, parameters=self.aruco_params
                )

#检测Aruco码
if len(corners) > 0:
    if ids is not None:
        id = int(ids[0][0])

姿态估计,确定Aruco码的姿态位置,对于抓取是非常重要的,为控制算法提供反馈,调整机器人的动作。姿态估计后再进行数据的转换和补偿,计算和调整角度最终反馈位置和姿态角度。

#姿态估计
ret = cv.aruco.estimatePoseSingleMarkers(
    corners, 0.022, self.camera_matrix, self.dist_coeffs
)
(rvec, tvec) = (ret[0], ret[1])

#位置计算
xyz = tvec[0, 0, :]
xyz = [round(xyz[0]*1000 + self.pump_x, 2), round(xyz[1]*1000 + self.pump_y, 2), round(xyz[2]*1000, 2)]

#旋转向量处理
try:
    rvec = np.reshape(rvec, (3, 1))
except ValueError as e:
    print("reshape错误:", e)
    print("rvec1=", rvec)
    rvec = np.array([[[-2.86279729, -0.00687534, -0.05316529]]])
    print("rvec2=", rvec)

#计算旋转矩阵和欧拉角
rotation_matrix, _ = cv.Rodrigues(rvec)
euler_angles = cv.RQDecomp3x3(rotation_matrix)[0]
yaw_angle = int(euler_angles[2])

#返回结果
for i in range(rvec.shape[0]):
    cv.aruco.drawDetectedMarkers(img, corners, ids)
    if num < 100:
        num += 1
    elif num == 100:
        cv.destroyAllWindows()
        print("final_x:", xyz[0])
        print("final_y:", xyz[1])
        print("final_yaw_angle=", -yaw_angle)
        return xyz[0], xyz[1], -yaw_angle, id

在此之前需要进行手眼标定,标定的目前是确定相机与机器人末端执行器的相对位置和姿态关系。

Robotic arm control module

ultraArm有一个python的控制库pymycobot,安装好环境之后即可使用,一下是简单控制的使用

from pymycobot.ultraArm import ultraArm

#创建实例,com为机械臂的串口号
ua = ultraArm(COM)

# 角度控制
ua.send_angles([angle_list],speed)
# 坐标控制mode,控制走直线还是非直线
ua.send_coords([coords_list),speed,mode)

#吸泵的使用1-open ;0-close
def pub_pump(self, flag):
    if flag:
        self.ua.set_gpio_state(0)
    else:
        self.ua.set_gpio_state(1)
ua.pub_pump(state)

机械臂的运动控制很简单,只需要简单的调用就好了,但是需要注意的是,在机械臂运动的过程中需要设计运动轨迹,不能撞到一些物体,以及根据获取到标记吗的坐标后的点位,比如说起始点位,待抓取点位等等。

Conveyor control module

传送带配备的步进电机通常需要通过微控制器(Arduino Mega 2560)来进行输出控制,mega为此提供了足够的I/O引脚和处理能力,能够精确控制步进电机的步进和方向,从而实现传送带的启动、停止、速度调节和方向控制。

#初始化设置
self.serial = serial.Serial(port, baudrate, timeout=1)

#写入命令
def write_command(self, command):
    self.serial.write(command.encode())

#设置传送带的方向
def set_direction(self, direction):
    command = f'DIR {direction}\n'
    self.write_command(command)

#设置速度
def set_speed(self, speed):
    command = f'SPD {speed}\n'
    self.write_command(command)

#启动和停止
def start(self):
    self.write_command('START\n')

def stop(self):
    self.write_command('STOP\n')

Data processing and communication module

在这个自动化分拣系统项目中,数据处理和通信是关键部分,为了让他们互相知道彼此在干什么,将整体连贯起来,只要有一个地方出错就会停止程序。

第一步-上料机器人的视觉检测,如果发现检测的物体不复合要求(摆满),将不会执行后续的程序。

第二步-上下料机器人协作好,上料机器人先进行拆码垛工作,搬运到传送带上。

第三步-传送带将物体运输到下料机器人的摄像头识别范围和机械臂工作半径内。

第四步-下料机器人将物体的姿态进行识别,下料机器人得到反馈的姿态进行调整后抓去物体放置在指定区域。第五步-每当完成六次物体的抓取后,会重新再进行一次上料机器人的视觉检测,如果在此期间上料机器人的物体有所变化会导致抓取失败。(这是逻辑上的设定,可自行更改)

  while robot2.count<18:
        data=obj.detect()
        while len(data)<6:
            print("二维码检测数目不对,请确保二维码在相机范围内并且能正确识别")
            time.sleep(1)
            data=obj.detect()          
        
        for i in range(len(data)):
            robot.move(data[i][2],data[i][1]) 
                                 
            conveyer.open_conveyor(100)
            time.sleep(5.2)
            
            conveyer.close_conveyor()
            
            for i in range(3):
                try:
                    print("i=",i)                                
                    pose=cam.detect()
                    if pose is not None: 
                        break
                    
                except Exception as e:
                    if i==2:
                       message()                
                    temp=obj.exception_handling()
                    robot.Special_handling(temp[0][2],temp[0][1],temp[0][3])
                    conveyer.open_conveyor(100)
                    time.sleep(5.2)
                    conveyer.close_conveyor()
            id=robot2.move(pose[0],pose[1],pose[2],pose[3])                   
            robot2.judge(id)  

总结

本项目展示了一个基于UltraArm P340机械臂和传送带的自动化分拣系统,主要应用于教育场景,旨在教学和演示自动化分拣技术。系统结合计算机视觉、步进电机控制、手眼标定和机械臂运动控制,实现了高效的自动化分拣流程。

如果你觉得该项目有什么可以改进的地方欢迎在下方留下评论,你的留言和支持是对我们更新最大的鼓励。

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

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

相关文章

Vue el-table列合并

1.封装公用方法 const dataMethod (data, isH []) > {let spanObj {}; // 存储每个key 对应的合并值let pos {}; // 存储的是 key合并值得索引// 循环数据for (let i 0; i < data.length; i) {let dataI data[i];// 循环数据内对象&#xff0c;查看有多少keyfor (…

使用U盘重装系统

目录 一、 制作启动盘 1. 准备一个U盘和一台电脑 2. 下载win10安装包 二、安装操作系统 1. 插入系统安装盘 2. 通过进入BIOS界面进入到我们自己制作的启动盘上 三、安装成功后进行常规设置 一、 制作启动盘 1. 准备一个U盘和一台电脑 注意&#xff1a;提前备份好U盘内的…

九浅一深Jemalloc5.3.0 -- ⑧浅*free

目前市面上有不少分析Jemalloc老版本的博文&#xff0c;但最新版本5.3.0却少之又少。而且5.3.0的架构与5之前的版本有较大不同&#xff0c;本着“与时俱进”、“由浅入深”的宗旨&#xff0c;我将逐步分析最新release版本Jemalloc5.3.0的实现。 另外&#xff0c;单讲实现代码是…

PyTorch环境配置及安装

PyTorch环境配置及安装 Step1&#xff1a;安装Anaconda 参考该链接&#xff08;视频01:30--03:00为安装教程&#xff09;&#xff1a; 【PyTorch深度学习快速入门教程&#xff08;绝对通俗易懂&#xff01;&#xff09;【小土堆】】 https://www.bilibili.com/video/BV1hE41…

04通俗理解自注意力机制(self-attention)

04浅谈自注意力机制&#xff08;self-attention&#xff09; 1. 基本概念 注意力机制 是Transformer模型的核心。它的作用是让模型能够“关注”输入数据的不同部分&#xff0c;而不是一次只处理一个词。比如&#xff0c;当模型在处理一句话时&#xff0c;它可以同时考虑句子中…

AntV学习笔记

文章目录 G6 图可视化引擎简单上手复杂一点的案例 S2 多维交叉分析表格简单的一个vue3使用S2的例子 G6 图可视化引擎 G6 是一个简单、易用、完备的图可视化引擎&#xff0c;它在高定制能力的基础上&#xff0c;提供了一系列设计优雅、便于使用的图可视化解决方案。能帮助开发者…

【数据集】最近开源的一些多模态图表理解数据集

1. CharXiv 现有数据集通常关注过于简化和同质化的图表&#xff0c;并且问题往往基于模板生成&#xff0c;这导致了对MLLMs图表理解能力的过度乐观评估。为了解决这个问题&#xff0c;作者提出了一个新的评估套件CharXiv&#xff0c;它包含了从arXiv论文中精选的2323个自然、具…

昇思25天学习打卡营第10天|linchenfengxue

基于MobileNetv2的垃圾分类 通过读取本地图像数据作为输入&#xff0c;对图像中的垃圾物体进行检测&#xff0c;并且将检测结果图片保存到文件中。 MobileNetv2模型原理介绍 MobileNet网络是由Google团队于2017年提出的专注于移动端、嵌入式或IoT设备的轻量级CNN网络&#x…

【产品运营】Saas的核心六大数据

国内头部软件公司的一季度表现惨不忍睹&#xff0c;为啥美国的还那么赚钱呢&#xff1f;其实核心是&#xff0c;没几个Saas产品经理是看数据的&#xff0c;也不知道看啥数据。 SaaS 行业&#xff0c;天天抛头露面、名头叫的响的 SaaS 产品&#xff0c;真没有几个赚钱的。 那为…

# mysql 中文乱码问题分析

mysql 中文乱码问题分析 一、问题分析&#xff1a; MySQL 中文乱码通常是因为字符集设置不正确导致的。MySQL 有多种字符集&#xff0c;如 latin1、utf8、utf8mb4 等&#xff0c;如果在创建数据库、数据表或者字段时没有指定正确的字符集&#xff0c;或者在插入数据时使用了与…

Excel中按列的首行字母顺序,重新排列(VBA脚本)

排序前 要求对4列数据按照第一行abcd的顺序排列 VB脚本如下&#xff1a; 要使用这个脚本&#xff0c;请按照以下步骤操作&#xff1a; 打开Excel&#xff0c;然后按下 Alt F11 打开VBA编辑器。在VBA编辑器中&#xff0c;选择“插入” > “模块”&#xff0c;在打开的模块…

C语言课设--读取文件并统计数据

读取文件并统计数据 // 统计记事本英文字符数 //功能 &#xff1a; 读 文件 a.txt 统计出各种 数字 大写字母 小写字母 0~9 A~Z a ~z各有多少个 程序主体框架如下&#xff1a; #include<stdio.h> int a[128]{0};//其中数组元素a[i]保存 ASCII 码为i的字符的数量 v…

安装Intel Realsense D435i驱动与ROS包报错

1.下载安装realsense SDK 1.1 安装依赖 sudo apt install libudev-dev pkg-config libgtk-3-dev sudo apt install libusb-1.0-0-dev pkg-config sudo apt install libglfw3-dev sudo apt install libssl-dev1.2 权限 cd librealsense/ sudo cp config/99-realsense-libusb.…

7 动态规划

下面的例子不错&#xff1a; 对于动态规划&#xff0c;能学到不少东西&#xff1b; 你要清楚每一步都在做什么&#xff0c;划分细致就能够拆解清楚&#xff01; xk​​​​​​​. - 力扣&#xff08;LeetCode&#xff09; labuladong的算法笔记-动态规划-CSDN博客 动态规划是…

VulnHub靶场之DarkHole_1

1 信息收集 1.1 主机发现 arp-scan -l 主机IP地址为&#xff1a;192.168.1.17 1.2 端口和服务扫描 nmap -sS -sV -A -T5 -p- 192.168.1.17 开放22&#xff0c;80端口 1.3 目录扫描 dirsearch -u 192.168.1.17 2 渗透 2.1 访问端口 2.2 注册账号 暴力破解不现实&#…

大语言模型在时空分析中的能力评估

这篇论文的标题是《STBench: Assessing the Ability of Large Language Models in Spatio-Temporal Analysis》&#xff0c;由Wenbin Li等人撰写。本文提出了一个名为STBench的基准&#xff0c;用于评估大型语言模型&#xff08;LLMs&#xff09;在时空分析中的能力。以下是对论…

ESP32CAM物联网教学04

ESP32CAM物联网教学04 给小车配个显示屏 小智决定给小车增加一块显示屏&#xff0c;让小车看起来更好看一些。 点灯物联控制小车的行驶方向 淘宝上面可以使用的液晶显示屏种类非常多&#xff0c;&#xff08;输入OLED搜索&#xff09;经过挑选&#xff0c;选中了这一块&#…

FlinkSQL 开发经验分享

作者&#xff1a;汤包 最近做了几个实时数据开发需求&#xff0c;也不可避免地在使用 Flink 的过程中遇到了一些问题&#xff0c;比如数据倾斜导致的反压、interval join、开窗导致的水位线失效等问题&#xff0c;通过思考并解决这些问题&#xff0c;加深了我对 Flink 原理与机…

学习笔记——动态路由——OSPF(邻接/邻居)

十、OSPF的邻接/邻居 1、OSPF路由器之间的关系 (1)基本介绍 在OSPF网络中&#xff0c;为了交换链路状态信息和路由信息&#xff0c;邻居设备之间首先要建立邻接关系&#xff0c;邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念。 OSPF路由器的两种关系&#x…

《操作系统真象还原》学习笔记:第1章 部署工作环境

**提示&#xff1a;**这篇文章是根据学长提供的教程《操作系统真象还原》第一章 部署工作环境来完成的&#xff0c;我按照学长给的教程一步一步做下来&#xff0c;再结合《操作系统真象还原》这本书&#xff0c;对实验环境进行了配置。以下是我按照教程进行搭建的记录&#xff…