引言
今天我们将展示一个高度自动化的模拟场景,展示多个机械臂与传送带协同工作的高效分拣系统。在这个场景中,机械臂通过视觉识别技术对物体进行分类,并通过精确的机械操作将它们放置在指定的位置。这一系统不仅提高了分拣的速度和准确性,还展示了现代自动化技术在工业领域的巨大潜力。无论是处理大量的日常物品,还是在复杂的工业流程中应用,这种自动化分拣解决方案都体现出了极高的灵活性和效率。
场景描述
在这个高度自动化的分拣场景中,主要设备包括两个机械臂和一条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机械臂和传送带的自动化分拣系统,主要应用于教育场景,旨在教学和演示自动化分拣技术。系统结合计算机视觉、步进电机控制、手眼标定和机械臂运动控制,实现了高效的自动化分拣流程。
如果你觉得该项目有什么可以改进的地方欢迎在下方留下评论,你的留言和支持是对我们更新最大的鼓励。