赵欣仪,胡延平
(大连理工大学机械工程学院,辽宁大连 116033)
随着虚拟现实技术的发展,为实现更好的沉浸感和真实感,人机交互的数据输入逐渐从鼠标、键盘转向了基于光学的体感设备。在与虚拟物体进行交互时,选择高效合理的抓取规则及交互手势是保证用户使用感受的关键。
国内外学者对虚拟手操作技术进行了大量的研究。曾芬芳等[1]使用数据手套得到实时反馈数据,并对虚拟环境下物体进行抓取及释放等操作。张田田等[2-3]的研究针对不同形状的物体设计不同的手势操纵方式。李志华和钟毅芳等[4]的研究主要是将手势按层次建模并得到手部模型,定义合理的抓取规则完成交互。Iberall等[5]定义了用于组成复杂手势的三种基本抓取手势,对其进行组合从而得到合适的抓取方法。另一方面的操纵研究则从受力入手,刘杰等[6]提出了用力抓和精确抓两种抓取方式,对不同形状的物体采用不同的方法,提高抓取的准确性。胡海鹰等[7]采用力学分析的方式,通过计算力矩平衡来判断是否实现抓取。胡弘等[8]使用Leap Motion对手部的姿态进行估计,完成抓取。可以发现早期的研究多采用数据手套进行数据采集和反馈,沉浸感和真实感较差,而一些应用LeapMotion的抓取常出现误抓以及穿透的现象。
为解决这些问题,本文采用光学体感设备Leap Motion采集双手数据,设计基于碰撞包围盒的手势抓取规则和虚拟交互手势,对虚拟物体进行选定并对其进行移动、旋转等操作,最后在Unity3D 搭建的环境中验证本文的研究,结果表明:操作者在操纵物体时具有较高的沉浸感,可以高效准确地完成设定操作,避免了手指穿透以及误抓的现象。
人手是一个由8块腕骨、5块掌骨以及14块指骨组成的多肢节系统,各骨节具有移动或者旋转自由度并由关节连接。结合实际的人手操作,提取手掌坐标、各个手指尖端的坐标、手掌法向方向以及手指尖端的方向等数据[9]。
Leap Motion 是一种基于双目立体视觉原理对人手进行定位和信息采集的光学传感器。当进行人机交互时,首先采用摄像头采集人手的数据信息,在虚拟环境中得到手模型,最终操纵物体在较短响应时间内完成高精度的操作[10]。
Leap Motion内部封装了大量的API,通过调用即可获取相关数据[11]。但在一些简单函数的调用无法保证虚拟环境下物体操纵的精确度和真实感,本文提供了基于碰撞检测的抓取判定规则以及虚拟操纵手势,实现交互。使用时需要的手部数据如表1所示。
表1 Leap Motion捕捉的手部数据
有限状态机,又可以叫做有限状态自动机,是用于表示有限个状态以及状态间的转换和动作的数学模型。本文采用这种方法使手势抓取过程中的多种状态间的转换关系变得更加易读。分析发现,虚拟手和物体间的交互主要分为4个不同的状态,各个状态构成的有限状态机如图1所示。各状态的特点如下,对应的示意图如图2所示。
图1 虚拟手抓取有限状态机
图2 虚拟手抓取过程
(1)RELEASED
当处于RELEASED 阶段时,虚拟手和任意一个物体都没有发生碰撞。
(2)GRABBING
当处于GRABBING 阶段时,虚拟手和某个物体发生了接触碰撞,但是这种手势交互并未满足抓取规则。如果想要和物体进行抓取交互,则需要不断地调整手势,直到满足抓取规则。
(3)GRABBED
当处于GRABBED 状态时,虚拟手已经对物体实现了抓取,物体被选定为待操作对象,此时操作另一只手并进行手势识别,实现对物体的操纵。
(4)RELEASING
当处于RELEASING阶段时,虚拟手处于即将释放物体的阶段。改变虚拟手姿态,使其不再满足抓取规则,物体即解除被选定的状态,受到重力回落到桌面上,虚拟手回到RELEASED状态。
Leap Motion 内部封装的抓取规则规定当虚拟手和物体间的距离小于设定的阈值时,虚拟手就实现对物体的抓取[12]。但是这种规则极易产生手指穿透以及误抓的情况,并且不符合现实生活中的抓取习惯。因此,为保证抓取过程的沉浸感和抓取结果的准确性,采用一种基于物体表面包围盒碰撞检测的抓取规则,定义如下。
规则一:虚拟手和虚拟物体包围盒有3个或3个以上的接触点,并且其中至少有3个点不在同一个平面内;
规则二:连接接触点和物体包围盒中心得到3 个向量(以3个接触点为例),求得3个向量的两两夹角,这些夹角中至少有一个大于角度阈值(本文设定为90h)。
如图3所示,以3个接触点的抓取手势为例,虚拟手和物体包围盒接触的3 点分别位于两个平面上,满足规则一。在满足规则一的基础上,判定是否符合规则二。物体中心到接触点确定的矢量分别为 N1,N2和 N3,其中 N1和N3间的夹角θ13的值大于90h,满足规则二,抓取动作符合抓取规则实现抓取,同时也符合实际生活中的抓取习惯。
采用这种抓取规则有以下优点。
(1)较高的鲁棒性。此规则可应用于不同形状的物体,并且可以根据不同的表面摩擦因数,调整抓取条件的阈值,具有较高的鲁棒性。
(2)抓取的真实感。规则符合真实世界中的抓取操作习惯,抓取过程中实时检测手指与包围盒碰撞情况,避免了手指和物体间的穿透现象。
(3)较高的抓取效率。在操作时,涉及大量抓取和抓取释放的判断,会增加操作的时间成本。本文的判定规则分为两步,如果不符合规则一则不会对规则二进行判断,大大减少了计算时间。
图3 虚拟手抓取示例
通过上一节中的研究可知,使用左手进行抓取时,采用规则判定可以选定待操作的物体。选定后就可以通过右手手势识别控制物体的移动、旋转以及缩放等交互动作。在操作时,需要实时传递真实人手的数据,并进行判断。本文中设计了左右手不同的手势判断条件,驱动虚拟手进行相应动作。结合设计要求定义了几个常用动作,整理如下。
(1)抓取手势——物体选择
通过基于HandController的碰撞检测以及抓取判断选定待操纵物体。当选定操作对象后,通过左右手进行操作,直至改变抓取手势,取消对物体的选定。
(2)手势判断——手部位置
当左手和物体保持抓取状态时,可以使用左手改变物体的空间位置。当手上下平移时,物体Y 轴坐标值改变。左右平移时,Z 轴坐标值改变。当手前后移动时,X 向坐标值改变,通过坐标值的改变,实现物体移动。
(3)手势判断——旋转手势
Leap Motion 传感器可以得到手部的空间位置信息,构造函数判断右手的移动方向,通过移动方向控制物体绕自身中心轴旋转的操作,手势以及旋转的对应关系如表2所示。
表2 手势与旋转的对应关系
以x轴正向的移动为例,判断手势移动的条件如下:
hand.PalmVelocity.x >deltaVelocity&&
hand.PalmVelocity.Magnitude>smallestVelocity 式 中 , deltaVelocity为手掌在x 方向上的移动速度阈值,smallVelocity为各方向速度平方和阈值。
(4)手势判断——物体缩小
虚拟环境下的物体有时需要进行缩放操作,本文设计通过右手握拳和手掌张开的动作来分别控制已选定物体的缩小和放大。握拳手势判定过程如下:遍历各个手指指尖的坐标位置finger.TipPosition,并计算各手指到掌心坐标hand.position的距离,比较此距离和阈值的大小。当小于阈值delta的手指数为5时,判定手势为握拳。判定代码如下:
(finger.TipPosition-hand.PalmPosition).
Magnitude<delta
其中,delta为指尖到手掌中心距离的阈值。
(5)手势判断——物体放大
手掌是否张开则通过Leap Motion的参数GrabStrength来判断,GrabStrength 为0 时表示手掌张开,此时物体会被放大。判定代码如下:
hand.GrabStrength==0
基于上述的研究内容,设计了虚拟环境下虚拟手操作实验。实验以Leap Motion 体感控制器为输入设备,Unity2018.2.7f1作为软件开发工具,搭建软件硬件平台。Unity内部脚本采用VisualStudio2015作为集成开发环境,以C#语言进行编写。
在虚拟环境下导入建立好的物体模型,验证研究的可行。首先采用不同的抓取手势,验证抓取规则的准确性和鲁棒性。导入虚拟物体后搭建好的虚拟环境如图4所示。
图4 虚拟场景示意图
图5 物体抓取操纵
图5 所示为采用本文抓取规则后虚拟手的抓取示意图。当抓取手势满足制定的两个规则时,即判定左手抓取物体,同时将被抓取对象作为操作对象,对其进行后续的操作。在此过程中,物体和虚拟手不会发生干涉的情况,实现了真实且良好的交互。
图6 所示为抓取后物体随左手移动操作的演示图。抓取并选定后,通过左手的移动实现虚拟物体的位置变化。
图6 物体随动操作
图7 所示为使用右手对虚拟环境中物体进行旋转操作的示意图,这里以立方块物体绕x轴的操作为例。通过右手的位置变换,操纵物体的旋转。左手抓取物体后,右手在x轴方向上产生位移变化,物体会相应地绕x轴进行旋转。
图7 物体旋转操作
图8 所示为物体缩放示意图。当右手握拳时,左手中物体会缩小,虽然此时物体与虚拟手已经脱离,但是脚本保证在抓取并选定物体后,如果左手手势未变化,则保持GRABBED状态不变。同理,当右手五指张开伸展时,物体会相应放大。
图8 物体缩放操作
本文通过分析虚拟环境下的虚拟手操纵需求,使用Leap Motion 传输徒手数据,设计抓取规则以及交互手势,在Unity3D 搭建的虚拟环境下进行左右手操作,实现对物体模型的抓取、操纵以及释放。
实验结果表明,采用的设计规则和手势可以有效地避免手指穿透现象,大大地降低了误抓的可能,具有较高的操作沉浸感和真实感。同时,设计的抓取规则可以适用于各种形状的物体,提高了操作的鲁棒性,为基于Leap Motion 的人机交互技术提供了更多参考。