蔬菜视觉分拣机器人的设计与实现
本文参加新星计划人工智能(Pytorch)赛道:https://bbs.csdn.net/topics/613989052
文章目录
- 蔬菜视觉分拣机器人的设计与实现
- 1. 技术栈背景
- 2. 整体设计
- 3. 机械结构
- 3.1 整体结构
- 3.2 底座结构
- 3.3 小臂结构
- 3.4 大臂结构
- 3.5 负载组件结构
- 3.6 末端执行器结构
- 4. 硬件部分
- 4.1 视觉系统
- 4.1.1 光源
- 4.1.2 海康工业相机
- 4.2 传送带系统
- 4.2.1 传送带装置
- 4.2.2 光电距离传感器
- 4.3 机械臂工控机以及机械臂
- 5. 软件部分
- 5.1 上料机器人程序设计
- 5.1.1 上料机器人程序流程图
- 5.1.2 上料机器人程序描述
- 5.1.3 上料机器人程序核心代码
- 5.2 图像获取与坐标转换程序设计
- 5.2.1 图像获取与坐标转换程序流程图
- 5.2.2 图像获取与坐标转换程序描述
- 5.2.3 图像获取与坐标转换程序核心程序
- 4.3 视觉识别后台程序设计
- 4.3.1 视觉识别后台程序流程图
- 5.3.2 视觉识别后台程序描述
- 5.3.3 视觉识别后台程序核心代码
- 5.4 分拣机器人程序设计
- 5.4.1 分拣机器人程序流程图
- 5.4.2 分拣机器人程序描述
- 5.4.3 分拣机器人程序核心代码
- 6 过程总结
- 6.1 上料与分拣机械臂
- 6.2 视觉系统
1. 技术栈背景
硬件:越疆魔术师M1以及提供场地设施
图像处理:VisionMaster(加密狗6100)、OpenCV
CAD模型:CrownCAD
2. 整体设计
在本文设计中,通过基于 TCP/IP 的 CS 通信架构,用于 PC 端和海康视觉套件之间的程序信息传递,海康视觉套件中会开启 4000 端口和 7890 端口的 TCP Server 侦听,PC 端的利用 TCP Client 连接进行信息传递交互,通过传递的字符串以及传送带附带的光电传感器的反馈信号进行工作流程的推进,光电传感器的信号表征上料到传送带的物料是否到达摄像头的景深区域,海康视觉套件与海康工业相机与光源配合,能够准确的捕获传送带上到位水果物料的图像信息并加以处理,为流程处理提供视觉输入信息,而光源采用环形光源,突出物料盒的三维边缘信息,助力于图像的预处理工作。对于上料机械臂的控制由 PC端调用基于 Dbot 动态 DLL 程序库的 Python API 完成信号的传输,传输的方式为 COM 串口绑定传输,分拣机器人由基于海康视觉套件的 Dbot API 实现控制。在机械臂的控制工作流程方面,是通过 TCP 服务端和客户端交互的字符串推进的,字符串的推进工作有四种:
- PC 端 TCP 客户端连接 4000 端口发送”arrive”
当物料在传送带上运输到摄像头能够捕获的景深区域时,光电传感器电阻值骤变,给予工控机的信号量改变,在 PC 端的状态获取 API 中,检测到光电信号有遮挡物时,PC 端通过 TCP 客户端连接 4000 端口向视觉套件发送”arrive”,表征物料在传送带上已到达景深区域,此时终止传送带的运输。 - 视觉套件 TCP 服务端回应”ok”
当视觉套件接收到字符串”arrive”之后,开始通过配置好的参数调用海康工业相机,进行图像的获取工作,对获取到的图像进行物料有无的特征匹配工作,当匹配到物料的边缘特征之后,确定中心点,将中心点的像素坐标通过手眼标定的变换参数转换为物理坐标系的 x、y 坐标,将转换的物理坐标信息更新到视觉套件的全局变量中,以供机械臂的控制使用,同时将采集的图像信息存到本地,以供 PC 端进行水果类型的分类,当参数更新和图像保存结束后,视觉套件程序的 TCP/4000 端口向 PC 端的客户端端口发送”ok”,表征视觉套件对于物料的检测和坐标转换完成。 - PC 端 TCP 客户端连接 7890 端口发送”A”或”B”或”C”或”D”
当 PC 端连接 TCP/4000 的客户端端口接收到”ok”后,开始对采集的图像进行预处理,通过二值化和形态学开运算操作处理图像将图像的边缘变平滑,消除毛刺,之后进行轮廓面积的匹配,找出轮廓面积接近物料盒的区域,对图像进行仿射变换,区域即为物料盒的区域,对仿射变换后的图像信息使用 ResNet-50 深度卷积神经网络进行推理,对水果的类型进行分类,按照比赛要求,需要分别出白菜、胡萝卜、凤梨、梨四种类别的水果,当程序检测出水果的类别之后,PC 端通过 TCP 客户端连接视觉套件 TCP/7890 服务端端口发送对应的”A”、”B”、”C”、”D”类别字符,以表征到位的物料盒中的水果种类。 - 视觉套件 TCP 服务端回应”run”
视觉套件接收到 PC 端发送的种类信息字符之后,根据不同水果的类别将目标位置点设置为水果对应的放置区域物理坐标点位,更新完目标点的参数之后,根据 2)所获取的物料物理坐标系坐标点,给分拣机械臂发送控制信号,使分拣机械臂的移动到水果物料盒的上方,后下移夹取,夹取后根据目标点位的物理坐标信息进行机械臂的运动规划放置,放置成功后,视觉套件给 PC 端 TCP/7890 Client 回应”run”,当 PC 端程序收到”run”之后,计算上料盒的偏移量,开始下一轮的程序循环,转到 1),直到上料的物料和分拣的物料均已完成。
3. 机械结构
此部分打开官方模型文件使用的是华云三维国产云架构CAD软件CrownCAD,实用便捷,免去了安装的复杂操作,避免了盗版问题,且功能齐全,值得推荐。
https://cad.crowncad.com/account/login
3.1 整体结构
机械臂的整体外观设计图如下,其按照结构分为底座部分、大臂部分、小臂部分、末端工具部分。
机械臂的整体机械结构图如下所示,根据 CAD 软件的模型加载,可以将机械臂的机械结构进行拆解,能够看到机械臂的设计细节。
为了满足分拣和上料的任务要求,设计臂长与旋转范围时要充分进行考虑机械臂的工作范围,机械臂的工作范围如下所示。
机械臂的工作空间三维图如下所示,三维模型对于工作空间的表示则更加直观,由于底座空间的限制,导致机械臂的运动空间并非是正的半球形,但工作空间基本满足分拣任务的需要,由于自由度和臂长的限制,其工作空间仅仅能低于底座 15mm,不适用于低于底座的作业。
3.2 底座结构
底座设计采用半圆形草图设计,一保证左右底座拼接的包装完整性,二为支撑板提供有效的底部铺垫,提高零部件的稳定性,整体采用梯形凸台的整合方式,利于底座承重。底座设计如下所示:
3.3 小臂结构
小臂设计采用的是法兰固定轴连接驱动杆组件进行活动,小臂上留有线材接口和一个按钮用于控制解锁舵机开放示教运动的模式,驱动杆组件拥有一个联轴器,通过联轴器将小臂的部分与底座部分连接起来,完成机械臂两个自由度的连接,小臂上留有电机轴,用于将操作此关节的点击与臂联合起来。小臂机械结构如下所示。
3.4 大臂结构
大臂设计与小臂类似,但是大臂长度较短,同时不用连接底座,不需要驱动杆的组件部分,大臂部分仅仅需要一个与小臂电机轴部分同口径的法兰轴承同时作为大臂的电机轴承与小臂进行连接,考虑与前部执行机构的连接,设计联轴器作为与前部执行机构连接的媒介。大臂机械结构的设计如下所示。
3.5 负载组件结构
负载组件主要连接末端执行器,负载组件的前置组件为小臂,所以负载组件留有一个小臂连接轴,连接轴的口径与小臂的连接轴相同,同时连接轴又作为电机的承载,由于机械臂的末端执行器一般支持更换的,所以需要考虑设计一个蝶形螺母,用于适配设计的末端执行器。负载组件的机械结构图如下所示。
3.6 末端执行器结构
机械结构设计部分此部分为重点部分,在动力系统的设计方面由于在电机不够优秀的情况下,对于参数较小的应用场景下,电机控制的方式不如气动元件的效果好,同时还能节省成本,故动力系统采用气动元件,在机械设计时需要考量气动元件的安放,由于所夹的物料盒为硬质塑料,不必考虑柔性材料夹具,采用钳型夹爪,同时钳型夹爪一侧连接气缸组件,为了是夹爪可动,同时为了重心的稳定性,添加滑动铜套贯穿于夹爪元件。末端执行器的机械结构设计图如下所示。
4. 硬件部分
4.1 视觉系统
4.1.1 光源
本次设计采用白色素光光源辅助补偿,产品编号 JHZM-A40-W,数量安排上为 48 壳发光二极管,照度为 40000lux,亮度为连续可调式,调节范围 0~100%,色温不变,光源是机器视觉处理问题的核心,光源是决定图像质量的重要因素。采用发光二极管 LED 在成本和亮度上相比荧光灯、卤素灯来说折衷,但是其稳定性和使用寿命高,本次光源配置采用环形光高角度照射-明场配光,环形光源的最大特点是可以突出物体的三维信息,在本次设计中主要突出物料盒的边缘信息,使得物料盒边缘明显宜于进行模板匹配,突出边缘后的效果图如下所示。
4.1.2 海康工业相机
视觉系统的信息采集采用海康工业相机 MV-CE050-30UC,像素为 500 万,数据接口为 USB3.0,由于对于图像采集的实时性没有太高的要求,故无需采用 GigE 接口的相机,以节约不必要的成本,由于待测物料盒为静态非运动场景,故采用 CMOS 传感器而非 CCD面阵相机,同样是为了节约不必要的成本,传感器型号为 AR0521,像元尺寸为 1/2.5’’,那么其对角线为 7.182mm,宽度为 5.760mm,高度为 4.290mm,传感器的尺寸越大,像元尺寸则也会更大,本文视觉系统设计选用了 12mm 定焦镜头,待测物料盒大小规格为48mm48mm45mm,视野大小至少为 60mm*60mm,定精度为 0.02mm,那么需要的像素为 60 0.01 × 60 0.01 = 900000 \frac{60}{0.01}\times \frac{60}{0.01}=900000 0.0160×0.0160=900000,也即 90 万像素,而一般一个像素表达 3-4 个精度,故相机的像素不低于4 × 90 × 10 4 = 360 × 10 4 ,也即相机分辨率不能低于 360 万像素,故 500 万相机满
足要求
4.2 传送带系统
4.2.1 传送带装置
传送带的运行负载为 500g,有效运载长度为 600mm,其最大运转速度为 120mm/s,最大加速度为 1200mm/s2,尺寸为 700mm215mm60mm,重量为 4.2kg,考虑到检测物料的重量小于 500g,可以采用此传送带装置作为传输系统的载体,在运转的速度方面,120mm/s的最大速度也满足赛程的要求,速度过快会由于电信号通过工控机连接个人 PC 端传输的效率问题导致物料的到位检测不及时,从而使得物料掉落,使得图像采集信息失准,传送带的宽度为 215mm,能够较为宽松的放置物料盒。传送带的结构图如下所示:
4.2.2 光电距离传感器
光电距离传感器在本次设计中起到了物料盒到位检测的辅助作用,光电距离传感器单元的距离测量范围为 20~150mm 之间,而传送带的边缘与光电距离传感器的距离大于20mm,故采用此型号的光电距离传感器可以满足需求,另外光电距离传感器的信号为模拟信号输出,由机械臂的工控机接收处理,通过其结构提供给 PC 端的 API 调用获取光电距离传感器的状态,供电电压为 4.5V-5.5V。光电传感器的安装示意图如下所示:
4.3 机械臂工控机以及机械臂
机械臂的控制源为机械臂底座下的工控机中的 MCU 板载程序,为驱控一体化设备,其内部硬件与源程序暂未开放,其具有一个复位按键和一个功能按键,用于执行脱机程序和回零操作,其主板后留有一个 10pinUART 接口用于通信,可以连接蓝牙、WIFI 模块,其通信协议采用 Dobot 协议标准,工控机还留有一个 USB 接口,用于连接 PC 进行通信,同时留有 6 个外部接口用于连接气泵、挤出机、传感器等外部设备。工控机的通信编程遵顼 Dobot 通信协议,Dobot 通信协议采用不定长帧,一般帧由包头、负载帧长、负载帧、校验部分组成;为了区别接收帧之后短时间内再次接收控制帧对于机械臂的不同控制表现,指令分为立即指令和队列指令,立即指令将在接收控制帧后立即做出响应,而队列指令则将指令帧加入执行队列,以免造成执行结果异常,命令的参数使用小端模式,帧头以 0xAA 0xAA 作为起始,之后为帧长数据段,表征帧的数据长度,帧负载中包含 ID 号、控制状态和参数部分,最后是校验和部分,以表征接收到的帧是否完整,控制状态中包含读/写状态位和是否为队列指令状态,Dobot 协议也侧面说明了工控机的程序通过串口通信实现,工控机将机械臂的控制程序、位姿估计、轨迹规划等功能以后台程序的形式托管到后台,通过接收串口指令来进行相应的控制。Dbot 协议的示例如下所示:
机械臂的机械结构已在章节 3 中提及,机械臂的自由度和关节运动的关节在于机械结构设计,在硬件方面在每个关节预留的电机连接轴进行步进电机和舵机的连接,用于接收信号量用于驱动电机转动相应的偏移,后台程序通过电机驱动获取各电机和舵机的实时状态用于位姿估计和轨迹规划。在机械臂的小臂上预留了接口的输出位,可以拓展功能,其中一个接口是 R 轴舵机接口,也可以复用为用户自定义接口,R 轴接口用于连接末端执行器,本文中的末端执行器为钳型夹具,R 轴的旋转范围为-90°~90°,末端执行器的实际旋转情况与安装的初始位置有关,而 R 轴的电机所能运动的范围仅靠此接口的输出量。
5. 软件部分
5.1 上料机器人程序设计
5.1.1 上料机器人程序流程图
5.1.2 上料机器人程序描述
上料机器人的程序总体是完成水果物料盒的上料任务,作为整个赛程任务的伊始,其在首次上料的时候不需要有任何的逻辑控制,当第一轮次的循环完毕之后,再次开始下一次循环必须经由分拣机器人的活动反馈来开启,PC 端程序接收到”run”字符串的时候,开启下一轮次的上料工作,根据赛规,上料物料盒数量为两层,每层 8 个,每层 2 列,每列4 个,我们在每次上料后使用三个变量进行位置映射,其分别代表层数、列数、行数,通过三个变量的逻辑控制精准的表达当前操作的物料盒,由于上料机器人没有视觉参考系统,故我们需要使用调试软件确定目标点位的机械臂坐标系坐标点位信息,以物料盒的宽度作为偏移量,进行目标点的配置,使用 Dbot 提供的 API SetPTPCmdEx 进行机械臂的位移控制,当物料成功放到传送带的时候,使用 API SetMotorEx 开启传送带的电机,然后程序进入到位检测的阶段,使用 API GetInfraredSensor 获取光电距离传感器的状态,当光电距离传感器的状态为 1 时,也即光电距离传感器检测到物料到达摄像头景深区域时,设置传送带电机停止,此时进行通信工作,上料机器人的程序创建了绑定 TCP/4000 端口的客户端对象,客户端发送字符串”arrive”,告知服务端,物料盒已经到达分拣区域。
5.1.3 上料机器人程序核心代码
def pileup():
global row,col,floor
# 每次上料前检测拍照位是否有物料
# 默认释放夹爪
dType.SetEndEffectorGripper(api, 1, 0, isQueued=1)
# 抓取( 按照行列式)
# 一层
dType.SetPTPCmdEx(api, 0, (266.9784 - col * 47.7121), (-137.4335 + row * 46.2313), (43.4128 - floor * 43.4128), -39.6240, isQueued=1)
# 抓取
dType.SetEndEffectorGripper(api, 1, 1, isQueued=1)
# 延时 1000ms
dType.dSleep(500)
# 放置
dType.SetPTPCmdEx(api, 0, -22.6245, -258.4785, 65.3683, -44.9279, isQueued=1)
# 释放
dType.SetEndEffectorGripper(api, 1, 0, isQueued=1)
# 抬起
dType.SetPTPCmdEx(api, 0, -25, -270, 105, -44.9279, isQueued=1)
# 传送带动作 7500pulse/s
dType.SetEMotorEx(api, 0, 1, 16500, isQueued=1)
# 提前到达下一个货物的上方
dType.SetPTPCmdEx(api, 0, (266.9784 - col * 47.7121), (-137.4335 + row * 44.2313), 60, -39.6240, isQueued=1)
# 夹爪未使能
dType.SetEndEffectorGripper(api, 0, 0, isQueued=1)
# 传送带动作 7500pulse/s
# dType.SetEMotorEx(api, 0, 1, 7500, isQueued=1)
# 光电物料到位阻塞检测,限时 25s
target_reach()
# 传送带停止,触发相机拍照定位
dType.SetEMotorEx(api, 0, 0, 0, isQueued=1)
socket_client.send("arrive".encode('utf-8'))
# 光电物料离位阻塞检测,限时 25s
# 2*4 矩阵( 一层)
if col < 1 and row <= 3:
col += 1
elif col >= 1 and row < 3:
col = 0
row += 1
elif col >= 1 and row >= 3 and floor < 1:
col = 0
row = 0
floor += 1
else:
print(' 机械臂结束上料')
sys.exit()
5.2 图像获取与坐标转换程序设计
5.2.1 图像获取与坐标转换程序流程图
5.2.2 图像获取与坐标转换程序描述
此部分程序的功能主要是辅助获取物料盒的图像信息,用于后续的分类判断,另外一个作用就是找出物料盒的中心点,这个过程使用的是海康 VisionMaster的特征模板匹配算子,特征模板匹配是传统的模式匹配算法,在这种静态工业视觉场景中,相比深度学习方法的识别要快很多,深度学习的图像目标检测一般用于检测物呈现多样性的情况,并且根据机械臂与摄像头的手眼标定文件将像素坐标系中的物料盒中心点转换为物理坐标系坐标点,转换到分拣机械臂的坐标系中,坐标转换的过程是将像素坐标系下的坐标点通过手眼标定的参数文件转换为机械臂坐标系下的坐标点的过程,实际上手眼标定的过程就是确定一个旋转平移矩阵拟合两个坐标系下坐标点的换算关系,一般使用经典的棋盘格标定法又成张正友标定法,当图像获取以及标定转换工作做完之后,转换后的坐标点信息更新到VisionMaster 的全局变量中,供给后续程序使用,最终将摄取的图像保存在指定位置,以提供给图像分类识别使用VisionMaster 工具开启通信管理,通信管理中在 TCP/7890 开启服务端侦听,存储图像结束后,向 TCP/7890 端口客户端发送”ok”表征图像获取和标定转换、图像存储的功能完结。
5.2.3 图像获取与坐标转换程序核心程序
程序为VisionMaster图形化编程处理过程:
4.3 视觉识别后台程序设计
4.3.1 视觉识别后台程序流程图
5.3.2 视觉识别后台程序描述
视觉识别后台程序开启 TCP/7890 端口客户端侦听数据,当收到服务端的回应”ok”时,程序推进,对采集的物料盒的图像进行裁剪,由于原相机的视野较大且每次物料盒停止的位置并没有太大偏移,故对原图像进行裁剪,裁剪后进行图像预处理,预处理工作中首先对图像进行灰度处理,灰度处理的目的主要是对数据降维,由三通道数据降维到单通道,之后进行二值化处理,将灰度阈值在 100~230 以内和以外的区域二值化处理,主要是将区域分割开,再对图像进行图像的开运算,将轮廓的边缘平滑处理,消除毛刺,之后进行轮廓的提取,物料盒轮廓有两个特点,一是经过调试物料盒的轮廓有 340000 左右,二是其他区域轮廓要么小要么非封闭,故每次提取出的轮廓提取 300000 以上的,取出其区域的坐标,对原通道图像进行仿射变换,经过仿射变换,能够将物料盒以及内部的水果精准的提取出来,为了防止 opencv空载报错,当不存在满足要求的轮廓存在时,返回原图,对仿射变换后的图像进行基于 Resnet-50 的模型分类推理,Resnet 时经典的残差结构卷积神经网络,其实对于 4 分类且特征差别明显的任务,各种典型的神经网络均可优秀地完成任务,考虑使用 Resnet 网络主要是考量其能够在卷积操作之后可以兼顾原图特征,模型推理结束后根据产生的分类结果向 TCP/7890 的服务端发送类型对应的字符,对应关系为:A-大白菜、B-胡萝卜、C-梨、D-凤梨,紧接着使用 opencv 的窗口工具对推理结果进行展示,根据赛程要求,需要将推理结果展示3秒。
5.3.3 视觉识别后台程序核心代码
# 图像预处理
def image_pre(image_source):
# 图像处理:灰度化
dst = cv2.cvtColor(image_source,cv2.COLOR_RGB2GRAY)
# cv2.imshow("dst",dst)
# 图像处理:二值化
ret,dst_2=cv2.threshold(dst,100,230,cv2.THRESH_BINARY)
# cv2.imwrite('./image/thresh.jpg', dst_2)
# cv2.imshow("dst_2", dst_2)
# 图像处理:形态学开运算
kernel = np.ones((3,3),np.uint8)
opening = cv2.morphologyEx(dst_2, cv2.MORPH_OPEN, kernel)
# cv2.imshow("opening", opening)
# cv2.imwrite('./image/opening.jpg', opening)
# 图像处理:包络轮廓
# binary,contours,hierarchy = cv2.findContours(opening,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
contours,binary = cv2.findContours(opening,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# 如果找不到轮廓,则返回原图,防止空载报错
src_roi = image_source
for i in range(0,len(contours)):
# 打印轮廓面积
area = cv2.contourArea(contours[i])
print(area)
# 如果提取的轮廓面积少于 300000 ,跳过,继续寻找轮廓
if area<300000:
continue
# 左上角坐标(x_l,y_l) 、宽、高
x_l, y_l, w, h = cv2.boundingRect(contours[i])
# 中心点坐标
x = (x_l+h)/2;
y = (y_l+w)/2;
# 获取所有轮廓(Blob 连通区)最小外接矩形的(中心(x,y), ( 宽, 高), 旋转角度)数据对象 rect
rect = cv2.minAreaRect(contours[i])
# 获取最小外接矩形的 4 个顶点坐标( 左上角、左下角、右下角、右上角)
box = cv2.boxPoints(rect)
# 数据类型转换
box = np.int64(box)
# 根据最小外接矩形的中心坐标与角度,构建一个旋转矩阵 rot_img
# 输入目标轮廓矩形中心点坐标 center = rect[0] ,矩形角度 angle = rect[2]
rot_img = cv2.getRotationMatrix2D(rect[0], rect[2], 1.0)
# 使用前面获得的四个矩形顶点坐标数组[box] ,在原图层绘制轮廓
cv2.drawContours(image_source, [box], 0, (0, 255, 0), 1)
# 利用旋转矩阵 rot_img, 原图层 img 实现中心仿射变换,变换后的图层尺寸保持不变
# height = image_source.shape[0] ,width = image_source.shape[1]
img_waf = cv2.warpAffine(image_source, rot_img, (image_source.shape[0],image_source.shape[1]))
# 仿射变换后得到 img_waf 图层中心点坐标和目标轮廓最小外接矩形中心点一致,
# 根据数据对象 rect 提取出矩形中心点坐标和宽高 x ,y ,w ,h ,分别得到矩形行(x) 和列(y) 的起始点和结束点
# 在 在 img_waf 中剪裁出纠正角度后的目标图层 src_roi
# 语句原型(img_waf[y-int(h/2): y+int(h/2)+4, x-int(w/2): x+int(w/2)+4])
src_roi = img_waf[int(rect[0][1])-int((rect[1][1])/2)+4:int(rect[0][1])+int((rect[1][1])/2)-4,
int(rect[0][0])-int((rect[1][0])/2)+4:int(rect[0][0])+int((rect[1][0])/2)-4]
cv2.imwrite('./image/img.jpg', src_roi)
break
return src_roi
5.4 分拣机器人程序设计
5.4.1 分拣机器人程序流程图
5.4.2 分拣机器人程序描述
分拣机器人部分主要工作是将物料盒分拣到每个水果的指定存放区域,这个结果要依托于前面程序的工作,当夹取传送带上的物料时,立即给 PC 端侦听的 TCP/4000 端口的客户端发送”run”以节省时间,开启上料的下一轮次的循环。当开始换算分拣区域的物理坐标系点时,采用 VisionMaster的脚本功能,插入逻辑代码,语言采用 C#的形式,A、C 类的区域相对于机械臂坐标系来说,并非顺应 x 轴、y 轴的存在,其对应关系如下所示:
图中的 ABCD 表示四个物料盒的摆放位置,我们仅需要获得 A 点的位置,剩下的点均可以采用偏移量的形式移动,根据根据等腰三角形的勾股定理,偏移量为 1800 \sqrt{1800} 1800约为 43,那么进行偏移量的分析如下所示
经过分析,设轮次为 n,设偏移量 43 为 x,则对于坐标 X 的拟合序列为 0,x,-x,0,根据计算,推断出拟合多项式为:
t ( n ) = ( n % 3 = = 0 ) ? 0 : 1 × ( − 1 ) n + 1 x t(n)=(n\%3==0)?0:1\times(-1)^{n+1}x t(n)=(n%3==0)?0:1×(−1)n+1x
对于坐标 Y 的拟合序列为 0,x,x,2x,根据推演,拟合的多项式为:
t ( n ) = n x 2 n − 1 + ⌊ n 3 ⌋ × 5 4 x t(n)=\frac{nx}{2^{n-1}}+\lfloor \frac{n}{3}\rfloor \times \frac{5}{4}x t(n)=2n−1nx+⌊3n⌋×45x
根据 A 区域的分析同理可以得到 C 区域的位置关系,对于 B 区域的分析则较为简单,B 区域相对于机械臂坐标系的相对位置如下所示。
经过分析,偏移量分析表如下所示:
设轮次为 n,设偏移量 60 为 x,对于 X 的拟合结果为:
t ( n ) = ⌊ n 2 ⌋ x t(n)=\lfloor \frac{n}{2} \rfloor x t(n)=⌊2n⌋x
对于 Y 的拟合结果为:
t ( n ) = ( n m o d 2 ) x t(n)=(n\quad mod\quad2)x t(n)=(nmod2)x
5.4.3 分拣机器人程序核心代码
主要流程已经由海康图形流程给出,此处主要实现多项式拟合位置的C#脚本
using System;
using System.Text;
using System.Windows.Forms;
using Hik.Script.Methods;
SetFloatValue("placeXB", xB - cntB / 2 * 60);
SetFloatValue("placeYB", yB - cntB % 2 * 60);
SetFloatValue("placeXA", (float)(xA + (cntA%3==0 ? 0 : 1) * Math.Pow(-1, cntA + 1) * 43));
SetFloatValue("placeYA", (float)(yA + cntA * Math.Sqrt(1800) / Math.Pow(2, cntA - 1) + (int)(cntA / 3) * 1.25F * 43));
6 过程总结
6.1 上料与分拣机械臂
对于上料与分拣机械臂的开发过程中主要是理顺机械臂的三种运动模式的区别以及点位的设置,在点位设置方面需要使用官方工具进行示教摆放,摆放完成后记录 xyzr 坐标便于在程序中进行设置,由于机械臂的运动范围非正半球形,故有一些位姿虽然手动摆放可以达到,但是实际机械臂的坐标系中并不包含此处,在不同的运动模式中,轨迹规划的方式不相同,MOVJ 运动模式是整个关节进行协同趋近,速度较快,但是其规划不考虑自身关节的约束,所以其规划失败率很高,在调试中采用了增加中间过度点的方式来避免这
种错误。
在调试速度中,发现当速度过快时会出现一些坐标系漂移以及关节异响的问题,本质上仍然是关节的协同运动不协调,适当抬高起始点的高度或者降低速度解决。对于分拣点的数学表达式的拟合是通过特定数据的补偿归纳得到,其并不具有泛化使用性,但对于小数据量的表达上仍然是具有意义的。
6.2 视觉系统
海康视觉系统的难点在于软件的陌生和相机的选型,相机和镜头的选型要考虑物料盒和视野的大小,同时要考虑成本和通信问题,在镜头的选型上要计算出相机分辨率和 FOV进行计算,同时对于定焦和变焦要考虑,在静态场景下一般选择定焦,同时仅仅测一个物件,并不需要一个变焦的镜头,对于光源的选择需要一定的光学知识和数字图像处理知识,光源是补偿图像的作用,此次的目的是进行边缘的突出,采用环形光 LED 能够满足要求,在调试的过程中,曝光时间也同样重要,调焦距和光圈让图像清晰,在曝光时间上让图像的亮度达标,使得图像处理的工作容易进行。
在分类识别后台的设计上难点在于有效的利用图像,进行预处理,由于视野中的物料盒并不是中心矩形的排布,所以图像中的冗余信息很多,对于图像的预处理使用形态学的处理寻找轮廓是一个好的选择,类似的方法还是划定区域直方图检测等等,这样的方法仍然也用在了采集数据进行训练的过程,在特定的任务下使用特定的数据进行训练的拟合度是最高的,这种方法并不是一种投机取巧,机器视觉的任务往往就是针对特定的场景。Resnet-50 并非难点,经典的深度学习网络结构用于分类任务是特别常见的。