楊 華 蘇勢林 閆雨奇 李寶川 潘琢金
(沈陽航空航天大學計算機學院 沈陽 110136)
人體運動建模與仿真是一門涉及圖像處理,模式識別,人工智能等領域的交叉學科,且運動捕捉技術已廣泛地應用于影視動畫,體育訓練,機器人驅動和虛擬現(xiàn)實等實際場景中[1]。為生成滿足物理運動規(guī)律的虛擬角色運動,利用開源軟件研制仿真平臺則是一個熱點。如日本AIST 與東京大學聯(lián)合研發(fā)的開放式仿人機器人平臺OpenHRP,但OpenHRP 軟件開發(fā)規(guī)模大,對機器人生產環(huán)境要求高,因此難以大規(guī)模地應用與借鑒[2]。ODE(Open Dynamic Engine,開源動力引擎)是常用的開源動力引擎之一,很多仿人機器人平臺在此基礎上搭建,如GazeBo,Webots,V-REP,Mujoco等[3]。
近年來,基于物理角色運動是計算機動畫研究領域中最活躍的領域之一[4]。例如:文獻[4]通過Kinect 設備獲取人體運動的原始坐標數(shù)據(jù),計算人體關節(jié)旋轉角度將其保存在BVH 文件中,用于動畫生成[5]。除了直接利用光學設備捕獲人體運動數(shù)據(jù)外,一些研究人員也在已有運動庫中引入機器學習等理論合成人體運動。Daniel Holden 等基于深度學習框架實現(xiàn)了人體運動合成和編輯,在大量動捕數(shù)據(jù)集上進行訓練,由卷積自編碼器學習運動流形來生成復雜動作[6],Jack M.Wang 等提出了一種非線性的高斯隱變量模型,使用時間序列預測方法從模型中合成新的運動序列[7]。Peng 等則采用強化學習策略實現(xiàn)了物理角色的穩(wěn)定控制,結合動捕數(shù)據(jù)和任務目標來完成用戶指定的輸入[8]。而基于機器學習或深度學習等理論生成的人體運動往往訓練周期過長,參數(shù)變量多,難以在真實環(huán)境中測試和應用。
本文利用Kinect 深度視覺傳感器采集人體運動位姿數(shù)據(jù),計算轉換成關節(jié)Z-Y-X 軸向上的歐拉角存儲于BVH 中,為數(shù)據(jù)驅動提供支撐。在ODE 上搭建一個全尺寸并具有真實物理環(huán)境的虛擬機器人,參考動捕數(shù)據(jù),使用路徑跟蹤的方法來增強物理模擬結果的真實感,結合PD 控制算法計算虛擬機器人的關節(jié)扭矩,從而驅動虛擬機器人模擬捕獲動作。
為給數(shù)據(jù)驅動和數(shù)據(jù)分析提供支撐,構建從Kinect 位姿數(shù)據(jù)向運動數(shù)據(jù)轉化,記錄人體運動序列,并在虛擬仿人機器人上再現(xiàn)和驗證相關人體運動。將Kinect 捕獲到的骨骼四元數(shù)數(shù)據(jù)轉化成歐拉角存儲于BVH 文件中,目的是建立人體運動模型,驅動物理角色,并生成自然逼真的虛擬仿人機器人運動。
Kinect 是微軟Xbox 360 外接3D 體感攝影機,具備即時動態(tài)捕捉,影像識別,麥克風輸入,語音識別等功能。Kinect for Windows SDK v1.6 平臺為用戶提供應用程序接口來采集人體運動序列,為研究者提供實驗環(huán)境和技術支持。近年來,已有大量的人體運動數(shù)據(jù)集基于Kinect采集,如NUCLA Multi?view Action3D,UTD-MHAD 等運動庫[9~10]。人體模型主要描述為幾何拓撲結構及其物理屬性,這些模型往往根據(jù)實際場景抽象出來。其中骨骼追蹤技術是Kinect核心技術之一,它可準確地標定人體20個關鍵點數(shù)據(jù),并實時跟蹤。Kinect 利用景深視覺獲取人體關節(jié)點信息,并以Hip 為根節(jié)點組成一棵樹形層次結構,如圖1所示。
圖1 Kinect骨架層次結構
BVH 最初由Biovision 公司設計的動捕文件格式,以此提供運動數(shù)據(jù)分析和處理服務[11]。BVH文件包含兩部分,骨架信息和運動數(shù)據(jù),骨架信息描述了以人體髖關節(jié)為根節(jié)點的骨架層次結構,包括旋轉、關節(jié)偏置以及通道數(shù)等信息。運動數(shù)據(jù)則記錄了按骨架層次結構實時捕獲到的關節(jié)歐拉角數(shù)據(jù),便于人體運動建模和運動生成,如圖2 所示。其中骨架信息以關鍵字“HIERARCHY”為開始;“ROOT”確定髖關節(jié)(Hip)為根節(jié)點;“JOINT”為父節(jié)點下的所屬關節(jié);“OFFSET”則為子節(jié)點相對于父節(jié)點的偏置;“CHANNELS”為通道數(shù)。ROOT 總是擁有6 個CHANNELS,而JOINT 只有3個CHANNELS,相對于ROOT 而言,缺少了坐標系的X-pos,Y-pos,Z-pos 信息。在構成人體骨骼模型的所有關節(jié)中,除根節(jié)點可以同時進行平移和旋轉外,其他關節(jié)一般被設定為旋轉關節(jié),因此骨架模型的其他節(jié)點的位置是通過相對于其父節(jié)點的偏移和旋轉信息而得。則子節(jié)點對于父節(jié)點的變換矩陣為M=T×R,T表示平移矩陣,R表示旋轉矩陣。如計算右足(R_FOOT)在世界坐標系下位置:
其中PR_FOOT是需要計算的世界坐標,POFFESET_R_FOOT則為R_FOOT 相對于R_ANKLE 的偏置。同理,其他節(jié)點根據(jù)相應的平移和旋轉變換即可求出。
圖2 BVH文件結構
Kinect采用四元數(shù)描述骨架位姿信息,而BVH文件記錄的是人體關節(jié)歐拉角信息。因此,本文將Kinect數(shù)據(jù)轉化為BVH記錄格式,從而實現(xiàn)采集數(shù)據(jù)對人體運動模型的實時驅動。首先,依據(jù)Kinect人體骨架信息結構,創(chuàng)建BVH 骨架層次信息,如圖2(a)所示。其次,建立Kinect 四元數(shù)向BVH 中Z-Y-X 軸向上的歐拉角的轉化算法,根據(jù)需要,既可以存儲于BVH 數(shù)據(jù)文件中,也可以直接對人體運動模型進行仿真驅動。轉化算法推導過程如下:
骨架四元數(shù)定義為
其 中ε0,ε1,ε2,ε3為 實 數(shù),滿 足=ijk=-1。將式(2)改寫為q=[ε0,ε1,ε2,ε3]=[w,→,其中w為標量,=(ε1,ε2,ε3)為矢量部分。四元數(shù)繞旋轉軸旋轉一個角度的旋轉矩陣為
并將其改寫成:
而BVH 運動信息中繞Z-Y-X 軸旋轉的歐拉矩陣如式(4)所示:
其中,cα、sα分別表示sin(α)、cos(α),令式(3)和式(4)式中的旋轉矩陣相等,計算r11和r21的平方和的平方根求得cβ。然后用-r31除以cβ再反正切求得β角。只要cβ≠0,用r21cβ除以r11cβ再反正切求得α角,同理求得γ角,其中Atan 2(y,x)是反正切函數(shù),綜上,完成Kinect 四元數(shù)向BVH 歐拉角的轉化計算。
ODE能對剛體進行仿真計算,完成剛體關節(jié)間扭矩輸入,并在約束條件下實現(xiàn)碰撞檢測。ODE包含:作用力發(fā)生器計算剛體對象所受作用力并處理剛體運動行為;碰撞檢測器確定剛體對象間以及剛體與靜態(tài)場景間的接觸行為,進而描述碰撞效果。為實現(xiàn)人體動作的仿真再現(xiàn)及運動控制算法的研究,本文基于ODE建立了一個虛擬仿人機器人。
與Kinect骨架模型相對應,該虛擬仿人機器人由16 個剛體對象(頭,軀干、髖、上臂、下臂、手、大腿、脛、和腳)和15 個球窩關節(jié)(連接剛體結構)構成,其外形如圖3所示,質量和尺寸如表1所示。將作用力生成器附加在關節(jié)處,實現(xiàn)剛體對象間的線性相對運動來模擬人體運動行為。
表1 虛擬機器人物理參數(shù)
圖3 機器人
本文借助ODE 完成虛擬仿人機器人動力學運算,預設控制算法實時計算并調整各關節(jié)扭矩,實現(xiàn)對虛擬仿人機器人進行連續(xù)的姿態(tài)跟蹤及控制,并在約束條件下對虛擬機器人實現(xiàn)碰撞檢測[12]。采用的剛體控制系統(tǒng)的實現(xiàn)方法如下:
剛體動力學狀態(tài)方程[13~14]:
式中τ是n×1 的剛體轉矩矩陣,M(θ) 是剛體的n×n質量矩陣,V(θ,θ?)是n×1 的離心力和哥式力矢量,G(θ)是n×1 重力矢量。θ,θ?,θ?分別代表剛體關節(jié)角度、角速度、角加速度。M(θ),G(θ)的元素是關于剛體θ的復雜函數(shù),而V(θ,θ?)中的元素是關于θ和θ?復雜函數(shù)。引入摩擦模型(或者其他非剛性效應),假設這個摩擦模型是關節(jié)角度和角速度的函數(shù),則在式(6)上加上一項F(θ,θ?),得到:
對于式(7)中復雜系統(tǒng)的控制問題可分解控制器方法求解,令:
式中E表示剛體期望軌跡與實際軌跡之差,E和分別為n×1 維角度誤差矢量和角速度誤差矢量,求得的控制系統(tǒng)如圖4所示。
圖4 剛體控制系統(tǒng)的實現(xiàn)方法
綜上,很容易求得剛體系統(tǒng)閉環(huán)特性的誤差方程:
虛擬機器人的控制非常復雜,涉及的參數(shù)眾多,因此常用動捕數(shù)據(jù)路徑跟蹤和傳統(tǒng)控制方法結合來優(yōu)化控制[15~16]。本文用位姿數(shù)據(jù)計算關節(jié)扭矩,驅動虛擬仿人機器人對Kinect采集人體運動數(shù)據(jù)的仿真再現(xiàn)。通過記錄真實的動捕數(shù)據(jù)來驅動虛擬仿人機器人,具有真實逼真、高效率等優(yōu)點,提高了動捕數(shù)據(jù)的利用率。本文采用PD控制算法來實現(xiàn)虛擬機器人動作的生成與控制,PD 控制通過計算動捕數(shù)據(jù)與虛擬機器人姿態(tài)間差異來施加關節(jié)內部扭矩,從而實現(xiàn)運動捕獲數(shù)據(jù)對虛擬機器人的驅動控制,如圖5所示。
圖5 人體數(shù)據(jù)驅動
根據(jù)動捕數(shù)據(jù)與虛擬機器人之間的姿態(tài)差異獲取關節(jié)角度差值,并使用比例微分(PD)控制器對關節(jié)施加扭矩來維持虛擬機器人的運動姿態(tài)[17]。通過動力學給關節(jié)施加扭矩,并反饋控制驅動虛擬機器人跟蹤運動捕獲數(shù)據(jù)來保持姿態(tài)平衡。根據(jù)式(11)可得輸入關節(jié)的扭矩為
τ為關節(jié)內部扭矩,θd,θ?d為關節(jié)的期望姿態(tài)與期望角速度,θ,θ?為關節(jié)的當前角度和角速度,Kp和Kd分別比例系數(shù)與微分系數(shù)。
本文實驗在一臺2.4GHz CPU 和4GB 內存的PC 機上運行,基于Visual C++和ODE 引擎編程建立仿真實驗環(huán)境,由兩部分組成:1)Kinect 捕獲人體運動數(shù)據(jù)轉化計算為BVH 格式數(shù)據(jù);2)基于ODE建立全尺寸虛擬仿人機器人,為人體運動仿真再現(xiàn)及控制算法提供運動分析和驗證平臺。該平臺包含了物理引擎提供用戶對虛擬仿人機器人行為的高層控制,實現(xiàn)了基于姿態(tài)差、PD 控制算法等計算關節(jié)力矩驅動角色模型跟蹤動捕數(shù)據(jù),對外界擾動和環(huán)境變化做出實時反饋。不僅可以提供在線人體運動仿真,在已有的運動庫中提取動捕數(shù)據(jù)離線編輯新的運動序列來驅動虛擬機器人,生成自然逼真的人體運動,實驗過程如圖6 所示。由于動捕數(shù)據(jù)含有豐富的細節(jié)信息(關節(jié)角度、角速度、角加速度等),結合物理動畫引擎能生成自然逼真的人體運動,并能對虛擬場景中的各種事件進行感知,做出相應的反饋行為。數(shù)據(jù)驅動方法繼承了動捕數(shù)據(jù)的自然逼真性和關節(jié)約束性因素,通過實時仿真計算完成虛擬人的運動生成,很大程度上避免了姿態(tài)奇異因素。
在搭建的仿真平臺上進行虛擬機器人仿真模擬,實驗選取行走、抬腿、揮手等動捕數(shù)據(jù)來驅動虛擬機器人模擬出對應的運動姿態(tài),如圖7所示。
圖6 虛擬機器人驅動控制過程圖
圖7 虛擬機器人運動模擬
上述系列方法可用于仿人機器人的研制過程。在項目組研制的輕型仿人機械手臂上,用BVH 數(shù)據(jù)文件進行驅動控制,實現(xiàn)對人體手臂動作的真實再現(xiàn)。如圖8 所示,該機械手臂包含8 個自由度(末端夾具1 個),能夠比較準確地完成上舉、平伸、側抬等動作,誤差范圍在厘米級,分析原因是因為機械手臂的部件加工精度及舵機尺差等因素造成。
圖8 上肢運動姿態(tài)樣機測試
本文構建了Kinect 從關節(jié)點位置數(shù)據(jù)向肢體位姿數(shù)據(jù)轉化,存儲于BVH中,基于ODE建立虛擬仿人機器人實現(xiàn)了人體運動的仿真再現(xiàn),以及為控制算法提供驗證平臺。完成了Kinect數(shù)據(jù)采集、離線BVH 轉換、仿人機器人姿態(tài)計算、關節(jié)扭矩計算、仿真驅動等系列實驗,并在項目組研制的輕型仿人機械手臂上,實現(xiàn)BVH 數(shù)據(jù)文件對機械手的驅動控制和真實再現(xiàn)。實驗表明該系列方法可用于仿人機器人研制、虛擬現(xiàn)實等相關研究。