李晋芳, 蔡嘉鸿, 谭 静, 蔡小娜, 李二芳, 李志成
(1.广东工业大学 机电工程学院,广州 510006; 2.河南理工大学 医院,河南 焦作 454150)
随着康复医疗的不断发展,虚拟现实(Virtual Reality,VR)技术应用于康复医疗行业已经越来越常见。现阶段康复训练的方式结合VR技术,可以设计各种的康复训练系统[1-2]。在康复训练系统中,患者的运动数据可以被传感器所捕获,并传输到计算机中,患者可以与计算机中的虚拟场景进行交互操作,提高康复训练水平[2]。随着康复医疗的不断发展,患者对康复质量的要求也不断提高。同时,患者对康复训练的需求也不断增大[3]。但如果康复训练系统中的虚拟场景是固定的,并且是有限的,患者在不同阶段的康复需求很难被满足,其康复效率也会大打折扣;同时,患者在同一个虚拟场景中重复进行康复训练,会降低积极性,影响治疗效果[4]。因此,对康复系统中动态的建立虚拟场景很有必要[5]。
康复训练是指以患者的意愿为出发点,让患者有目的性地参与康复训练。相比于传统的被动康复治疗,让治疗方式更加新颖和灵活[6-7]。通过各种不同的传感器,人体的关节运动信息可以被捕获并记录下来。Yeh等[8]设计了一种交互式VR游戏康复方案以及一种基于传感器的检测系统对平衡训练中的平衡指标进行分析;Borrego[9]等设计实验,让参与者在虚拟康复训练系统中的不同高度区域内通过导航完成一项搜索任务,发现较高的区域中系统的性能更好;Yeh等[10]开发了一种触觉增强的虚拟康复系统,来模拟触觉按压任务,协助脑部受伤患者上肢精细运动等功能锻炼;Stefano等[11]为中风患者的意识康复研发了一个更注重患者生理、心理状况的虚拟康复系统;柏敏等[12]通过调查传统康复训练系统以及虚拟康复训练系统对脑卒中患者的康复效果,发现虚拟康复系统能更有效的提高训练效果,缩短康复周期;郭晓辉等[13]研究了用于下肢康复的虚拟康复训练系统,能辅助患者完成主、被动情形下的康复训练;肖阳等[14]利用VR技术设计了一套手功能的康复评估训练系统。Belinda等[15]开发的适用于脊柱损伤患者的康复游戏,并实现实时跟踪。但是,目前的康复系统在虚拟场景的设计上比较单一,缺乏个性化治疗的方案,不能满足不同情况患者的康复需求。鉴于此,本文通过使用Kinect传感器采集人体骨骼数据,加载可扩展标记语言(Extensible Markup Language, XML)中的场景元素,建立虚拟场景,对虚拟康复训练场景进行动态配置,建立了个性化的康复训练虚拟场景。
本文主要针对现有康复训练系统中,一般是建立多个不同的虚拟场景,但场景有限且不能变化,设计了用户可以根据需求选择其中的场景元素进行场景个性化构建,如图1所示。其整体设计应满足如下需求:
(1) 基于康复训练需要进行交互操作的需求,在虚拟康复训练系统中应实时采集患者的肢体运动数据,并将数据输入到虚拟场景。
(2) 为增强场景的灵活性,减少固定场景的工作量以及提高场景元素的利用率,对场景中的元素进行个性化标记。
(3) 建立动态场景,可以加强虚拟场景的新颖性,提高患者积极性。
(4) 有较强的沉浸感;为使患者恢复患病位置的功能,并能应用于实际生活中,建立的虚拟场景应具有较好的现实性。
本文通过Kinect传感器采集患者肢体数据,并动态构建虚拟场景,对于同一种场景元素,可以重复加载,降低建立虚拟场景的工作量,提高了场景元素的利用率,也提高了灵活性,如图1(b)所示。
(a) 静态虚拟场景
(b) 动态虚拟场景
图1 虚拟场景
在主动式康复训练过程中,人体关节信号作为驱动的信号源,并输入到计算机中,作为与虚拟场景交互的基础。本文将使用 Kinect传感器,该传感器是基于深度图像采集人体的骨骼数据,可以满足康复训练过程中对患者肢体运动信号采集的要求。Kinect获取到的人体关节数据,需要传输到场景中的虚拟对象,虚拟对象会做出与患者同步的姿势动作。患者可以通过虚拟对象与虚拟场景进行交互,其中使用Kinect传感器采集患者信息,然后再与虚拟场景中的人物建立联系,从而场景进行交互。
当人体的关节数据获取后,该数据用于驱动虚拟对象的运动。虚拟对象的运动中,由于各人体关节点的位置是相对不确定的,因此,需要把获取到的人体关节角度数据转换成虚拟对象的关节角度信息,实现虚拟对象关节点的旋转运动,同步虚拟对象。
通过捕获人体骨骼点,可以计算出由3个点决定的任意两个向量之间的夹角。如图2所示,假设图中包含了人体的肩关节点、肘关节点和手关节点,分别记为S(Sx,Sy,Sz),E(Ex,Ey,Ez)和H(Hx,Hy,Hz),并把3个关节点在空间坐标系中表示。对于肘关节角度的计算,可以直接使用空间向量ES和EH的夹角θ。
图2 关节角度示意图
通过计算可以得出肘关节的角度值θ,并把该值传入虚拟对象中,实现关节的旋转运动。实现虚拟对象旋转运动的方式一般有3种:矩阵旋转、欧拉角旋转或4元数旋转。通过对比,由于矩阵旋转的方法计算信息量大无法满足虚拟康复训练系统的要求;欧拉旋转的方法容易产生万向节锁的问题;因此本文选择4元数的旋转方式实现虚拟对象的同步运动。描述一个4元数需要一个实数w和3个虚数i、j、k:
Q=ix+jy+kz+w=(i,j,k,w)
(1)
4元数具有以下的基本性质:
ij=k,jk=i,ki=j,ji=-k,kj=-i,ik=-j,
i2=-1,j2=-1,k2=-1
(2)
其中3个虚部i、j、k为在3个直角坐标系的3个矢量。在3维空间中处理物体的旋转问题,需要使用4元数的代数乘法。例如,当物体绕l旋转轴旋转θ角度,可表示为旋转矩阵rot(l,θ),用4元数表示:
rot(l,θ)=cos(θ/2)+l·sin(θ/2)
(3)
若先绕k轴,在绕j轴分别旋转 90°,用四元数表示为
(cos45°+jsin45°)(cos45°+ksin45°)=
1/2+j/2+k/2+i/2=
(4)
式(4)的合成运动为绕着3个基本矢量旋转120°,相比矩阵旋转和欧拉角旋转,四元数旋转更简单,也不会出现万向节锁的问题。
本文选取 Unity3D 自带的虚拟对象作为人物模型,该模型的层次结构包含人体骨骼点,通过对虚拟对象进行骨骼绑定,将Kinect传感器的数据(人体的关节旋转信息)就可以实时传输到虚拟对象中,人体也可以实时驱动虚拟对象的运动,下面进行对虚拟对象的上肢运动模拟实验如图3所示。
(a) 人体平举动作
(c) 人体上肢前举动作
图3(a)、(c)为人体在现实环境中做出的上肢动作,图3(b)、(d)为虚拟对象进行上肢运动的模拟。由模拟实验得知,通过采集人体数据虚拟对象可以同步与人体的动作,满足实时性需求。
患者的情况有多种,根据患者的特征可以进行区分,例如根据年龄、性别、职业、爱好等,将这些特征记为患者的区分特征,分别记作为F1,F2,…,Fn;对指定的特征,例如对于年龄,可以将其分成3类,对于性别,可以分成2类。因此某一特定特征的分类可以用S1,S2,…,Sn来表示。
患者在配置好的个性化虚拟场景进行康复训练,虚拟场景中主要包括两种元素。一种是患者与场景交互的物体,另一种是环境。当患者训练结束后,患者可以根据自己的训练情况需要和配置好的场景的满意程度,选择是否需要存储本次配置完成的场景。如果患者不选择存储场景,下次训练时可以选择继续配置场景。当患者选择保存配置好的场景,则该场景就在系统中自动生成XML文件,该文件记录了配置好的场景的相关信息,是属于患者的个性化场景。当下次训练开始时,患者不需要再次配置场景,并直接选择自己的个性化XML文本,在生成的场景中进行康复训练。个性化场景配置的流程图如图4所示。
图4 配置流程图
由于康复训练场景包含较多场景元素信息,为了方便编辑和修改,要求记录康复训练场景的文件满足可读性强的特点,一种可行的技术方案是使用XML文件对康复训练场景的相关信息进行存储。
XML[16]是“可扩展标记语言”,在常用的设计中,XML语言广泛用于存储大量的数据,其数据内容可以用于传输。XML语言可用于不同的数据类型,最常用的功能是记录数据。XML文本通过树形结构,把所记录的数据之间的层次关系清楚呈现,方便用户查看。本文使用XML文档记录虚拟场景信息,具有数据传输和文本管理的优点。
在定义XML文本时,需要对XML文本的存储格式作规定。程序运行时,当读取到指定的标签,就获取指定的场景元素的相关属性和信息,并把读取到的信息放到内存中创建好的结构体中,实现XML文本中的信息的输出。
在虚拟场景中,包含的场景元素较多,记录了所有场景元素的信息。因此,必须标记相应的场景信息,规范文本的标签,包括场景元素的名称、放置路径、在虚拟场景中的空间位置、材质等,其具体解析见表1。
表1 XML文本标记解析
在康复系统中,通过XML文档存储虚拟场景模板和配置好的个性化虚拟场景。用XML文档记录信息有两种方法,一种是通过手动输入记录,另一种是通过系统自动生成。从系统的角度出发,自动生成虚拟场景对应的XML文本信息,更能满足需求,其生成XML文本的流程图如图5所示。
图5 生成XML文本流程图
由于康复患者以老年人居多,因此本文以老年人为对象,结合沉浸感、现实性等设计原则,建立以家居环境为主的虚拟场景,如图6(a)所示。在虚拟场景中需要建立好相关场景元素,包括模型、材质等。把所有建立好的场景元素都放在一个父对象scene下,其场景元素关系示意图如图6(b)所示。
(a) 虚拟场景
(b) 场景元素
在本文中,以Unity3D为开发平台,结合本文研究的课题和实际需要,编写程序以实现对XML文本的解析。
本部分的研究内容是对康复训练场景的动态配置,通过动态加载的方式实现虚拟场景的加载。因此在解析个性化虚拟场景的XML文本时,建立的解析算法要与上述定义XML文本的标记相对应。这样,当程序运行时,可以存储场景元素的相关信息。如名字、标签等并在后续的加载过程中进行读取,其流程图如图7所示。
图7 解析XML文本流程图
例如在图6(b)中,根据上述XML文本的标记定义,通过标识“scene”,可以读取到XML文本的根节点,从而定位XML文本。根节点下面都是以“object”为标识的子节点,每一个子节点代表的是一个场景元素。通过读取子节点object中的属性,就可以获得场景元素的全部属性,把每一个读取的属性保存在结构体中,最后完成对虚拟场景XML文本的解析。
通过对存储个性化虚拟场景信息的XML文本解析,场景元素的属性、材质等内容都已经被读取和存储起来。下一步需要通过对读取的信息进行虚拟场景的动态加载。在虚拟场景中,包含了多种场景元素,场景元素的可以在Unity3D引擎加载,其主要的加载方式有3种。
(1) 通过Resources. Load方法加载。在Unity3D引擎中,其资源界面存在一个文件夹,其名称为Resources。如果使用Resources. Load方法对资源进行下载,其资源必须转化为预设体,并存放在Resources文件夹中。使用该方法加载时,Unity3D会默认在Resources文件的路径中进行资源的读取和加载。
(2) 通过AssetBunde的形式加载。AssetBundle是Unity引擎中提供的一种用于存储外部资源的文件格式,它可以存储任意一种Unity引擎能够识别的资源。资源打包完成后,通过WWW请求方式对资源进行下载,资源下载后,就可以把资源加载到Unity3D引擎中。
(3) 通过AssetDatebase.loadasset方法加载。该方法主要面向的是Unity3D的开发人员,并只能在Unity3D的编辑界面中应用。
以上是Unity3D引擎中的3种资源加载方式,对于第1种加载方法,由于只能把资源放在指定位置,灵活性不够,并且发布成“.exe”文件后,场景元素库是不能改变的,从系统的角度出发,场景元素应该可以增加和删减的,因此该方法不采用。第3种加载方式有一定的局限性,适用的范围有限。对于第2种资源加载方式,由于其资源可以放置在不同路径,且场景元素库也可以实现增加和删减,实现虚拟场景动态配置。因此,选择第2种加载方式,AssetBunde 方法的加载流程图如图8所示。
图8 资源加载流程图
动态加载完成训练场景的模板后,可以改变场景元素的属性,例如通过改变模型的位置和方向,复制、粘贴、和删除场景中的模型,也可以通过选定模型,改变其材质,形成不同场景风格。当场景的配置完成,可以保存当前场景,生成XML文件,该场景的XML文件为患者配置的个性化场景,通过控制面板的方法完成上述操作,如图9所示。
图9 控制面板
图9(a)控制面板中的参数可以调节场景中所选物体的平移和旋转,图9(b)控制面板中的参数可以对场景中的元素进行常规如复制、粘贴、等一些操作,还可以对元素材质进行更换。点击“Save”按钮,可以生成配置好的场景的XML文件。
通过以上对数据采集输入虚拟场景和场景动态个性化配置的研究,以图6(a)的场景为例,图10(a)为实验的真实环境,(b)实现Kinect捕捉人体实际数据与虚拟场景的结合实现抓取动作,图10(c)~(f)实现虚拟场景的个性化设计配置。
(a) 真实场景
(c) 桌子动态配置前
(e) 材质动态配置前
本文研究虚拟康复训练场景的建立,在Kinect传感器数据采集的基础上提出一种建立个性化虚拟场景的方法。该方法可以满足不同患者的康复需求,通过
以XML文档存储康复训练虚拟场景的场景元素,直接建立虚拟场景并可以进行灵活配置。虚拟场景的个性化配置可以满足不同患者的需求,提高其康复积极性,患者与场景的多种交互方式,有利于提高康复效率。