孫 軍, 周志楠
(沈陽建筑大學機械工程學院, 遼寧沈陽 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 數據分析界面
主要完成了人體運動數據采集系統的框架搭建,系統可以采集比較精確的人體運動數據,并可以將實時數據展現在主界面和采集的界面。完成了可以訪問歷史數據的項目工程,并且能夠通過文件對采集到的數據進行分析。
系統可以為遠程控制、醫療、體育等提供所需的人體運動參數數據, 對該領域的科學研究及工程應用提供了較好的數據支持。
系統中設計了實時數據展示模塊, 模塊實現了人體運動數據的實時記錄,精準采集身體各部位的動作軌跡、關節角度等數據。 數據分析模塊可以記錄兩個采集設備采集的數據,并對數據進行多維度動作數據比較和分析。