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

引言

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

场景描述

在这个高度自动化的分拣场景中,主要设备包括两个机械臂和一条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.mfbz.cn/a/777611.html

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

相关文章

Go语言--复合类型之指针与数组

分类 指针 指针是一个代表着某个内存地址的值。这个内存地址往往是在内存中存储的另一个变量的值的起始位置。Go 语言对指针的支持介于 Java 语言和 C/C语言之间,它既没有想 Java 语言那样取消了代码对指针的直接操作的能力,也避免了 C/C语言中由于对指针的滥用而造成的安全和…

【紫外线发光器件小结】 UV-B LED 308nm

之前有介绍光的波长和频率计算。 波长小于390nm,频率高于770太赫兹的电磁波忙&#xff0c;或者光。基本有一段就叫做紫外线。 紫外线有分为UV-A/B/C;三小段&#xff1b; 如下图&#xff1a; 高压汞灯与UV LED的光谱&#xff1b;黑色线汞灯&#xff0c;蓝色LED

通信协议:常见的芯片内通信协议

相关阅读 通信协议https://blog.csdn.net/weixin_45791458/category_12452508.html?spm1001.2014.3001.5482 本文将简单介绍一些常见的芯片间通信协议&#xff0c;但不会涉及到协议的具体细节。 一、AMBA&#xff08;Advanced Microcontroller Bus Architecture&#xff09;…

(七)[重制]C++命名空间与标准模板库(STL)

​ 引言 在专栏C教程的第六篇C中的结构体与联合体中&#xff0c;介绍了C中的结构体和联合体&#xff0c;包括它们的定义、初始化、内存布局和对齐&#xff0c;以及作为函数参数和返回值的应用。在专栏C教程的第七篇中&#xff0c;我们将深入了解C中的命名空间&#xff08;nam…

C++(Qt)-GIS开发-简易瓦片地图下载器

Qt-GIS开发-简易瓦片地图下载器 文章目录 Qt-GIS开发-简易瓦片地图下载器1、概述2、安装openssl3、实现效果4、主要代码4.1 算法函数4.2 瓦片地图下载url拼接4.3 多线程下载 5、源码地址6、参考 更多精彩内容&#x1f449;个人内容分类汇总 &#x1f448;&#x1f449;GIS开发 …

连锁门店如何快速联网

随着新零售业态的发展&#xff0c;连锁门店的运营模式逐渐转为数字化运营&#xff0c;新增了诸如收银PoS、扫码枪、摄像头等数字化终端。这些数字化的业务应用都需要依托稳定可靠的网络才能正常运转&#xff0c;在这样的背景下&#xff0c;连锁门店对网络连接的需求显得尤为关键…

C++下Protobuf学习

C下Protobuf简单学习 Protobuf&#xff08;Protocol Buffers&#xff09;协议是一种由 Google 开发的高效的、跨语言的、平台无关的数据序列化协议&#xff0c;提供二进制序列化格式和相关的技术&#xff0c;它用于高效地序列化和反序列化结构化数据&#xff0c;通常用于网络通…

WordPress网站违法关键词字过滤插件下载text-filter

插件下载地址&#xff1a;https://www.wpadmin.cn/2025.html 插件介绍 WordPress网站违法关键词字过滤插件text-filter由本站原创开发,支持中英文关键字自动替换成**号&#xff0c;可以通过自定义保存修改按钮增加“预设关键字”&#xff0c;也可以导入定义好的txt文本形式的关…

single_test_funi.py: error: the following arguments are required: img

parser.add_argument(img, defaultS/1.jpg, helpImage file) 当你已经指定了文件路径&#xff0c;还是报错怎么办&#xff1f; parser.add_argument(img, nargs?, defaultS/1.jpg, helpImage file) nargs? 表示 config 参数是可选的。如果用户没有提供这个参数&#xff0c…

【ARMv8/v9 GIC 系列 5.6 -- GIC 超优先级中断详细介绍】

请阅读【ARM GICv3/v4 实战学习 】 文章目录 Interrupt superpriority超优先级中断的特性和应用Physical interface interrupt signalsPhysical Group 1 Non-NMI for Current Security StatePhysical Group 1 for Other Security State, or a Group 0 Non-NMIPhysical Group 1 …

JVM原理(十八):JVM虚拟机的编译器优化技术

1. 编译器优化技术 编译器的目标虽然是做程序代码翻译为本地机器 码的工作&#xff0c;但其实难点并不在于能不能成功翻译出机器码&#xff0c;输出代码优化质量的高低才是决定编译器优秀与否的关键。 1.1. 优化技术概览 即时编译器对这些代码优化变换是建立在代码的中间表示…

基于Android Studio点餐项目,点餐app

目录 项目介绍 图片展示 运行环境 获取方式 项目介绍 实现登录、注册、注销功能&#xff0c;退出登录等功能&#xff0c; 以及基本的选择店铺点餐&#xff0c;加入购物车和结算等功能&#xff0c;以及可以增加或者减少商品的个数&#xff0c; 同时可以同步价格的总量。以…

两年经验前端带你重学前端框架必会的ajax+node.js+webpack+git等技术的个人学习心得、作业及bug记录 Day1

黑马程序员前端AJAX入门到实战全套教程&#xff0c;包含学前端框架必会的&#xff08;ajaxnode.jswebpackgit&#xff09;&#xff0c;一套全覆盖 Day1 你好,我是Qiuner. 为帮助别人少走弯路和记录自己编程学习过程而写博客 这是我的 github https://github.com/Qiuner ⭐️ ​…

沙龙回顾|MongoDB如何充当企业开发加速器?

数据不仅是企业发展转型的驱动力&#xff0c;也是开发者最棘手的问题。前日&#xff0c;MongoDB携手阿里云、NineData在杭州成功举办了“数据驱动&#xff0c;敏捷前行——MongoDB企业开发加速器”技术沙龙。此次活动吸引了来自各行各业的专业人员&#xff0c;共同探讨MongoDB的…

大话C语言:第27篇 内存模型

1 存储硬件概述 现代计算机遵循冯诺依曼体系结果&#xff0c;存储分为&#xff1a; 外部存储器&#xff1a;长期存放数据&#xff0c;掉电不丢失数据。例如&#xff0c;硬盘、flash、rom、u 盘、光盘、磁带。 内部存储器&#xff1a;暂时存放数据&#xff0c;掉电数据丢失。例…

小白学python(第六天)循环之异变

本篇文章给大家讲解的是循环语句&#xff0c;那么闲话少叙&#xff0c;我们进入正题 在c、Java中循环都是三剑客&#xff0c;那么大家可还记得是哪三位剑客吗 剑客一&#xff1a;while循环 剑客二&#xff1a;for循环 剑客三&#xff1a;do{……}while&#xff08;&…

springcloud-alibba之FeignClient

代码地址&#xff1a;springcloud系列: springcloud 组件分析拆解 1.FeignClient的集成 springboot版本&#xff1a;3.1.5 springcloud组件版本&#xff1a;2022.0.4 nacos客户端的版本&#xff1a;2.3.2 1.引pom 这里引入了nacos和feginclient的版本 <dependency>…

MongoDB 单节点升级为副本集高可用集群(1主1从1仲裁)

作者介绍&#xff1a;老苏&#xff0c;10余年DBA工作运维经验&#xff0c;擅长Oracle、MySQL、PG、Mongodb数据库运维&#xff08;如安装迁移&#xff0c;性能优化、故障应急处理等&#xff09; 公众号&#xff1a;老苏畅谈运维 欢迎关注本人公众号&#xff0c;更多精彩与您分享…

SpringBoot 实现视频分段播放(通过进度条来加载视频)

需求&#xff1a;现在我本地电脑中有一个文件夹&#xff0c;文件夹中都是视频&#xff0c;需要实现视频播放的功能。 问题&#xff1a;如果通过类似 SpringBoot static 文件夹的方式来实现&#xff0c;客户端要下载好完整的视频之后才可以播放&#xff0c;并且服务端也会占用大…

计算机网络之以太网

上文内容&#xff1a;总线局域网以及冲突的解决方法 1.以太网的起源 1.1起源 60年代末期&#xff0c;夏威夷大学Norman Abramson等研制ALOHA无线网络系统,实现Oahu岛上的主机和其它岛及船上的读卡机和终端通信&#xff1b; 出境信道地址&#xff1a;主机到终端&#xff1…