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

news2024/10/5 13:37:15

引言

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

场景描述

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

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

相关文章

dotnet ef工具使用

设置工具安装目录 dotnet tool install dotnetsay --tool-path G:\dotnet-tools安装 dotnet tool install --global dotnet-ef更新 dotnet tool update --global dotnet-ef查看版本 dotnet ef --version创建迁移文件 # 只有一个dbcontext dotnet ef migrations add init #…

http读书笔记

持久化 HTTP/1.1 和一部分的 HTTP/1.0 想出了 持久连接&#xff08;HTTP Persistent Connections&#xff0c; 也称为 HTTP keep-alive 或 HTTP connection reuse&#xff09; 的方法。 持久连接的特点是&#xff0c; 只要任意一端 没有明确提出断开连接&#xff0c; 则保持 T…

mysql 9 新特新

mysql9新特性 新特性Audit Log NotesC API NotesCharacter Set SupportCompilation NotesComponent NotesConfiguration NotesData Dictionary NotesData Type NotesDeprecation and Removal NotesEvent Scheduler NotesJavaScript ProgramsOptimizer NotesPerformance Schema …

微机原理与单片机 知识体系梳理

单片机笔记分享 我个人感觉单片机要记的东西很多&#xff0c;也很琐碎&#xff0c;特别是一些位、寄存器以及相关作用等&#xff0c;非常难以记忆。因此复习时将知识点整理在了一起做成思维导图&#xff0c;希望对大家有所帮助。内容不是很多&#xff0c;可能有些没覆盖全&…

轻预压:滚珠丝杆精度与刚性的平衡点!

预压是指在所需的工作负荷下&#xff0c;使滚珠丝杆预先承受一定的负荷&#xff0c;从而使滚珠丝杆的轴向向心度和侧向偏差达到较小的偏差范围&#xff0c;保证了滚珠丝杆的准确性和稳定性&#xff0c;也确保机器的高精度和长期运作的可靠性。 预压是滚珠丝杆设计中的一个重要参…

基于Java技术的人事管理系统

你好&#xff0c;我是专注于计算机科学领域的小野。如果你对人事管理系统感兴趣或有相关需求&#xff0c;欢迎私信交流。 开发语言&#xff1a; Java 数据库&#xff1a; MySQL 技术&#xff1a; B/S模式、Java技术、SpringBoot 工具&#xff1a; Eclipse、MySQL、浏览…

Selenium 切换 frame/iframe

环境&#xff1a; Python 3.8 selenium3.141.0 urllib31.26.19说明&#xff1a; driver.switch_to.frame() # 将当前定位的主体切换为frame/iframe表单的内嵌页面中 driver.switch_to.default_content() # 跳回最外层的页面# 判断元素是否在 frame/ifame 中 # 126 邮箱为例 # …

基于若依的文件上传、下载

基于若依实现文件上传、下载 文章目录 基于若依实现文件上传、下载1、前端实现-文件上传1.1 通用上传分析1.2 修改实现上传接口 2、后端实现-文件上传3、后端实现-文件下载4、前端实现-文件下载 官网其实也写了&#xff0c;但是我是自己改造封装了一下&#xff0c;再次迈向全栈…

vofa+:一款超级好用的可视化串口调试软件

目录 一、软件配置 1、先配置好usart1串口 2、重定向printf: 3&#xff0c;勾选魔术棒中的LIB 二、vofa的使用 1、RawData模式 2、FireWater 一、软件配置 1、先配置好usart1串口 2、重定向printf: 在 stm32f4xx_hal.c中添加&#xff1a; #include <stdio.h> e…

加密货币大利好!9月降息概率突破70%!美国可能大幅降息或多次降息?

根据最新消息&#xff0c;美国9月降息的概率已经突破70%&#xff0c;这对加密货币市场来说是个利好消息。与此同时&#xff0c;美国经济表现疲软&#xff0c;可能会陷入衰退&#xff0c;联邦储备系统(Fed)接下来会不会果断采取大幅降息措施备受关注。 美国劳工统计局7月5日公布…

VBA初学:零件成本统计之一(任务汇总)

经过前期一年多对金蝶K3生产任务流程和操作的改造和优化&#xff0c;现在总算可以将零件加工各个环节的成本进行归集了。 原本想写存储过程&#xff0c;通过直接SQL报表做到K3中去的&#xff0c;但财务原本就是用EXCEL&#xff0c;可以方便调整和保存&#xff0c;加上还有一部分…

Java对象比对工具

背景 前段时间的任务中&#xff0c;遇到了需要识别两个对象不同属性的场景&#xff0c;如果使用传统的一个个属性比对equals方法&#xff0c;会存在大量的重复工作&#xff0c;而且为对象新增了属性后&#xff0c;比对方法也需要同步修改&#xff0c;不方便维护&#xff0c;于是…

76 4G模组 境外拨号入网注意

1 引言 最近朋友把国内的设备拿到新加坡了&#xff0c;然后发现原本国内可以使用的设备无法在异国他乡联网&#xff0c;所以就叫我来看看&#xff0c;发现是附网返回状态、入网APN发生了改变导致的。另外&#xff0c;如果在境外使用国产4G模组拨号入网&#xff0c;也需要关注4G…

Nginx实战:nginx性能压测(ab)

在nginx的生产实践中,不管是服务上线,还是性能优化,都会遇到需要对nginx的性能压测,本文介绍一个简单的压测工具:ab命令 ab(Apache Bench)是一个常用的HTTP压力测试工具,可以用来测试Nginx的性能和压力。ab命令可以指定并发请求数、请求数、请求类型等参数,并输出测试…

MySQL第三次作业--DML语句(INSERT)

目录 一、在数据库中创建一个表student&#xff0c;用于存储学生信息 二、向student表中添加一条新记录&#xff0c;记录中id字段的值为1&#xff0c;name字段的值为"monkey"&#xff0c;grade字段的值为98.5 三、向student表中添加多条新记录&#xff1a; 2,&qu…

G1.【C语言】EasyX初步了解

1.介绍 EasyX 是针对 C/C 的图形库&#xff0c;可以帮助使用C/C语言的程序员快速上手图形和游戏编程。 2.安装 EasyX Graphics Library for CEasyX Graphics Library 是针对 Visual C 的绘图库&#xff0c;支持 VC6.0 ~ VC2019&#xff0c;简单易用&#xff0c;学习成本极低…

使用WinSCP工具连接Windows电脑与Ubuntu虚拟机实现文件共享传输

一。环境配置 1.首先你的Windows电脑上安装了VMware虚拟机&#xff0c;虚拟机装有Ubuntu系统&#xff1b; 2.在你的windows电脑安装了WinSCP工具&#xff1b; 3.打开WinSCP工具默认是这样 二。设置WinSCP连接 打开WinSCP&#xff0c;点击新标签页&#xff0c;进入到如下图的…

编码与加密

编码与加密在爬虫中经常涉及&#xff0c;常见的编码有base64, unicode, urlencode&#xff0c;常见的加密有MD5, SHA1, HMAC, DES, AES, RSA。 下面逐一介绍&#xff1a; 一&#xff0c;编码 1.1 常规编码 常规编码约定了字符集中字符与一定长度二进制的映射关系&#xff0…

leetcode刷题(51-60)

算法是码农的基本功&#xff0c;也是各个大厂必考察的重点&#xff0c;让我们一起坚持写题吧。 遇事不决&#xff0c;可问春风&#xff0c;春风不语&#xff0c;即是本心。 我们在我们能力范围内&#xff0c;做好我们该做的事&#xff0c;然后相信一切都事最好的安排就可以啦…

BES 平台 SDK之ANC 参数调整

前言: 最近项目开发进入到DV 阶段,客户临时提了一个需求,希望在ota升级的时候,保留ANC 参数下的total_gain 值,ota只更新滤波器相关参数。total_gain 继续使用产线校准好的值。 一:ANC 参数 1.首先需要找到代码对应ANC 加载的函数: best1502x_ibrt_anc_…