项目来源:2019年第三届全国大学生FPGA创新设计竞赛
01
设计概述
Design Introduction
1.1
设计背景
随着信息技术的发展,人机交互技术逐渐由以键盘、鼠标等基于图形用户界面的方式,转变为以模拟和类似人类感知传输的信息类型。其中,手势识别因其具有的自然、直接、有效的交互特点,越来越受到研究人员的关注。传统的手势识别,需要借助配置有传感器的手套来确定具体的手势形态,成本高且操作不便,不具有推广性。基于机器视觉的手势识别技术,突破硬件局限,从模式识别算法层面革新人机交互方式,更适应未来人机交互发展趋势。机械臂作为现代工业领域自动化智能加工中最常见的执行终端,通过各个关节的协调运动与机械末端的配合,可进行多*度模拟仿真。通过对舵机进行控 制设计,使机械臂能够完成抓取分拣、连续动作,从而使其具有比人手更好的动 作组合灵活性和指令完成准确性。
1.2
作品概述
本作品基于机器视觉,聚焦手势识别,利用摄像头获取单目图像信息,基于 PYNQ 实现手势分割、手势建模、手势形状特征提取,对八种不同手势图像进行识别,以舵机控制的机械臂模块作为响应终端,借助手势变化来控制机械臂执行两种功能:一是按指令分拣物体,二是“井字游戏”人机大战。
1.3
应用领域
本作品将手势识别作为人机交互方式,以机械臂作为响应终端,设计了两种基于上述交互方式和响应终端的展示功能。按指令分拣物体,本质上是对机械臂进行开环控制,延长人手作用范围,对于操控大型机械进行物体分拣的工业自动化领域或物流行业,都有极好的应用前景。“井字游戏”人机大战,仅仅是将手势识别结合机械臂控制、简单的人工智能技术进行组合开发的例子,“手势识别 +”的探索永无止境,在娱乐领域、医疗领域、教育领域、智能家居领域都有着广泛的应用前景。
02
系统组成及功能说明
System Construction & Function Description
2.1
系统组成
本系统以 Xilinx ZYNQ SoC 作为主控制芯片,分为处理器模块、摄像头模块、显示器模块、舵机驱动模块、通讯传输模块。通过摄像头模块捕捉手势图像信息,在处理器模块中完成手势分割、手势建模、手势形状特征提取、手势识别,手势识别的过程及结果通过显示器展示,通过处理器内部不同功能的逻辑运算,将对应的动作指令通过相应的 PWM 信号输出给各个舵机,驱动六*度机械臂完成要求动作,从而实现对应的组合功能。
2.2
手势识别核心算法
本作品所采用的是静态手势识别算法,算法核心主要由手势特征分析、手势特征建模及手势识别三部分组成,整体框架如上图所示。首先通过图像采集设备来获取手势图像,通过手势建模将获取的手势图像用数学模型描述出来,最后根据得到的手势识别所需要的模型参量判别出具体的手势形态。
2.2.1
图像预处理
图像预处理,由四个主要步骤组成,分别为定义识别区域、颜色空间转换、 膨胀处理、高斯滤波。定义识别区域,主要用来减小识别区域面积,从而提高识 别效率。颜色空间转换,通过将摄像头捕捉到的 RGB 颜色空间下的图像信息转 化为 HSV 颜色空间下的图像信息,便利后续对背景和手部进行颜色分割。膨胀 操作,使得识别区域高亮区域增长,消除手部内的噪声点。高斯滤波,通过加权 求和的方式,消除图像内的高斯噪声点。
2.2.2
手势分析
利用道格拉斯-普克(Douglas-Pucker)算法,将手部轮廓拟合为多边形曲线, 同时计算面积,以得到轮廓内手部面积最大的手部轮廓。在此基础上,分别计算 出轮廓总面积(areacnt)、轮廓中手的面积(areahull)、以及手的面积占轮廓总面 积的百分比(arearatio)。与此同时,得到最大轮廓面积中的凸缺陷(即凹陷)数 (defects),并通过计算凸缺陷中起始点、终点、离起始点终点连线最远处的点构 成的三角形的高(d)和顶角(angle)值,来去除因噪声而得到的凸缺陷点,得 到消除噪声点后的凸缺陷数(l)。
2.2.3
手势识别
由手势分析后得到的模型参量通过上述手势识别流程图后,输出“0”“1” “2”“3”“4”“5”“ok”“best of luck”八种手势识别结果,以便后续对结果进行使用。
2.3
“井字游戏”人机大战算法设计
2.3.1
游戏规则及数字化设置
游戏规则
游戏对战的双方执不同棋子,轮流在 3×3 的九宫格中落子,但凡在横排、 竖排、对角线上出现三子相同的情况,则执该子的一方胜。
数字化设置
现在对九宫格的九个位置编码为九个二维坐标(x,y)(x=1,2,3;y=1, 2,3),并赋值为 1,效果如下图所示。
一方执“0”,一方执“2”,落在哪个坐标位置上,就把那个坐标位置对应的 值改为“0”或“2”。每次落子后,分别对每排、每列、每对角线上的三个值求和(和可取 0,1,2,3,4,5,6),如果出现“0”则执“0”的一方胜,如果出 现“6”则执“2”的一方胜。
2.3.2
机器端落子优先级设计
假设人执“0”子,机器执“1”子
(1)中间、边上、角上三种位置的获胜方式分别为
所以优先落中间,其次落角上,最后落边上。
(2)情况优先级
第一优先级:如果出现“1”,立即将(0,0,1)中的“1”置 2,拦截人胜利。
第二优先级:如果出现“5”,立即将(1,2,2)中的“1”置 2,机器取得游戏胜利。
第三优先级:如果出现“4”,且不是“死路”的情况,则将(1,1,2)中任 意一个“1”置 2。
2.3.3
算法流程图
2.4
模块介绍
2.4.1
处理器模块
本作品采用基于 ZYNQ-7020 芯片的 PYNQ-Z2 开发板进行系统开发。ZYNQ 分为 PS(Processing System)和 PL(Programmable Logic)两部分,在 PS 上运 行 Linux 操作系统,在 Linux 操作系统上运行 Python,通过调用 PYNQ 中的库Overlay,对连接到 PS 端的接口进行解析,进而控制 FPGA 逻辑资源,加速系统 数据处理。
对于本作品中所设计的基于机器视觉的手势识别算法和“井字游戏”人机大 战算法,直接利用硬件语言进行编写在逻辑上十分复杂,故采用 Python 进行编程实现,利用 FPGA 对图像处理部分进行硬件加速,不仅提高了图像处理速度, 还更好地扩展了图像应用。
2.4.2
摄像头(图像采集)模块
本作品的手势指令输入由摄像头采集完成。采用奥尼 C11 款的高清摄像头对手势进行画面捕捉,通过 USB 完成图像输入。相比于传统的传感器手套对手势姿态的采集,摄像头减轻了硬件端的负担,使得整个系统可推广性更好。
2.4.3
机械臂(舵机)模块
本作品使用的机械臂,是 Learm 公司开发的一款六*度机械臂,能通过上 位机对其进行动作设计,通过 PWM 控制舵机运转,从而完成抓取和连续复杂动作两种不同的模式功能。舵机(机械臂)模块与处理器的模块采用 UART 串行通信,采用下述通信协议进行指令交互。
2.4.4
显示器(图像输出)模块
采用显示屏作为图像输出端,展示手势识别图像处理过程及结果,不仅利于 过程中的算法调试与验证,并且具有更好地视觉效果。
2.5
功能说明
2.5.1
手势识别
本作品可以对常用的八种手势进行识别处理,分别为“0”“1”、“2”、“3”、 “4”、“5”、“Best of luck”、“ok”。启动系统后,在摄像头端摆出相应手势,及完 成手势输入,显示器会显示出对应的识别结果。显示器画面,有矩形框定位识别区域,在该矩形框中会有多边形框出手部轮廓,右上方会显示识别结果。当识别区域没有放入手进行识别时,显示器画面静止。
2.5.2
机械臂驱动
机械臂动作设计及存储机制
机械臂内部封装有存储“动作组”的部件,用来存储动作指令。用户如果要 进行动作设计,在机械臂通电的情况下,通过 USB 通信与电脑端上位机进行连接,在上位机中设置传输给六个舵机的 PWM 值,形成一个包含这个动作指令的 “动作组”,下载进存储部件以便后续调用。
机械臂驱动机制
通过 UART(串口通信)的方式来调用“动作组”,进而驱动机械臂完成相 应动作。这里需要注意的是,必须将处理器模块与机械臂模块进行“共地”操作, 否则二者无法完成通信,机械臂不能按指令动作。
2.5.3
功能 1:按指令分拣物体
预设四个不同的区域,分别编号为“1”“2”“3”“4”,作为一组一维位置坐 标。设计机械臂在四个不同区域内抓取、放开动作,共八个动作组。手势输入“ok”, 告诉系统下一个输入的是初始坐标。待控制板上亮起指示灯后,通过人眼观测物 体初始位置坐标,通过手势输入该坐标(可输入“1”、“2”、“3”、“4”)。待控制板上亮起指示灯后,手势输入“5”,告诉系统下一个输入的是初始坐标。待控制板上亮起指示灯后,通过手势输入目标位置坐标(可输入“1”、“2”、“3”、“4”)。用户端操作结束,发送指令给机械臂完成分拣全过程。机械臂依次完成抓取、移动、放下,即完成一次按指令分拣。
2.5.4
功能 2:“井字游戏”人机大战
游戏规则参看“2.3‘井字游戏’人机大战算法设计”。手势输入“ok”,告诉 系统接下来输入人落子的坐标区域(x,y)。待控制板上亮起指示灯后,手势输 入“5”,告诉系统接下来输入横向坐标(可输入“1”、“2”、“3”),待控制板上 亮起指示灯后,输入纵向坐标(可输入“1”、“2”、“3”)。用户端操作结束,可 以发送指令给机械臂完成人落子的操作,机械臂完成在棋盘上的人落子操作后, 继续完成机器落子操作。依次进行下去,直至出现有一方胜利。亮红灯表示“人 赢”,亮绿灯表示“机器赢”,亮白灯表示“平局”。
03
作品成效总结与分析
Summary and Analysis of the Effect of the Works
3.1
系统测试性能指标
3.1.1
手势识别
本作品算法下的手势识别功能,在 FPGA 加速下能较好地平衡识别次数和识 别时间的冲突。根据测试结果,本作品取 60 作为整个作品的手势识别循环次数。
3.1.2
机械臂驱动
机械臂能通过用户端“动作组”的设计,进行抓取、移动等连续复杂动作, 具有很好的灵活性。作为机电设计的响应终端,能很好地完成多种功能的指令要求。
3.1.3
按指令分拣物体
“按指令分拣物体”能很好地完成初始坐标输入、目标位置输入,同时能在 较短的时间内快速完成抓取与投递。
3.1.4
“井字游戏”人机大战
“井字游戏”算法能很好地遍历所有可能结果,所以人和机器对战只会出现 “平局”、“机器赢”两种结果。并且,较为稳定、准确的机器识别以及人工智能 算法,能够使整个游戏流畅进行。“手势识别”结合“机械臂”具有很强的视觉观赏性,与此同时,游戏的模式使整个功能更具有趣味性。
3.2
成效得失对比分析
本作品整体而言,不仅将手势识别功能实现,还在此基础上结合机械臂运动特点进行了多功能开发,总体完成度较高,视觉效果较好,兼具灵活性、趣味性及可拓展性。开发本作品采用的手势识别算法,为了得到较高的识别精度,必须要以延长识别时间、增加单次识别次数作为牺牲,使得在应用开发时增加较多的时间负担,不能够凸显人机交互的便利性。从手势识别算法及对识别结果的处理技术层面出发,整个作品还有较大提升空间。
3.3
创新特色总结展望
本作品使用最新的基于机器视觉的手势识别技术作为人机交互方式,革新人 机交互的使用体验,具有极佳的技术前瞻性。使用机械臂作为执行终端,贴近目前工业设计的最新潮流。在设计功能时,基于数学建模,设计出更具有人机互动性质的小游戏,体现人工智能的灵活与智慧。
机电一体化开发,充分发挥基于 Python 编程的代码灵活的特点,以实现复 杂算法,利用 FPGA 硬件加速的优势,提高视觉处理速度。
在本作品的基础上,优化识别算法,加快识别速度,提高识别精度,“手势 识别+”将在未来发挥出自身更强的优势,在教育领域、娱乐领域、工业领域、 医疗领域、智能家居领域都具有越来越广阔的应用前景。