孙 军, 周志楠
(沈阳建筑大学机械工程学院, 辽宁沈阳 110168)
随着计算机软硬件技术的飞速发展, 运动捕捉设备已经进入了实用化阶段, 其技术成功地用于远程工业控制[1]、体育训练[2]、教学系统[3]、医疗康复[4]等许多方面,很多复杂的动作可以通过动作捕捉设备采集到。如今,Kinect、诺亦腾可以通过骨骼识别识别骨骼, 并通过通讯实现远程的人机互动。可以远程控制机械臂操作,可以通过采集到的数据建立操作教程系统,可以远程进行医疗诊断,现如今动作捕捉设备得到了广泛的应用。
本文采用两个动作捕捉设备, 人体运动数据系统可以实现对人体骨骼的数据的采集, 并且可以实时展示两个捕捉设备的人体运动数据, 也可以将人体数据存储至MySQL 库中。 系统可以对采集到的数据进行数据分析并可以将两者人体数据进行验证, 观察两个设备采集人体骨骼数据的差异。 通过采集到的数据可以对人的运动进行记录,建立数据库,为建立人机互动奠定基础。
本系统使用Visual Studio 开发平台进行人体运动数据采集系统的搭建, 捕捉人体运动数据的设备采用人体可穿戴采集设备Neuron 和Kinect,Neuron 获取所需的骨骼数据需通过算法将中间数据和BVH 数据转换为空间下的骨骼位置数据,而Kinect 则采用四元数、欧拉角对骨骼数据进行获取, 利用通讯协议MQTT 将获取到的骨骼数据传输进电脑,存储到MySQL 数据库中。 用C# 语言搭建界面,利用C++对Kincet、诺亦腾的算法进行编辑,采用Python 语言对每个模块进行整装, 完成人体运动数据的采集、展示、验证与分析。
根据人体运动数据采集系统架构从下到上依次为基础设施层、数据层、服务接口层、技术支撑层、应用层,见图1。①基础设施层:该层次为系统的基础层,主要包括采集人体数据的动作捕捉设备;②数据层:该层次是为系统提供人体骨骼数据的基础。包括采集到的人体骨骼位置数据、骨骼之间空间下的夹角;③服务接口层:该层次是连接各个设备的基础。 包括电脑Visual Studio 平台与诺亦腾、Kinect 的连接以及人机交互的接口;④技术支撑层:为实现系统功能提供保障,包括Kinect、诺亦腾的骨骼识别以及各个设备与平台的通讯接口;⑤功能应用层:通过调用系统框架中的各个实现功能的接口,实现包括数据采集、数据展示、数据验证、人机互动等功能。
图1 人体运动数据采集系统架构
本系统使用开发平台Visual Studio 搭建人体运动数据采集系统界面,首先我们建立C# 项目工程,创建一个窗体,建立WinManager 应用程序,选择工具箱里的控件组成完整的界面,并对界面进行设计,编辑文本,双击控件编辑后台C# 程序,完成各个功能之间的连通,这里我们通过C 接口完成对Kinect、Neuron 数据的获取。通过图2 的流程图, 我们可以了解到界面共分为七个模块分别为动捕系统、深度摄像头、数据采集、机器人仿真、实时数据显示、详细信息与项目工程。 ①动捕系统模块:该模块主要是使用Neuron 采集设备进行数据采集、 数据分析、实体回放、虚拟回放、人机互动等功能;②深度摄像头:该模块主要使用Kinect 采集设备进行数据采集、数据分析、实体回放、虚拟回放、人机互动等功能;③数据采集:该模块主要为展示采集设备采集到的人体骨骼数据; ④机器人仿真:该模块为展示NAO 机器人仿真,可以观察到机器人的动作及数据;⑤实时数据展示:该模块为展示采集设备实时采集到人体运动数据;⑥详细信息:该模块主要为文本的详细名称及文件类型;⑦项目工程:模块为采集的历史数据文件。
图2 系统界面设计流程
通过C# 语言编写程序,并且设计界面,由此我们可以获得人体运动数据采集系统界面的设计,见图3。
图3 人体运动数据采集系统界面设计
2.2.1 Neuron 动作捕捉技术
Neuron 是基于惯性传感器的专业级全方位动作捕捉系统,它包括17 个传感器子节点,节点间通过2.4 射频,实现完全无线连接,全身的无线数据传输也具有低延迟、高精度、高电磁耐受性等多种先进特性,可以精确的对大幅度的动作进行采集, 为使用者提供平滑而准确的动作捕捉数据。
Neuron 有自主开发的配套软件Axis Neuron PRO,软件可以展示与人体动作相匹配的人体模型,Hub 主节点连接电脑与传感器,实现两者之间的数据传输。由此我们可以获得Neuron 动作捕捉设备采集到的人体运动数据。
2.2.2 Neuron 与电脑连通接口框架
本系统的诺亦腾的接口框架, 见图4。 ①数据输入层:该层主要使用Neuron 设备获取人体运动骨骼数据并将数据传输进数据库,通过接口调用骨骼数据;②Neuron交互层: 通过Neuron 设备的17 个传感器节点采集数据,通过Hub 天线将采集到的BVH 数据和中间数据传输进电脑, 使用Axis Neuron PRO 软件获取骨骼数据, 并使用算法将数据转换为空间下的骨骼数据, 最后存储至Neuron Data Reader API 库中; ③应用接口层: 为简化从Axis 中获取数据,使用Neuron Data Reader SDK 纯C 接口,并使用C# 完成系统界面的编写。 其次,也可以观察到实时同步的人体运动数据和人体模型对人体运动的复现。
图4 Neuron 与电脑连通接口框架
2.2.3 Neuron 获取骨骼数据
Neuron Data Reader 通过网络从Axis Neuron 获取BVH 帧数据和中间数据帧, 每一帧中的BVH 数据包含了59 根骨骼的全部的动作数据, 中间数据则包含了59根骨骼的全部的传感器数据和动作数据以及双脚的接触状态。 对于带有位移的BVH 数据,每一根骨骼包含了6个float 型数据: 位移和旋转。 对于不带位移的BVH 数据,只有根节点包含位移和旋转数据。其余的每一根骨骼只包含了3 个旋转数据。
对于中间数据, 每一根骨骼包含了16 个float 型数据, 它们分别是:3 个位置数据、3 个速度数据、4 个四元数数据、3 个加速度数据和陀螺仪的3 个数据。
由于BVH 数据和中间数据不是世界坐标系下的骨骼位置数据,需将数据进行相应的处理,才能获得所需要的骨骼数据。 再通过Neuron Data Reader 的C 接口,进行数据的传输,完成框架的搭建。
2.3.1 Kinect 动作捕捉技术
Kinect 是基于视觉识别的动作捕捉设备, 它包含了深度传感器、红外线发射器、RGB 彩色摄像头、麦克风阵列。 它可以实时进行人体骨骼跟踪、语音识别、身份识别等[5-6]。 Kinect 与电脑的连接需要一个适配器,连接后,通过Kinect V2 自带的驱动, 当指示灯从黄色变为白色,就完成了Kinect 与电脑的连接。
Kinect V2 能够清晰的识别出人体骨骼的位置,可以识别25 个关节点,并且可以同时展示六个人的骨骼结构图[7]。 Kinect 2.0 有自带的Kinect for Windows SDK 驱动,可以完成Kinect 与电脑之间数据的传输, 便于我们获取精确的人体骨骼数据。
2.3.2 Kinect 模块与电脑连通接口框架
本系统的Kinect 的接口框架,如图5 所示。 ①数据输入层:该层主要为Kinect 获取人体骨骼数据,通过Kinect的内核驱动,可以将获取到的数据传输至电脑中;②Kinect交互层: 通过Kinect 采集人体运动骨骼数据,使用Kinect 的内核驱动完成数据的传输。 通过四元数、欧拉角的算法推算人体骨骼数据,并利用C++语言完成Kinect 获取人体骨骼数据算法的编辑;③应用接口层:通过Kinect 可以得到简易的人体骨骼模型,骨骼共20 个节点,可以体现人体运动数据,系统将骨骼数据图和采集的数据展示在采集界面上。
图5 Kinect 与电脑连通接口框架
2.3.3 Kinect 获取骨骼数据算法
设计系统中需要Kinect 对人体运动骨骼数据进行采集,首先我们使用Kinect 获取人体骨骼图,并对其进行相应的人体动作识别。然后我们使用四元数和欧拉角[8]对人体运动骨骼数据进行获取通过C++语言对算法进行编辑。 算法如下:
通过Kinect 获取的数据, 数据包括人体骨骼每个节点的三维坐标和四元数, 三维坐标即全局坐标系下的坐标,四元数的定义是(x,y,z,w),表示子节点与父节点的旋转关系,即局部坐标系间的转换关系。 Kinect 中定义的四元数是单位四元数,即模为1,由此获得单位四元数与旋转矩阵的转换关系如下:
由于人体骨骼的拓扑结构, 我们需要考虑每个人体关节点的运动信息的变化。人体骨骼段形成的骨骼夹角,间接反映了骨骼段之间的运动变化,因此,骨骼关节点处的夹角也是人体运动的重要特征。
首先, 我们对每个关节点的空间坐标进行向量的计算获取空间位置差特征,公式如下:
其次,我们要获取关节夹角特征,通过采集的各个骨骼节点,计算相邻骨骼段之间的夹角。不同的关节点处的自由度相对不一样, 由此我们可以观察到人体运动参数的变化。
由上面两个空间向量我们可以计算出这两个空间向量的夹角,也就是我们定义的关节夹角:Kinect 获取骨骼数据如图6 所示。
图6 Kinect 数据采集骨骼图
本系统设计需要采用MQTT 协议,进行云端数据存储,MQTT 是一种基于发布/订阅模式的“轻量级”通讯协议, 该协议构建于TCP/IP 协议上。 MQTT 最大优点在于,可以以极少的代码和有限的带宽, 为连接远程设备提供实时可靠的消息服务。 系统采集数据时需要打开MQTT,才能够将Kinect 和Neuron 采集到的数据传输到电脑。 由于搭建的平台考虑到可以与NAO 机器人连接,所以这里采用MQTT 协议。
Kinect、Neuron 只有采集和存储数据的功能, 并不能进行提取和传输。 所以我们要使用MQTT 通讯协议提供的Python API,编写可以将数据存储、提取、传输到云端的程序,实现了动作捕捉设备,云端服务器和人形机器人三者互联互通的功能,MQTT 编写程序如图所示。 并以Visual Studio 为开发平台利用C# 语言将功能集成在一个应用程序中,搭建起了一个以计算机为上位机,动作捕捉设备为下位机的人体运动数据采集系统。
通过设计的系统我们能够完成数据的采集,以及数据的展示,界面设计及功能展示见图7。界面实现了数据展示,实时数据展示等功能。 Neuron 对数据的采集以及展示,见图8。 设计的系统还可以对数据进行分析,如图9 所示为Neuron 和Kinect 采集到的数据,通过表格与数据图可以清晰的看到两个采集设备采集的数据。
图7 人体运动数据采集系统主界面
图8 Neuron 数据采集界面
图9 数据分析界面
主要完成了人体运动数据采集系统的框架搭建,系统可以采集比较精确的人体运动数据,并可以将实时数据展现在主界面和采集的界面。完成了可以访问历史数据的项目工程,并且能够通过文件对采集到的数据进行分析。
系统可以为远程控制、医疗、体育等提供所需的人体运动参数数据, 对该领域的科学研究及工程应用提供了较好的数据支持。
系统中设计了实时数据展示模块, 模块实现了人体运动数据的实时记录,精准采集身体各部位的动作轨迹、关节角度等数据。 数据分析模块可以记录两个采集设备采集的数据,并对数据进行多维度动作数据比较和分析。