智能堆码起重机器人的机器视觉算法设计

2022-08-23 02:56陈垲格张凤涛毛怡琳李天益王禹龙
机械工程与自动化 2022年4期
关键词:堆码形状偏差

陈垲格,张凤涛,毛怡琳,李天益,王禹龙

(长春师范大学 工程学院,吉林 长春 130032)

0 引言

工业技术的不断升级使得越来越多的人力被机器所替代。而机械制造自动化进程中,其自动化技术不断改良,甚至和许多新型工业技术融合,衍生出更高端的超越人力所及的机器操作能力,这其中就包括机器视觉技术[1]。机器视觉技术是模拟人类的视觉过程、具有感觉环境的能力和人类视觉功能的技术,它主要通过OpenMV传感器从客观事物的图像中提取信息,进行处理得出结果后,最终应用到实际运行中。相较于人眼来说,机器视觉技术最大的优势是速度快、信息量大、功能多。随着科技的进步和我国经济的快速提升,机器人领域的科研也一次次有了新的进步,机器人的分拣技术一直深受专业人士的关注,机器人和系件特性也在与时俱进[2],人们对机器视觉技术的应用越来越广泛,基于机器视觉技术的智能堆码起重机器人便是其中之一。本文着重描述智能堆码起重机器人中的机器视觉部分。

1 设计背景

智能堆码起重机器人主要完成某品牌箱装牛奶的分类、抓取、起重、搬运和码垛等任务,奶箱上贴有不同形状和颜色的标识,作为分类的重要标志,同时也对应着码垛的位置信息,如表1所示。在整个控制系统中,视觉传感器作为智能堆码起重机器人的“眼睛”,安装在机器人前进的方向并始终俯视地面。它将完成两个重要任务:①对奶箱上标识的颜色和形状进行识别,用以确定该箱牛奶的类别;②在机器人搬运过程中,对地面标识线进行偏差计算,并反馈给机器人,使机器人完成寻迹功能。

2 视觉传感器的工作原理

视觉传感器选择星瞳科技的OpenMV4模块,该模块集成了STM32F7系列的单片机,运行速度快,并且使用Python语言进行编程,使得机器视觉算法的编程变得更容易,同时OpenMV提供了专用的IDE编程环境,具有自动提示、代码高亮、图像跟踪、debug终端等工具,使得编程更加便利。在OpenMV上可以完成各种图像的识别算法,并且可通过编程实现串口输出结果。机器人控制系统由Arduino MEGA2560作为控制核心,使用串口与OpenMV进行通信即可获得视觉传感器反馈的信息。OpenMV4作为从机接收主机发出的两种指令:形状颜色识别(用数字1表示)和位置偏差指令(用数字2表示),其工作流程如图1所示。

表1 不同标识颜色、形状、牛奶分类与码垛位置的对应关系

3 通信协议设计

Arduino MEGA2560作为主机向OpenMV发出两种指令:形状颜色识别和位置偏差指令。OpenMV接收到不同的指令,按照要求进行图像识别并反馈对应的信息。

OpenMV作为从机,接收指令时对应的Python代码如下:

uart = UART(3, 115200)

a=0

b=0

while(True):

clock.tick()

if uart.any():

a=uart.readline().decode().strip()

b=int(a)

if b==1:……#此处完成颜色和形状识别

if b==2:……#此处完成距离偏差和角度偏差计算

图1 视觉传感器的工作流程

4 形状颜色识别算法

在识别过程中先通过圆形和方形识别标识的形状,再确定标识的颜色。其中圆形和方形可直接调用系统函数find_circles()和find_rects()。

根据像素统计函数get_statistics()的结果中的l_mode()、a_mode()、b_mode()的范围可确定颜色。注意,该范围不是固定的,与环境光线、色块亮度都有关系,需要经过实验获得。

以下为识别圆形的Python代码,方形的识别与其类似,不再给出。

sensor.set_framesize(sensor.QQVGA)

img = sensor.snapshot().lens_corr(1.8)

for c in img.find_circles(threshold = 3500, x_margin = 10, y_margin = 10, r_margin = 10, r_min = 2, r_max = 100, r_step = 2):

area = (c.x()-c.r(), c.y()-c.r(), 2*c.r(), 2*c.r())

statistics = img.get_statistics(roi=area)

if 0

img.draw_circle(c.x(), c.y(), c.r(), color = (0, 255, 0))

print(“红色圆形”)

else:

if 0

img.draw_circle(c.x(), c.y(), c.r(), color = (0, 255, 0))

print(“蓝色圆形”)

三角形先识别标识的颜色,再确定标识的形状,调用的是系统函数find_blobs(),找到的色块面积与其外接矩形面积的比值为1/2,即可确定其为三角形。实际使用过程中是围绕1/2的一个数字范围。以下为识别三角形的Python代码:

for blob in img.find_blobs(R_thresholds,pixels_threshold=200,roi = (0,0,320,240),area_threshold=200):

if blob.density()>0.25 and blob.density()<0.6:

print("红色三角型")

else: #占空比太小的都是干扰可忽略。

print("no dectedtion")

for blob in img.find_blobs(B_thresholds,pixels_threshold=200,roi = (0,0,320,240),area_threshold=200):

if blob.density()>0.25 and blob.density()<0.6:

print("蓝色三角型 ")

else: #占空比太小的都是干扰可忽略。

print("no dectedtion")

5 寻迹算法

OpenMV作为寻迹传感器,需要先识别出行走路径上的引导线,然后再调用rho()函数,通过abs(line.rho())-imgTrack.width()/2计算距离偏差。调用theta()函数可直接获得引导线的偏差角,但theta()函数获得的角度范围为0~180°,需减掉90°,映射到-90°~90°之间。以下为偏差计算的Python代码:

sensor.set_framesize(sensor.HQQVGA)

CheckForm = 0

imgTrack = sensor.snapshot().binary([THRESHOLD])

line = imgTrack.get_regression([(100,100)], robust = True)

if (line):

rho_err = abs(line.rho())-imgTrack.width()/2

if line.theta()>90:

theta_err = line.theta()-180

else:

theta_err = line.theta()

imgTrack.draw_line(line.line(), color = 127)

if line.magnitude()>8:

print(rho_err,theta_err)

6 结束语

本文中每个机器人的视觉传感器是相互独立的。从生产车间的实际情况出发,当生产线的数量过多或生产速度提高时,一台机器人搬运货物会显得力不从心[3],这时需要增加机器人的数量来解决问题。为每个机器人分配一条引导线,可有效规避与其他机器人发生碰撞。同时,对于不同种类的箱装牛奶,机器人可完成自动扫描,并准确地将其投递至相应位置,从而解放劳动力,提高货物分拣效率[4]。随着科技的进步,视觉技术机器人因其防错性、安全性、低成本、高效率等优势将被广泛应用。本文将为其他以OpenMV作为视觉传感器应用的设计方案提供一定的参考。

猜你喜欢
堆码形状偏差
电器包装件堆码试验标准浅析及应用
50种认知性偏差
包装大米堆码储存作业技术实仓应用分析
如何走出文章立意偏差的误区
某核电站放射性固体废物暂存库货包堆码方案的分析与论证
真相
火眼金睛
分一半
机械装配偏差源及其偏差传递机理研究
心的形状