姚壽文,栗麗輝,王 瑀,常富祥,Zeyuan YAO
(1.北京理工大學 機械與車輛學院,北京 100081;2.Canterbury School, New Milford, CT 06776, USA)
虛擬現實是一種應用前景廣闊、發展迅速的人機交互技術,它借助計算機等仿真系統模擬產生三維空間的虛擬世界,提供給使用者關于視覺、聽覺、觸覺等感官的模擬,讓使用者可以及時、無限制地觀察虛擬三維世界里的事物。同時,計算機通過復雜運算將現實中使用者的位置變化以影像表現。虛擬現實技術應用廣泛,在文化娛樂、教育訓練、工程設計、醫療康復等領域都發揮著重要作用。人體模型的建立可以提高虛擬現實人機交互技術的交互性與沉浸感[1-3],而在虛擬裝配中的人機工效學的研究是裝配設計流程中必不可少的過程。在虛擬裝配場景中創建人體模型,通過操作訓練試驗裝配可達性與人體疲勞工作時間等,綜合分析裝配設計是否合理[4]。創建人體模型需要實時捕捉人體運動數據,主要有3種方法:① 捕捉身體動作的Kinect、捕捉手勢的Leap Motion等設備獲取人體的骨骼數據;② 多個動作捕捉相機從不同角度實時探測人體關節等處的Marker點數據;③ 人體重要關節點佩戴慣性傳感器[5]。其中,使用Kinect傳感器捕捉人身體動作是基于計算機視覺原理,可以利用少量的攝像機對跟蹤區域的多個目標進行動作捕捉,同時不需要穿戴任何設備,約束性小,沉浸感強。
現今市場上大多數基于Kinect的虛擬現實產品都是以單臺Kinect設備進行研究開發的[6-8]。建立虛擬人體模型需要較高的人體捕捉精度和數據傳輸速度,而單臺Kinect設備捕捉人體數據時存在前后模糊和自遮擋問題,從而導致數據精度不高。前后模糊問題是Kinect無法區分捕捉的數據來自人體的正面或背面,當人體背向設備時仍然認為獲得的數據來自人的正面,這就會導致左右側的關節數據顛倒,用戶使用感變差。單臺Kinect存在的自遮擋問題是當人體側向Kinect設備時,遠離Kinect一側的關節會被遮擋,導致捕捉不到完整的人體骨骼數據,在虛擬場景中得到的人體骨骼模型會發生部分錯亂,不能正常與現實人體同步動作。如圖1所示,人體右肩面向單臺Kinect時,左側關節會被遮擋,得到的人體骨骼模型左手臂和左腿與實際人體動作不符,圖1(c)模型中紅色和黃色的關節連線表示兩端的關節未被Kinect跟蹤到。

圖1 單臺Kinect自遮擋問題
目前,通過多臺Kinect數據融合技術解決骨骼追蹤精度低與身體遮擋等問題的研究并不多。相較而言,國外研究較早,2012年開始,Tong J等[10]提出利用多個Kinect來實現掃描3D完整人體形狀的系統,用于人體的三維模型重建的實驗研究。2017年,Müller等[11]沿走廊放置6臺Kinect設備,每側3臺,使用3D重建模型和由左側和右側設備獲得的融合骨骼數據來評估步態,提高了骨骼數據精度,但仍不能區分正反面。國內研究較晚,2016年,杜惠斌等[12]利用2臺Kinect深度圖像傳感器進行數據融合,以提高肢體康復系統中數據的精度與可靠性,但該康復系統只針對人的上肢運動,無法滿足虛擬裝配的人體全身運動捕捉要求。
為解決上述問題,獲取完整準確的人體運動數據,需要增加Kinect的數量來調高人體關節數據捕捉精度以及追蹤范圍,而Kinect的數量增多會增加紅外光之間的干擾,進而影響Kinect對關節點的捕捉精度。因此,本文提出利用2臺Kinect設備進行追蹤,根據關節跟蹤狀態與人體面向方向變化自適應調整權重,通過自適應加權融合2臺Kinect獲得的關節數據,解決無法區分正反面、自遮擋問題,從而提高人體捕捉的精度。
為提高人體動作捕捉數據精度,系統融合2臺Kinect v2設備數據,采用客戶端-服務器端模式,每臺設備都與相應客戶端PC連接。2臺客戶端計算機使用SDK獲取骨架數據,并通過本地以太網將其發送到服務器端PC。所有骨骼數據的處理都在服務器進行,然后將融合后的骨骼數據傳輸到Unity3D場景中進行可視化。
由于Kinect存在自遮擋缺點,無法獲得人體姿態的全貌,本文以2臺Kinect設備為例組成雙Kinect人體動作捕捉系統,通過數據融合獲得較為準確的人體運動數據,同時擴大了人體的活動范圍。放置Kinect時,要盡量保證獲得人體全貌,2臺Kinect獲取數據的總視角盡量大,故采用正交布置方案,此時紅外線相互干擾影響也最小[13]。根據人體身高與Kinect的最佳捕捉范圍,2臺Kinect距地面垂直高度70 cm放置,與融合中心相距2 m距離,系統方案設計如圖2所示。

圖2 系統方案設計
雙Kinect全身運動捕捉系統的設計分為3個模塊,分別為雙Kinect系統坐標標定、UDP協議數據傳輸、自適應加權數據融合。
通過2臺Kinect設備擴大追蹤范圍,但每臺Kinect的位置和視角都不同,獲取的骨骼關節點數據都是相對于Kinect攝像頭坐標系的,因此需要先把不同Kinect的數據統一轉換到同一個世界坐標系,通過相關標定算法完成坐標轉換。每個Kinect客戶端會預處理關節點信息,然后將處理后的數據發送至服務器。
建立多RGB-D相機系統需要標定才能進行后續的數據處理,標定過程包括對單臺RGB-D相機的內部幾何參數標定以及求解RGB-D相機之間的相對位姿矩陣的外部標定[14-15]。對單臺RGB-D相機內部參數的標定又分為對RGB相機幾何參數的標定與深度校準。幾何參數標定一般采用傳統相機標定方法,使用標定模板,RGB相機拍攝不同角度的標定板照片計算出相機的內部參數;深度校準是對深度相機與RGB相機之間的相對位姿參數的校準,這個問題目前并沒有較好的解決方法,仍有待研究。外部標定是在同一世界坐標系下求解每臺RGB-D相機的外部參數,即世界坐標系到相機坐標系的變換矩陣[16-17]。
采用2臺Kinect設備對人體姿態進行捕捉時,每臺Kinect設備能夠從不同的視角獲取目標的骨骼關節點數據,但是每臺Kinect都有自身的坐標系,Kinect自身坐標系與世界坐標系的關系如圖3所示。2臺Kinect分別在自身坐標系下獲取人體骨骼數據,后續數據融合無法直接進行,需要將每臺Kinect獲得的骨骼關節點數據進行坐標變換處理,統一的世界坐標系下,才能傳輸至數據融合服務器進行后期處理。對于坐標系不統一的情況,首先需要進行坐標系標定工作,使系統采集到的數據在同一坐標系下使用。2臺Kinect標定過程是在同一個世界坐標系,求解每臺Kinect設備的外部參數,即自身坐標系與世界坐標系之間的旋轉矩陣R與平移向量T,R為3×3矩陣,T為3維向量。變換公式為
(1)
式中:(Xc,Yc,Zc)是某點在相機坐標系下的位置坐標;(Xw,Yw,Zw)是該點在世界坐標系下的位置坐標;R3×3和T3×1分別是世界坐標系到相機坐標系的旋轉矩陣和平移向量,也稱為相機的外參矩陣。

圖3 Kinect坐標系與世界坐標系的關系(圖中陰影重疊部分為數據融合區)
本文使用開源系統LiveScan3D[18]對2臺Kinect的坐標進行標定。LiveScan3D使用多Kinect V2傳感器進行實時三維數據采集,允許用戶在任何物理配置中放置任意數量的傳感器并啟動以實時速度融合數據進行三維環境的重構。雙Kinect系統坐標標定過程主要分為相機內參獲取、預標定、3D點云獲取、ICP算法優化4個步驟。通過已知位置坐標的標定板圖案進行初步校準可以得到Kinect的外參初值,再經過ICP算法優化后的外參矩陣精度更高,對三維環境實時重構與人體運動捕捉的精度都有所影響[19]。具體標定過程如圖4所示。
為了實現客戶端與服務器端的數據傳輸,需要通過數據傳輸協議來完成。常用的2臺硬件設備間的通信傳輸協議有TCP協議與UDP協議。TCP(transmission control protocol)協議,是一種面向連接的、可靠的、基于字節流的傳輸層通信協議,使用3次握手協議建立連接,4次揮手斷開連接。UDP(user datagram protocol)用戶數據報協議是開放式系統互聯(open system interconnection,OSI)參考模型中一種無連接的傳輸層協議,提供面向事務的簡單不可靠信息傳送服務。UDP有不提供數據包分組、組裝和不能對數據包進行排序的缺點,即當報文發送之后,無法得知其是否安全完整到達[20]。

圖4 雙Kinect系統坐標標定
UDP在沒有錯誤檢查的情況下速度更快,但無法保證發送的數據包能夠被接收到。UDP作為一種不可靠的協議,可以提供更低的開銷并支持多播,不能保證數據包的傳遞和順序,但通常速度更快。因此,UDP適用于對遲來的數據包和部分丟失數據包影響不大的情況。在本文中,客戶端與服務器端的數據傳輸使用UDP協議,Kinect客戶端發送數據足夠快,如果存在有損耗的網絡和丟包,UDP仍然可以滿足要求,減少延遲和開銷。另外,若將來添加新客戶端,UDP可以更好地運行。客戶端發送UDP數據包,必須說明目的端的IP地址和端口號,而當服務器端一個應用程序接收到UDP數據包時,操作系統必須告知消息的來源,即源端IP和端口號。因此,UDP數據報IP首部包含源端和目的端的IP地址,這種特點允許UDP服務器同時接收多個客戶端的信息并進行處理,給每個發送請求的客戶端回應。如圖5所示是UDP協議數據的封裝格式。

圖5 UDP數據封裝格式
客戶端將從Kinect傳感器獲取的骨骼關節數據轉換成用于傳輸的OSC(open sound control)信息格式,通過UDP協議發送,服務器端以Unity3D引擎為實現數據融合與可視化的主體,在Unity中添加OSC組件以接收從客戶端發來的數據。設置IP地址、發送與接收信息的端口,在客戶端與服務器端建立連接,將客戶端與服務器端PC同時連入同一個局域網,經過UDP協議完成數據的傳輸。具體傳輸流程如圖6所示。

圖6 客戶端與服務器端數據傳輸流程
雙Kinect自適應加權數據融合算法實時計算人體面向方向,根據人體面向方向與Kinect方向夾角的實時變化對每臺Kinect的權重進行自適應調整,計算每個關節點的加權平均值,得到融合后的關節點數據。
跟蹤目標人體的面向方向是數據融合的關鍵。一般情況下,左右兩側肩關節構成的向量即可表示人身體的方向向量BV(body vector),將其旋轉90°就是人的面向方向向量Vf。但某些情況下,目標人物可能會扭曲身體,一側肩關節被遮擋而無法有效得到體向量BV,所以只靠肩關節確定人的體向量BV和面向方向Vf是不可靠的。本文采用多對關節確定目標人物的體向量BV,左右兩側肩關節、肘關節、髖關節、膝關節、踝關節,根據圖7所示的Kinect追蹤關節點序號對照表,4號、8號分別對應左右肩關節,5號、9號分別對應左右肘關節,以此類推。由關節跟蹤狀態所分配的權重λi計算λ4·λ8,…,λ15·λ19,值為1,則取該對關節向量為人的體向量BV,從而確定面向方向。

圖7 關節點序號對照圖
Kinect無法區分跟蹤目標的正面和背面,當人體背對向Kinect時,Kinect依然會將獲取的骨骼關節點數據當作人的正面來處理,這樣就會導致左右兩側數據顛倒。虛擬場景中的人體模型動作也會發生左右側顛倒的情況,雖然仍可以正常動作,但會影響用戶使用感受。而2臺Kinect數據融合時,來自背面的左右顛倒的數據不經過交換處理會影響融合后的結果,從而導致虛擬人體模型關節點位置錯亂。因此,數據融合之前必須確定Kinect獲得的骨架數據來自人體的正面還是背面。如果來自背面,使用左右側關節點數據交換(left-and right-ide data swapping,LRS)函數交換左右側骨骼關節點的數據,以保證數據的正確性。在程序開始的第一幀,用戶正面向Kinect1,以Kinect1獲取的關節點數據確定此時人體的面向方向Vf0,這樣就可以獲得Kinect1和Kinect2的方向Vk1和Vk2。Vk1與面向方向Vf0夾角為180°,Vk2與面向方向Vf0的夾角為90°。程序運行過程中,人體的面向方向為Vf,分別計算Vf·Vk1與Vf·Vk2,若Vf·Vk1>0,則人體背對Kinect1,使用LRS函數交換Kinect1獲取到的左右側骨骼關節點的數據;若Vf·Vk1<0,則不進行交換處理。Kinect2獲取的骨架數據如前所述處理。人體面向方向與2臺Kinect方向示意圖如圖8所示。圖中α1、α2分別為人體面向方向向量Vf與Kinect1、Kinect2方向向量之間的夾角。

圖8 人體面向方向與Kinect方向示意圖
Kinect獲取目標人物的骨骼關節點數據時,可能會存在關節未追蹤到的情況,那么未跟蹤到的關節點數據將是非常不準確的,在數據融合中應剔除掉。在Kinect SDK報告中可以讀取到25個關節點的跟蹤狀態,共有3種不同狀態,分別為“跟蹤到”“不確定”和“未跟蹤到”。根據3種不同的狀態為25個關節數據分配不同的權重λ,依次分別為1、0.5、0。
人體在Kinect前方不同方位時,Kinect所獲取的精度不同。例如,當人體正面面向Kinect時所獲得的數據精度最高,隨著人體面向方向與Kinect的鏡頭方向之間的角度α越來越大時,所獲得的數據精度將越來越低,90°時將會有一側的關節被另一側遮擋而無法跟蹤到,此時所獲得的數據精度最差。因此,在數據融合中根據人體面向方向的角度變化自動為每臺Kinect賦予不同的權重。2臺Kinect采用正交布置方式,故2臺Kinect相機鏡頭方向相差90°,當被捕捉的人體正面向Kinect1時,必定側向Kinect2。也就是說,當Kinect1捕捉到的人體骨架數據最全面精確時,Kinect2捕捉到的人體骨架數據最不完整,所以當人面向方向與Kinect1方向的夾角α1為180°或0°時,取Kinect1權重為1,此時Kinect2的權重為0;人面向方向與Kinect1方向的夾角α2為90°時,取Kinect1權重為0,此時Kinect2的權重為1。0°~90°夾角范圍的權重為遞減函數,隨面向方向與Kinect方向之間的夾角α變化自適應調整。為減少程序運算時間,提高系統實時性,本文設計權重調整函數為一次函數,如圖9所示,Kinect1和Kinect2的權重調整函數相同。

圖9 Kinect權重自適應調整函數
根據自適應權重分配原則得到的關節點權重與Kinect權重,將2臺Kinect獲取的骨骼關節點的位置坐標進行加權平均融合計算。融合計算公式為
(2)

根據上述自適應加權數據融合算法,繪制算法流程,如圖10所示。
雙Kinect全身運動捕捉系統以2臺Kinect傳感器檢測并跟蹤重疊區域內的人體目標,獲取真實三維空間中人體的運動數據。在Unity3D中,通過C#編程,將從Kinect客戶端接收到的骨骼關節點數據進行融合計算,在虛擬場景中建立三維運動骨骼模型,并使之真實地實時反映現實場景中人體的運動。系統搭建完成后,在Unity3D的場景中創建一個三維人體骨骼模型,且模型的關節點位置隨人體動作實時刷新,模型動作與現實場景中的人體動作基本一致。如圖11所示是程序運行某一幀的人體骨骼模型。

圖10 數據融合算法流程

圖11 虛擬環境中的人體骨骼模型
為增強用戶的真實感與沉浸感,虛擬場景中虛擬人體骨骼模型需要實時跟隨用戶運動。“實時”的含義包括對運動人體的位置與姿態動作進行實時捕捉與三維重建,場景畫面更新時間間隔不能超過一定的閾值,使人眼無法觀察到閃爍,系統可以立即響應用戶的輸入并生成相應的場景和事件[21-22]。一般來說,系統延遲時間在100 ms以上,用戶就會感覺到虛擬人體動作的明顯滯后,嚴重影響用戶的沉浸感,所以本文中系統的每2幀之間更新的時間控制在100 ms以內。虛擬場景中的畫面更新間隔時間包括Kinect客戶端檢測到用戶獲取骨骼幀數據并向服務器端發送數據的時間,服務器端接收到數據后進行數據融合運算并在Unity3D虛擬場景中可視化表達的時間。
經過多次試驗測試系統更新間隔時間,發現每次更新花費時間最久的部分是Kinect獲取人體骨骼數據的間隔,時間間隔大約為33 ms,網絡數據傳輸與服務器數據融合的時間都小于1 ms,整個系統完成數據更新的總時間間隔小于35 ms,滿足實時性要求,用戶不會感覺到明顯的延遲。

圖12中統計了數據融合前后關節點未被跟蹤到的次數,藍色和橙色分別代表融合前Kinect1和Kinect2的關節點數據,黃色則代表2臺Kinect融合之后的關節點數據。由圖中數據對比,發現數據融合前每臺Kinect關節點未被跟蹤到的次數都要大于融合后的關節點未被跟蹤到的次數,所以1臺Kinect未跟蹤到某個骨骼點而另1臺Kinect跟蹤到時,系統仍然可以獲得該骨骼點的位置坐標。由于Kinect捕捉范圍有限,當人體運動超出2臺Kinect的捕捉范圍,骨骼點就無法被追蹤到。當2臺Kinect都未跟蹤到某個骨骼點時,系統也就無法正確獲得該骨骼點的位置坐標,從而導致人體骨骼模型的關節可能發生錯亂。由圖12可看出,Kinect對于手部關節點的捕捉精度不高,無法達到像人體其他關節點一樣的精確捕捉,對手指的細節動作難以正確檢測。

圖12 融合前后人體關節未被跟蹤到的次數對比
單臺Kinect捕捉人體骨骼數據存在自遮擋問題。當人體側向Kinect設備時,遠離Kinect一側的關節會被遮擋,從而捕捉不到完整的人體骨骼數據,在虛擬場景中得到的人體骨骼模型會發生部分錯亂,不能正常與現實人體同步動作。經過試驗,基于雙Kinect自適應加權數據融合算法的全身運動捕捉系統可以解決人體自遮擋問題。當人體側面向1臺Kinect時,必然正面向另1臺Kinect設備,經過數據融合算法將2臺Kinect獲取的關節點數據融合之后,虛擬環境中的人體骨骼模型依然完整,沒有出現關節錯位等問題,可以與現實中的人體實時同步動作,達到預期要求。試驗結果如圖13所示,圖(中)為當人體右肩正對Kinect2時,單獨Kinect2獲取的數據構建骨骼模型,可以明顯看到因為遮擋左手臂的動作與實際人體不相符;圖(右)是相同情況下2臺Kinect數據融合后的骨骼模型,其動作與實際人體一致,證實了數據融合的正確性。

圖13 人側向Kinect2時數據融合前(中)后(右)骨骼模型
動作捕捉技術是虛擬現實應用中不可或缺的部分。考慮人機功效的虛擬裝配是機械裝配設計的關鍵,可以提高裝配效率、降低裝配成本。為了提高Kinect動作捕捉數據的精度,本文提出了2臺Kinect自適應加權數據融合算法,根據關節跟蹤狀態和人體面向方向與Kinect方向之間的夾角自動調整權重,將2臺Kinect捕捉到的數據進行融合計算,搭建了基于UDP協議的雙Kinect人體全身運動捕捉系統,實現虛擬人體骨骼模型隨人體實時隨動,并對系統的實時性與準確性進行了試驗分析。試驗結果表明,系統解決了人體運動捕捉過程中存在的前后模糊與自遮擋問題,為將來虛擬環境中的人體模型在裝配設計人機工效的研究與應用方面提供了技術支持。