张一航 程新荣 陈 洪 王 庆
(中国农业大学信息与电气工程学院 北京 100083)
随着计算机科学技术的高速发展,人机交互技术已经从以计算机为中心逐步转移到以人为中心[1]。作为3D感知器的微软Kinect设备自发布以来就吸引了大量游戏玩家和科研人员的注意力。这引发了大量基于Kinect的研究,开发了基于Kinect的电子相册[2]、基于Kinect的体感虚拟鼠标[3]等。近几年,体感游戏机Xbox越来越多的进入普通家庭,从2011年11月至2012年4月就已售出1 800万的Kinect体感游戏控制系统[4]。由于体感交互方式更加自然,体感游戏这种新型的游戏体验形式越来越引起广大普通民众的兴趣。但Kinect for Xbox 360的游戏内容还是很少,这种情况归结于体感内容的开发需要大量的专业知识,例如真实世界中的很多属性和物理约束如何转换成具体数值映射到计算机所构建的场景中用以增强用户的游戏体验,以及人体的各种生理属性、动作参数的准确获取都是很关键的问题。这些专业知识对游戏开发者来说是陌生的,这导致体感游戏开发周期时间比较长,开发成本也比较大[5],开发效率低。体感游戏内容的匮乏,在数量和质量上均处于劣势,大大制约了体感游戏的普及与发展。此外,我们发现传统人机交互平台的很多优秀的游戏资源很适合通体感交互方式进行交互,其中尤其以第一视角的运动类游戏为主,例如跑酷、球类游戏等。源于运动类的游戏本身就是控制游戏角色做动作行为,然而使用键盘鼠标或者触屏的交互方式并不能带给玩家良好的体验,使用体感交互的方式可以给玩家更强的沉浸感和体验感。鉴于此,本文提出了一种提高开发效率的解决方案,即利用数量可观,制作精良的传统人机交互平台的游戏作为内容资源,并开发了体感交互开发中间件作为桥梁,将原本基于键盘鼠标等操作的传统交互方式游戏实现体感化操作,将用户动作与游戏中的键盘鼠标等指令映射起来。经验证,本文方法可以有效地将传统交互方式的游戏实现体感化操作,为丰富体感游戏的游戏内容提供了一个有效的解决方案。
目前,国内外对于传统交互方式向自然人机交互转换的工具相关的研究尚不是很多,比较有代表性的有KinEmote、Faast、MapGIS等。
KinEmote是使用一组基本的手势来控制媒体中心软件Boxee,所有的操作都可以用一只手来完成。KinEmote能够通过Kinect对Boxee进行控制,用户打开KinEmote后,通过手在可识别范围的空间中进行一定的动作行为即可对当前应用进行操作,包括手部简单的几个方向移动动作(Move)控制菜单选项,手部向前推可以触发鼠标事件的点击(Click),手部在一个方向上保持不动,即可实现光标的拖拽(Drag)事件。
特点:KinEmote手势识别准确率很高,针对一些用手控制的应用。
缺点:不支持其他动作的识别,仅适用于媒体中心软件Boxee,不支持全Windows菜单界面的控制。
Faast(Flexible Action and Articulated Skeleton Toolkit)[6]是美国南加州大学2010年开发的一款将全身交互与虚拟环境、医疗卫生、电子游戏以及其他用户界面结合起来的中间件工具。包括一个可以创建自定义姿势的图像用户界面,传感器的适配,骨架追踪,动作识别以及多种适用于控制第三方应用的输出机制。并定义了一种可以表示人体姿势的语法规则,用这个规则集对应到每一个动作的基本时空组件,单个规则形成一种原语。虽然概念简单,可以同时逐一地结合起来形成复杂的姿势交互。
优点:Faast提供的动作类别和Windows交互事件非常全面,已经基本可以实现对任何一款Windows应用程序的控制。
缺点:它需要使用者具备与动作描述有关的专业知识,用户使用门槛比较高,而且Faast对于静态的姿势识别率比较高,但对于稍复杂的姿势和动态的动作,Faast的识别率还有待提高。
国内在体感交互转换工具方面的研究还非常少见,南京师范大学研究的基于体感交互的GIS交互中间件[7]是根据MapGIS具体应用需求,建立GIS操作与人体动作的映射机制,将传统上基于鼠标的GIS操作体感化。
特点: 针对GIS操作,如地图的放大、缩小,地图的返回全景显示等。
缺点:对于一些复杂的操作仍需要搭配鼠标控制,体验效果并不好,针对具体某款软件,拓展性较差,不是一个完整的解决方案。
首先通过微软Kinect SDK获取人体25个骨架关节点,绘制出骨架模型;然后基于对动作的3种描述方法对动作进行描述,建立动作模板库;在映射关系构建模块中建立动作与传统交互事件之间的一一映射关系;在动作识别模块中,使用模板匹配法,用户做出某一个动作时,如果该动作与动作模板库中的某一个动作相匹配,则系统识别出用户动作为哪一个动作;在模拟输出模块中触发与之对应的传统交互事件用以控制第三方传统交互游戏。
图1为软件基本架构图。以Kinect为基本的物理底层,主要模块分为骨架绘制模块、动作定义模块、动作识别模块、映射关系构建模块以及输出模拟模块,整个体系构成一个完整的架构。
图1 系统架构模块划分
系统架构由骨骼数据读取模块,动作定义模块、动作识别模块、映射关系构建模块以及模拟器模块组成。从深度传感器(Kinect v2)获取到骨骼信息后,在软件的界面上绘制出人物的骨骼模型,Kinect v2最多可以绘制6个人的骨架棒状模型。每个人的骨架棒状模型可识别人体的25个关节点并在每两个关节点之间绘制一条骨架连线。基于一些动作的描述规则,对动作进行描述和定义,建立可扩展的动作库作为动作识别的模板库。这些描述规则包含基于肢体关节点空间位置的描述,基于骨骼角度的描述及基于连续静态姿态快照的动作匹配,这些描述规则会在第3节详细介绍。然后将构建映射关系,动作库中的具体一个动作对应一个传统交互事件称之为一个映射。构建多个映射直至所有映射关系满足目标应用的体感交互需求。在这个过程中所构建的每一条映射关系最终形成映射集。动作识别模块采用模板匹配法,将实时采集用户的目标体感动作并与动作库中的体感动作进行匹配以获取所述用户的目标体感动作所属的动作类别。根据所识别出的目标体感动作的动作类别通过映射集中的映射关系,得到该动作类别所对应的传统交互事件。系统还包括一个可以调用传统交互事件的模拟输出模块。该模块中包含了Windows传统交互事件,如键盘事件和鼠标事件等,利用该模块通过消息响应机制输出这些事件。
在这一节中,将对第2.1节中中间件架构的动作定义模块中3种动作描述规则进行详细阐述。基于肢体关节点空间未知的描述及基于骨骼角度的描述更多适用于对静态姿势进行判断,对于连续动作的判断需要结合基于连续静态姿态快照的动作匹配。
Kinect传感器输出的关节点位置使用(x,y,z)表示,其单位是米。坐标轴X、Y、Z是传感器实体设备的空间坐标轴。在设备坐标系统下,原点位置对应于传感器本身,Z轴正向与传感器的方向一致,Y轴正向朝上,X轴正向向左延伸(从传感器的感应方向看去)。整个坐标系属于右手坐标系,如图2所示。
图2 Kinect设备坐标系
在这个坐标系中,以用户的臀部中心作为坐标原点,当用户面向感应设备时,X轴正向向右延伸,Y轴正向向上延伸,Z轴向后延伸。在用户坐标系下的关节点坐标必须进行坐标转换得到。
假定(x,y,z)表示设备空间坐标系下某个关节点的三维坐标,则用户坐标系下其三维坐标(x′,y′,z′)可使用式(1)求得。
(1)
式中:O′(x0,y0,z0)表示用户空间坐标系o′x′y′z′的坐标原点。
关节点在相机空间坐标系中的位置信息是最为基本的信息,Kinect v2相较Kinect v1,性能有较大提升。新一代 Kinect 传感器除了能够从画面中识别更多的人体骨架,具备更高分辨率摄像头,提供景物深度数据和红外数据,还能够为开发者提供人物的肌肉、运动的力量和心跳以及面部表情[8]。目前最多能够绘制6幅骨架模型,如图3所示。在Kinect v2可视范围内可绘制出人体25个关节点,并以每秒 30 帧的频率刷新。
图3 微软MSND提供的人体骨架模型,包含Kinect v2能够追踪和识别的25个骨架关节
在进行动作描述过程中,可以通过比较两个关节点在用户坐标系中的相对空间位置关系来描述用户的动作行为:
{关节点 1} {关系} {关节点 2} {比较} {阈值}
其中,“关节点”的类型包括:脊椎关节集合(头部、颈部、肩部中央、躯干中央、盆骨中央)、右手集合(右手最远端、右手拇指、右手手心、右手手腕、右手手肘、右肩)、左手集合(左手最远端、左手拇指、左手手心、左手手腕、左手手肘、左肩)、右腿集合(右脚、右膝、右臀)、左腿集合(左脚、左膝、左腿)共25个关节点。
“关系”表示对空间坐标系中关节点的X、 Y、 Z坐标值进行的比较,包括:相对左方、相对右方、相对上方、相对下方、相对前方、相对后方、远离(大于一定距离即满足条件)、靠近(小于一定距离即满足条件)。
“比较”是指大于阈值触发、小于阈值触发、或者落在某个区域触发。在这里需要特别指出的是,本文在考虑关键相对位置关系时,排除了“等于阈值触发”的选项。因为在按照这种规则对动作进行描述时,要用户做出一个与描述动作十足匹配的动作是十分困难的,识别率必然是很小的。
“阈值”是指描述动作的触发范围,用户的动作必须达到描述动作的阈值才能识别到具体的动作。
例如,我们对“举右手”这个姿势进行如下描述:
{右手关节点} {上方} {右肩关节点} {大于} {0.3米}
我们使用这样简单的语句对一个“举右手”的动作进行了描述。
人体的每两个关节点确定一根骨骼,在三维坐标系中表现为一个有长度、方向的向量。本文通过对骨骼向量之间相对角度的关系来对动作进行描述。
角度的判断主要是通过空间向量间的夹角公式的方式来计算。由于两个向量可以决定一个平面,本文暂且跳出相机空间坐标系,在两个骨骼向量所决定的平面上来对角度进行描述。
图4中O、A、B三点分别表示三个不同的关节点,其中O点表示两段骨骼的连接关节点,向量a和向量b分别表示三点所决定的两个骨架向量。
图4 计算两段骨骼向量的夹角示意图
计算公式如下:
a=(XA-XO,YA-YO,ZA-ZO)
(2)
b=(XB-XO,YB-YO,ZB-ZO)
(3)
(4)
因此,只要获得三个关节点的空间位置信息,便可以求得两段骨架向量的夹角。
对于动作来说,我们可以将其看成一串连续的静态姿势片段。事实上,动作的描述可以选取若干典型的“静态姿势片段”来表达,每个姿势片段对应着与之相关的骨骼跟踪部位的相对位置。
我们以左手向右“划动”为例,该动作可以分解为三个典型的静态姿势片段,
片段一:
Z轴:左手在左肩的前方
Y轴:左手的高度介于肩部和臀部之间
X轴:左手在左肩的左侧
片段二:
Z轴:左手在左肩的前方
Y轴:左手的高度介于肩部和臀部之间
X轴:左手在左右肩部之间
片段三:
Z轴:左手在左肩的前方
Y轴:左手的高度介于肩部和臀部之间
X轴:左手在臀部中央位置的右侧
我们对三个姿势片段进行匹配,当三个片段都识别时,成功识别动作。
在这节中,将介绍中间件的界面设计及使用步骤,并且挑选一款适合用体感方式进行交互的游戏,将其交互方式转换成体感交互。
中间件的界面由两部分组成,包含创建映射集及模拟测试两部分。利用创建映射集部分完成传统交互事件与用户动作行为之间的关联映射:用户需要动作库中选择动作作为输入,从传统交互事件中选择事件作为输出。该步骤形成一个映射关系,重复该步骤直至所获得映射关系满足目标应用的体感交互需求,所有映射关系组成映射集。利用模拟测试部分实时进行体感化操作游戏:用户可以利用Kienct实时采集自身的人体动作,并与动作库中的动作进行匹配以获取该体感动作的所属动作类别,根据映射集中的映射关系,获取并激发所述动作类别所对应的传统交互事件。
创建映射集界面分为两部分,如图5所示。右框的功能是创建映射,需要对映射进行命名,从动作库中选择动作输入,从传统交互事件中选择事件输出,并实现了添加、删除及修改的功能。左框是映射列表,用于实时反映映射集中存在的映射,选中映射后,右框会自动显示该映射的具体信息,当映射集构建完成后,可以存储为XML文件,并实现了载入XML文件功能便于再次修改映射集。
图5 中间件创建映射集界面
模拟测试界面分为三部分,如图6所示。左上方部分用于读取XML文件,并显示映射集内容,开始模拟和停止模拟按钮分别用来控制Kinect的启动与关闭。同时也对应着识别输出实时列表及图像显示两部分的工作与停止。左下方为识别输出实时列表,用于实时反映Kinect的连接状态、Kinect视野中对人体目标的追踪状态及识别到人体的动作与输出的键盘事件。右方是图像显示模块,根据Kinect SDK提供的5种图像数据源:彩色图像、骨骼图像、深度图像、红外图像和颜色图像。本文的动作识别及动作定义是基于人体的25个关节点实现的,所以默认的图像显示为骨骼图像。
图6 中间件模拟测试界面
本文选用一款名为极速变色龙的手机游戏作为本文体感化的目标游戏,极速变色龙(Chameleon Run)是由著名游戏开发商Noodlecake Studios推出的创意跑酷类游戏。该游戏采用横版风格的设计,核心玩法是:游戏人物(以下简称 “小人”)不停地在紫红色或黄色横柱上奔跑,遇到鸿沟要及时跨越,并要做到每次小人跨越鸿沟再次落在横柱上时,小人的颜色要与落脚的横柱颜色保持一致。通过单次点击手机屏幕左半部分可以进行小人颜色切换(紫红色或黄色),通过单次点击屏幕右侧可以进行小人近距离跳跃,双击屏幕右侧可进行腾空时的再次跳跃,长触手机右半屏幕可以实现远距离超级跳跃。通过手机模拟器(Nox)来模拟手机游戏中手指的触摸点击行为,手机交互与键盘交互的映射关系如表1所示。
表1 传统交互与键盘映射关系
通过简易体感交互中间件对动作进行描述,并映射成相应的键盘事件,如表2所示。
表2 传统交互方式与体感交互方式的映射关系
当有用户站在Kinect前并做出一定的动作时,Kinect会识别按照预设的阈值定义好的动作,将该动作作为输入指令,系统会触发相应的键盘事件。
本实验选用15人,每人每个动作做出5次,这样的到一个15×5×4的样本,样本识别率统计如表3所示。
表3 样本识别率统计
经过分析验证,系统总体识别率较高,特别是对于一些简单的静态姿势识别率较高,但对于一些稍复杂的动态动作识别率还有待提升。这证明第3节的动作
定义描述规则可以较好地完成动作的定义,结合模板匹配法可以满足用户的体感交互动作识别的需求。该验证说明本文提出的解决方案可以成功将传统交互游戏的交互方式转换成体感交互,提升了游戏的沉浸感和体验感,有效地丰富了体感游戏的游戏内容。
本文提出一种基于深度相机Kinect的体感交互开发中间件。采用Kinect v2硬件,基于Windows 10操作系统和Visual Studio 2013开发环境中的WPF平台,开发体感交互中间软件。并以此为桥梁,将原本基于键盘鼠标等操作的传统交互游戏实现体感化操作,将实时采集的用户动作和行为和传统交互事件映射起来。本文利用Kinect深度相机获取人体骨骼信息,基于三种描述对动作进行定义,计算不同骨骼和关节之间相对位置、相对角度和静态姿态快照动作匹配来对动作进行描述,建立动作识别模板库。针对一款具体的游戏,设计出一套完整的解决方案,丰富了体感游戏内容。
本文通过硬编码的方式对动作进行描述定义,虽然系统对于描述出的静态姿势具有较高的识别率,但是对于一些稍复杂的动态姿势,识别率还有待提升。
[1] 陈建军.基于Kinect手势识别的网页控制软件设计[D].太原理工大学,2015.
[2] 邓頔,华泽玺.基于Kinect的体感电子相册的设计与实现[J].现代计算机(普及版),2013(5):54-58.
[3] 陈滨,时岩.基于Kinect的体感虚拟鼠标研究与开发[J].软件,2016,37(2):46-49.
[4] 陈静.基于Kinect的手势识别技术及其在教学中的应用[D].上海交通大学,2013.
[5] 张贵.体感交互及其游戏的设计与开发[D].华南理工大学,2014.
[6] Suma E A,Lange B,Rizzo A,et al.FAAST:The Flexible Action and Articulated Skeleton Toolkit[C]//Virtual Reality Conference.IEEE,2011:247-248.
[7] 谷颖.基于体感交互的GIS交互模式与中间件研究[D].南京师范大学,2012.
[8] 王瑶,项鹏,孟春阳,等.新一代Kinect传感器关键技术综述[J].黑龙江科技信息,2015(24):84-86.