陈垲格,张凤涛,毛怡琳,李天益,王禹龙
(长春师范大学 工程学院,吉林 长春 130032)
工业技术的不断升级使得越来越多的人力被机器所替代。而机械制造自动化进程中,其自动化技术不断改良,甚至和许多新型工业技术融合,衍生出更高端的超越人力所及的机器操作能力,这其中就包括机器视觉技术[1]。机器视觉技术是模拟人类的视觉过程、具有感觉环境的能力和人类视觉功能的技术,它主要通过OpenMV传感器从客观事物的图像中提取信息,进行处理得出结果后,最终应用到实际运行中。相较于人眼来说,机器视觉技术最大的优势是速度快、信息量大、功能多。随着科技的进步和我国经济的快速提升,机器人领域的科研也一次次有了新的进步,机器人的分拣技术一直深受专业人士的关注,机器人和系件特性也在与时俱进[2],人们对机器视觉技术的应用越来越广泛,基于机器视觉技术的智能堆码起重机器人便是其中之一。本文着重描述智能堆码起重机器人中的机器视觉部分。
智能堆码起重机器人主要完成某品牌箱装牛奶的分类、抓取、起重、搬运和码垛等任务,奶箱上贴有不同形状和颜色的标识,作为分类的重要标志,同时也对应着码垛的位置信息,如表1所示。在整个控制系统中,视觉传感器作为智能堆码起重机器人的“眼睛”,安装在机器人前进的方向并始终俯视地面。它将完成两个重要任务:①对奶箱上标识的颜色和形状进行识别,用以确定该箱牛奶的类别;②在机器人搬运过程中,对地面标识线进行偏差计算,并反馈给机器人,使机器人完成寻迹功能。
视觉传感器选择星瞳科技的OpenMV4模块,该模块集成了STM32F7系列的单片机,运行速度快,并且使用Python语言进行编程,使得机器视觉算法的编程变得更容易,同时OpenMV提供了专用的IDE编程环境,具有自动提示、代码高亮、图像跟踪、debug终端等工具,使得编程更加便利。在OpenMV上可以完成各种图像的识别算法,并且可通过编程实现串口输出结果。机器人控制系统由Arduino MEGA2560作为控制核心,使用串口与OpenMV进行通信即可获得视觉传感器反馈的信息。OpenMV4作为从机接收主机发出的两种指令:形状颜色识别(用数字1表示)和位置偏差指令(用数字2表示),其工作流程如图1所示。
表1 不同标识颜色、形状、牛奶分类与码垛位置的对应关系
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 视觉传感器的工作流程
在识别过程中先通过圆形和方形识别标识的形状,再确定标识的颜色。其中圆形和方形可直接调用系统函数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") 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) 本文中每个机器人的视觉传感器是相互独立的。从生产车间的实际情况出发,当生产线的数量过多或生产速度提高时,一台机器人搬运货物会显得力不从心[3],这时需要增加机器人的数量来解决问题。为每个机器人分配一条引导线,可有效规避与其他机器人发生碰撞。同时,对于不同种类的箱装牛奶,机器人可完成自动扫描,并准确地将其投递至相应位置,从而解放劳动力,提高货物分拣效率[4]。随着科技的进步,视觉技术机器人因其防错性、安全性、低成本、高效率等优势将被广泛应用。本文将为其他以OpenMV作为视觉传感器应用的设计方案提供一定的参考。5 寻迹算法
6 结束语