孔若思,姚寿文,王 瑀,兰泽令
(北京理工大学 机械与车辆学院, 北京 100081)
随着计算机设备和互联网的快速发展,媒体、设备与人之间交互的方式不再受限于鼠标、键盘和触摸控件。常规的交互方式难以全方面地满足人们不断增长的个人需求,因而出现了很多非接触式的交互控制方式,如眼动、手势、语音和脑电等。而在众多的非接触式交互控制方式中,手势动作因其灵活多变的形式、信息丰富等特点,常常作为人体同外部世界沟通的工具用在人机交互上[1]。
与传统的制造模式相比,现代制造业依靠各种先进技术正不断地朝着敏捷化、网络化和虚拟化的方向发展[2]。虚拟装配技术作为虚拟现实技术的一种典型而广泛地应用在制造业当中。虚拟装配技术以产品的装配设计为出发点,通过虚拟现实技术创建了一个由触觉、视觉和听觉构成的多模式的虚拟交互环境,通过人机交互的模式进行产品的拆卸和装配,对装配产品的功能进行检测和评价,从而制定出实用、经济和合理的装配方案[3]。
为了在虚拟装配环境中实现自然交互,要使用适当的传感器来跟踪手部的运动,以消除手持设备或者可穿戴设备对身体运动的阻碍,提升手工装配操作的仿真精度。Leap Motion(以下简称LM)作为一种基于双目视觉原理的手部追踪传感器,具有便携、轻巧、高帧频和非接触等特点,能够更好的追踪手部动作,常用于手势交互虚拟装配[4]。
在虚拟装配中,通常只在单个LM上收集手部数据并识别手势,执行手势操作。但在单个LM中,手势追踪范围小,且存在噪声影响的问题,最典型的便是手势的遮挡和混淆问题[5],不能满足大范围虚拟装配需求。为了克服使用单个LM的缺点和局限性,使用多个LM传感器是一个很好的选择。Tianjian等[6]为了扩大人体运动传感器的灵敏度空间,以模拟正常人工作空间范围,将5个LM传感器和5个平板电脑集成在一个可移动的感知平台上,执行基于卡尔曼和粒子滤波的姿态估计,从5个单次估计的数据融合中获得了一个最优的手姿态估计。沈赫[7]用基于多LM的低成本3D传感器来实现对现场工人装配动作的六维(位置+姿态)运动轨迹跟踪,并通过多传感器数据融合以解决单一传感器在运动轨迹跟踪过程中的遮挡问题,同时提高了对装配动作在目标视野范围内的跟踪精度。唐春晓等[8]开发了使用多个LM对人手数据采集的控制系统,首先执行人手数据的采集并转换相应的坐标,然后基于数据融合技术得出完备的人手信息,最后利用SVM(support vector machine)分类器识别手势。王天行等[9]提出了一个通过多LM手势识别工作空间的创新设计方法,基于规则和SVM的分类完成对遥控手势库的设计。多LM系统解决了单LM因干扰或者不可避免的覆盖致使手势姿态信息数据模糊的问题。范烨博[10]基于局域网协同技术,利用LM作为主要硬件设备,对采煤设备进行多人协同手势控制的虚拟装配,实现了多人手势协同控制。李泽玲[11]开发了基于手势的机器人自然人机交互系统,使用6台LM传感器,由6个独立的客户端程序根据服务器指示经局域网发送手势数据。实现了固定自然手势动作对机器人的远程控制,提高了人机交互效率。
在多LM系统中,数据均需要融合和局域网传输,局域网传输的速度与数据量的大小直接相关。在面向实验室的多LM系统中,局域网传输速度对于性能影响较小,而在面向应用的多LM系统中,随着LM数量和对实时性要求的增加,局域网传输的压力也随之增加。多LM融合虽显著扩展手部运动追踪区域,可满足沉浸式虚拟环境中的手部交互要求,然而LM数据结构复杂,既包含来自于传感器的追踪数据(简称追踪数据),也包含基于追踪数据的推测数据(简称推测数据),给基于局域网数据互传的多LM数据融合架构带来极大的网络带宽负担与数据解析压力,影响了手势精度和实时性。因此,提出一种面向大范围手势捕捉LM融合的手部运动数据结构体优化的总体方案。首先区分追踪数据和推测数据,然后建立数据优化模型,计算数据权重,并对权重低的推测数据进行优化,从而实现LM数据结构体的简化,减轻数据冗杂带来的传输压力。优化后的数据结构体能够完成交互需求,满足实时、准确获得手部运动状态,提升装配效果,为复杂结构的可装配性设计提供关键的手势模型。
LM传感器是一款基于双目视觉的三维图像识别技术的体感控制器。LM视场呈倒金字塔形,金字塔的塔尖是LM的中心,工作范围在设备正前方的25~600 mm,视角大约为150°[12],如图1所示。根据传感器工作的原理,人手应尽量放置在一个固定的角度范围内。在这个区域之中,传感器的跟踪效果最佳,得到手的姿态更加清晰正确。若手掌向两侧旋转,传感器检测效果会降低。若手掌超出了这个视角范围,传感器将因人手被遮挡而难以获得手部信息。
图1 单个LM捕捉范围XY平面示意图
LM 捕捉的数据形式为帧(frame),每一帧中包含了基本追踪的数据列表,列表中包含的捕捉实体如表1所示。
表1 帧的追踪数据
当这些实体被检测到时,LM的应用程序软件会为这个物体分配一个唯一的ID指示符。这个ID指示符保持不变的条件就是此实体一直存在于可视范围当中。如果追踪实体离开了LM可视范围且再次出现时,LM会重新分配新的ID。
在LM的SDK(软件开发工具包)中,每帧包含Bone(骨骼)、Finger(手指)、Arm(手臂)和Hand(手)这4种数据结构,具体如下:
骨骼数据结构为:Bone(Vector prevJoint,Vector nextJoint,Vector center,Vector direction,float length,float width,Bone.BoneType type,LeapQuaternion rotation)。prevJoint、nextJoint、center分别表示骨骼的起点、终点和中点;direction表示骨骼从起点朝向终点的向量;length、width分别表示指节的长度和宽度;type表示骨骼的类型;rotation表示骨骼旋转。
手指数据结构为:Finger(long frameId,int handId,int fingerId,float timeVisible,Vector tipPosition,Vector direction,float width,float length,bool isExtended,FingerType type,Bone metacarpal,Bone proximal,Bone intermediate,Bone distal)。前3项分别为分配的帧id、手id和手指id;当前手指可见的时间长短用timeVisible表示;指尖的位置用tipPosition表示;指尖所指的方向用direction表示;当前手指的屈伸状态用isExtended表示;最后4项为每一个手指都包含的4个骨骼名字。
手臂的数据结构为:Arm(Vector elbow,Vector wrist,Vector center,Vector direction,float length,float width,LeapQuaternion rotation)。包含了手肘、手腕和手臂的属性,含义与上述属性类似。
手的数据结构为:Hand(long frameID,int id,float confidence,float grabStrength,float grabAngle,float pinchStrength,float pinchDistance,float palmWidth,bool isLeft,float timeVisible,Arm arm,List
Unity3D是一个多领域、多平台的3D游戏开发工具,广泛用于虚拟现实等领域的应用开发。LM可以直接和Unity3D联合进行开发,当LM捕捉到手后,Unity3D中会显示出相应的手部模型。由于Unity3D和LM的坐标系不同,在脚本中还需要进行坐标转换,才能进行数据打包发送。在本文中,主机端与LM连接,可以识别人手的姿态和运动状态。在交互过程中,只要手放置在交互空间内,LM即可自动识别手部并得到精确的手部位置和各参数数据。这部分数据将通过局域网络传输到客户端,客户端接收数据后,即在Unity3D环境下进行手部模型重建。系统示意图如图2所示。
图2 联合开发系统示意图
在1.2节介绍的数据传输过程中,LM把采集所得的数据直接传输给Unity3D。而这部分数据结构比较冗杂,既包含了采集所得的数据,也包含了一些通过基础数据推算得到的数据,这些采集数据在Unity3D中仍以帧的形式存在。因此,首先要对帧数据进行拆分,才能进行数据结构体的优化。数据拆分之后,将数据重组并进行坐标转换后,打包发送给Unity3D进行手部模型的重构。
1) 手部数据的拆分
数据拆分的含义是使帧中包含的数据结构表现出来,从而方便我们对其进行优化处理。根据1.1节对各数据结构的定义,可按骨骼、手指、手臂、手的顺序将帧数据一一拆分。图3为手部数据拆分程序的流程示意图。
图3 手部数据拆分程序流程框图
分析LM拆分后的数据结构体,根据数据类型,可以将其中的数据分为3类:位姿类,数据类型为vector,表达了骨骼点的位姿信息;参数类,数据类型为float,表达了如骨骼的长度、宽度等参数信息;其他类,类型有bool、type、LeapQuaternion等。
2) 手部数据组合
经过拆分处理的手部数据按顺序存放在数组里,遵循各数据结构的要求,且按照顺序将数据重组后进行坐标转换,打包发送给Unity3D,则实现了经过拆分和重组处理的数据对原有帧数据的替换。图4为手部数据重构程序的流程示意图。
2.1节中对数据进行了拆分,按照LM中定义的数据结构,这些数据里有一部分表达的含义是重复的,对于构造手模型没有贡献,反而使得数据变得冗杂;有的数据可以通过简单的代码计算得到,在传输过程中不是必要的。对这部分拆分后的数据进行优化处理,可以实现对LM采集数据的优化,减轻数据传输的压力,提高手势捕捉的实时性。
图4 手部数据重构程序流程框图
首先建立3类数据集合,分别引入3类权重,具体如下:
其中,j=bone,finger,arm,hand,分别表示不同的数据结构体。当j的值确定后,计算各类数据量如下:
以骨骼数据结构Bone数据为例:n1=4,n2=2,n3=2。位姿类数据的优序图权重计算如表2所示,其余类数据的计算同理。
表2 位姿类数据优序图权重
通过2.2节的权重分析,可以得知每个数据在当前类的权重值,则可以据此设计优化方案。数据结构体中有骨骼数据、手指数据、手臂数据和手数据,其中骨骼占的数据量远多于其他数据。骨骼数据结构体为:Bone(Vector prevJoint,Vector nextJoint,Vector center,Vector direction,float length,float width,Bone.BoneType type,LeapQuaternion rotation)。根据模型,选择优化位姿类和参数类数据中权重较低的center,direction,length,而其他类数据均表达了重要的信息,不能被优化。同理,可以优化手指结构体中的tipposition,direction;手臂结构体中的center,direction,length,width;手结构体中的direction。在拆分后的数据里优化以上数据后,将数据打包重组,为了交互功能的完整,必要时在重组数据里进行一些计算,如Bone类中的length可以通过骨骼的起点向量和终点向量计算得到。最终再通过实验验证是否满足交互要求。
优化后的数据结构体为:骨骼数据结构为Bone(Vector prevJoint,Vector nextJoint,float width,Bone.BoneType type,LeapQuaternion rotation)。手指数据结构为Finger(long frameId,int handId,int fingerId,float timeVisible,float width,float length,bool isExtended,FingerType type,Bone metacarpal,Bone proximal,Bone intermediate,Bone distal)。手臂的数据结构为Arm(Vector elbow,Vector wrist,LeapQuaternion rotation)。手的数据结构为Hand(long frameID,int id,float confidence,float grabStrength,float grabAngle,float pinchStrength,float pinchDistance,float palmWidth,bool isLeft,float timeVisible,Arm arm,List
重组手功能验证主要分为2个部分:
其一是重组手是否能够完整地表达手的运动状态,并重现手的姿态,如一些手势能否准确地呈现出来。此外,还要验证优化后得到的重组手与优化前的手的手势相比,是否提升了捕捉精度,是否提升了实时性。为了验证优化后的重组手模型能否精确呈现出手势动作,选取了4个典型手势,如图5所示。为了进一步对比优化前后的模型手功能,将优化的重组手和未优化的重组手与同一个真实值对比,观察运动过程中的实时性、跟随性、捕捉精度等。搭建了一个系统:同时使用3个LM,一个与主机端相连,作为真实值,另2个与不同的客户机相连,3个LM摆放的位置尽量接近,减少因摆放位置产生的误差,系统布局示意图如图6所示。主机端不采取任何优化方法,得到LM原始数据构造的手模型,编号为①;在一个客户机端采取优化方法,另一个不采取任何优化方法,得到的2个重组手都通过局域网传输到主机端上,分别为②③号手模型。主机端可以同时看到3个手模型,实验人员在捕捉范围内做手部运动,可以对比优化前后的模型手。
图5 选取的4个典型手势
图6 系统布局示意图
其二是重组手的交互功能,是否能够“悬停”在物体附近、是否能够对物体进行触碰,以及是否能够实现精确抓取。为验证这些功能,设计了2种场景。场景一设计了许多不同类型的交互对象,如图7所示。在这个场景的右侧是一些浮动的对象,当手在附近时,它们会发光,但它们只会接收悬停信息,无法被抓取。场景中的其他对象则既能感受悬停也能被抓取。在这个场景中,对不同的物体进行抓取、碰撞、悬停等动作,就可以判断重组手是否具有相应的交互功能。场景二设计了许多按钮和滑块,如图8所示,右侧的按钮只需要触碰即可按下,而左边和下方的滑块都需要做出“捏取”姿势才能进行滑动。通过对面板上按钮的按动和滑动,可以检测重组手的精度及抓取的准确性。
图7 场景1界面截图
图8 场景2界面截图
按2.3节中的优化方案对数据结构体优化后,进行重组手的功能验证。图9为优化后重组手的手势功能验证,可以看到每一个手势都准确表示,能反映手部状态和姿势。图10为3.1节所设计的方案中的3个LM系统得到的效果图。可以看出,手模型②对于手模型①的跟随效果较好,所呈现出的姿态也基本一致,而未经优化的手模型③由于有一定的延迟,所呈现出的手部姿态失真。这表明了优化后的手模型更加能反映手部运动的真实情况,且传输速度更快,延迟低,能满足大范围手势捕捉的应用要求。图11为利用场景一、场景二对优化后重组手的交互功能进行验证,可以看到重组手的交互功能完善,能够满足正常的交互需求。
图9 重组手的手势功能验证
图11 重组手的交互功能验证
通过建立数学模型,设计了优化方案,并经过实验验证,由此得到的重构手模型功能完整,既可以完整反映手的运动状态,迅速地呈现出相应的手势动作,也可以进行必需的交互。数据结构中每一个数据所占字节大小基本相同,观察优化前后的拆分程序,可以得出:一只手中,Bone数据有20组,每组由19个数据优化为12个数据;finger数据有5组,每组由14个数据优化为8个数据;arm数据为1组,从15个数据优化为7个数据,hand数据为1组,从32个数据优化为29个数据。而在拆分后的一帧数据中,共有4组手的数据。用优化后的数据量除以原有数据量,可以计算得到优化后数据量减少了36%。数据对比图如图12所示。
图12 优化后数据量和总数据量
局域网内信息传输的实体为数据[14],数据传输时,经过二次编码,模拟数据产生模拟信号,数字数据则产生数字信号。局域网内数据交互的实质是数据通信,可分为并行传输和串行传输2种方式。因此除去布线方式,硬件条件等外在因素,局域网传输的速度与数据量有着密不可分的关系。当数据量减少了36%时,网络传输的速度将得到大幅提升,网络带宽压力将大大减轻。
在实际运用中,为了扩大手部追踪范围,常采用多LM系统,而多LM系统数据冗杂的问题更为严重。将经过验证的数据优化方案运用到一个多LM系统中进行测试。这个系统由5个LM组成,系统的布局如图13所示。
图13 多LM系统布局
表3给出了这个系统的捕捉范围与官方给出的单个LM捕捉范围,水平跟踪范围扩大到202.16°,增加了34%,垂直跟踪范围扩大到164.43°,增加了37%。但是由于LM数量的增多,数据量也会成倍增加,数据量冗杂导致传输速度低的问题更为突出。将优化方法运用到这个系统中,实验人员在可捕捉范围内做出手势进行测试,如图14所示。出现的重叠的胶囊手由5个不同的LM捕捉得到,最终呈现融合后的手势效果。
表3 多LMC和单LMC捕捉范围
图14 系统测试效果图
使用优化数据结构的系统,由于每个LM的数据量减少了约36%,在带宽不变的情况下,系统在局域网内所需的传输时间更短,手势捕捉功能得到了大幅提升。因此,手的融合也可以在更短时间内完成,从图中也可以看到所呈现的融合效果很好。在实际应用中,传输时间更短,传输速度的提高可以满足实时性要求。经过测试,通过对数据结构体的优化,解决了多个LM数据冗杂的问题,缓解了传输的压力,能够更好地满足实际运用的需求。
为了实现大范围的手势捕捉,提升装配过程中操作人员的体验,多LM系统是必然的选择。而LM本身的数据结构体冗杂,在多LM系统中表现得更显著,多LM系统运用局域网进行数据传输,数据冗杂问题将影响系统的实时性、精度等。对于面向大范围手势捕捉的多LM系统手部运动数据结构体冗杂的问题进行了研究,提出了一个数学模型,设计了数据结构体的优化方案,能够满足交互需求,实现了数据量优化,最终数据量减少了36%。将优化的数据结构体运用到多LM系统中测试,显著提高了系统手势捕捉速度和精度,极大地缓解了网络传输带宽的压力,实现了大范围手势实时捕捉,满足了大范围手工产品装配的需求。