徐 迅,劉玉生
(四川大學(xué)電氣信息學(xué)院,四川成都 610065)
虛擬現(xiàn)實(shí)(virtual reality,VR)是一種模擬人在自然環(huán)境中視、聽、動等行為的先進(jìn)人機(jī)交互技術(shù),能夠?yàn)槭褂谜吣M出與現(xiàn)實(shí)中相同的三維圖像世界。目前,虛擬現(xiàn)實(shí)技術(shù)的研究主要集中在虛擬場景建模開發(fā)和交互控制方法上,常用虛擬場景建模工具主要包括Vega,VRML等;而常用交互控制方法包括傳統(tǒng)鼠標(biāo)鍵盤或者數(shù)據(jù)手套與頭部跟蹤器,其中前者價格低廉但使用不便,后者價格過高,普通應(yīng)用場合難以承受[1,2]。本文提出了一種基于MEMS傳感器、LM3S1138微控制器和Vega虛擬仿真平臺的虛擬現(xiàn)實(shí)參觀系統(tǒng),用戶通過操縱手柄實(shí)現(xiàn)在虛擬場景中的自由參觀。該系統(tǒng)結(jié)構(gòu)簡單、成本低廉、使用方便,只需更改虛擬場景內(nèi)容即可將該系統(tǒng)移植到其他應(yīng)用領(lǐng)域。
本文提出的虛擬現(xiàn)實(shí)參觀系統(tǒng)如圖1所示,由手持模塊和主機(jī)端兩部分組成。
手柄端微控制器根據(jù)地磁場和重力加速度在傳感器各測量軸方向上的分量計(jì)算出當(dāng)前手柄相對于重力加速度軸和地磁場軸的俯仰角和方位角,將這2個角度作為手柄的狀態(tài)變量并根據(jù)手柄初始狀態(tài)計(jì)算出動作指令。然后動作指令通過串口發(fā)送到主機(jī)端,通信驅(qū)動程序根據(jù)接收的動作指令改變虛擬場景視角。
圖1 虛擬現(xiàn)實(shí)參觀系統(tǒng)結(jié)構(gòu)圖Fig 1 Structure diagram of virtual reality touring system
操縱手柄是樓宇參觀系統(tǒng)的核心組成部分,用戶通過對手柄水平垂直旋轉(zhuǎn)和前后按鍵的操作,實(shí)現(xiàn)在主機(jī)端虛擬場景視角水平360°、垂直180°的全方位變化和虛擬場景中視角位置的前后平移,從而實(shí)現(xiàn)在虛擬場景中參觀的功能,手柄外觀示意如圖2所示。
圖2 手柄外觀示意圖Fig 2 The schematic diagram of joystick appearance
虛擬樓宇參觀手柄由MMC212磁場傳感器、MXC6202加速度傳感器和LM3S1138微控制器(MCU)組成。兩種傳感器均有X,Y兩測量軸,在每個軸分量上可分別測量±2 Gs的磁感應(yīng)強(qiáng)度和 ±2gn的加速度,并分別以512counts/Gs和512counts/gn的精度通過I2C總線輸出。
圖3 傳感器與手柄位置關(guān)系Fig 3 Position relation between sensors and joystick
傳感器與手柄位置關(guān)系如圖3所示,磁場傳感器與手柄上平面平行,加速度傳感器與手柄側(cè)面平行,初始狀態(tài)下,手柄與地面平行,磁場傳感器X,Y測量軸組成平面垂直于重力加速度,加速度傳感器Y測量軸與重力加速度平行。
在靠近地表處,重力加速度垂直于地面,地磁場近似平行于地面,當(dāng)以重力加速度相反方向?yàn)閆軸,地磁場方向?yàn)閄軸,可得到如圖4所示的三維空間,其中XOY平面與地面平行。圖4中所示三維空間采用慣性坐標(biāo)系,PD表示手柄在空間中正方向,方位角α為PD在XOY平面投影與X軸夾角(0°~360°),俯仰角β為PD與XOY平面夾角(-90°~90°)。PD在空間中的方向可由圖4中的方位角α和俯仰角β唯一決定,因此,選取α,β作為手柄的狀態(tài)變量。磁場傳感器的X,Y兩測量軸對應(yīng)圖中向量MX,MY;加速度傳感器X,Y兩測量軸對應(yīng)圖中向量AY,AZ。由傳感器特性可知,AX,MY和PD平行,AX,AY與Z軸在同一平面且β=β',β'可由AX,AY求出;同理MYxoy,MX在XOY平面內(nèi)且α=α',α'可由MX,MYxoy求出,其中
因此,手柄在空間中狀態(tài)完全可以由磁場傳感器和加速度傳感器的測量值計(jì)算得到[3]。
圖4 手柄在三維空間中狀態(tài)Fig 4 State of joystick in 3D space
MEMS傳感器輸出數(shù)字量,將待測量物理量±2gn和±2 Gs分別線性映射至0x000~0x7FF的數(shù)字輸出,當(dāng)待測物理量分別為0gn和0 Gs,輸出量為0x400,因此,測量輸出數(shù)字量OD與實(shí)際測量物理量G的關(guān)系可由式(1)表示,當(dāng)G>0時,待測量物理量在測量軸方向分量為正,G<0時,待測量物理量在測量軸方向分量為負(fù)
通過分析待測向量在測量坐標(biāo)系中所在象限,計(jì)算得到手柄狀態(tài)變量[4]。圖5所示為手柄正方向在YOZ坐標(biāo)系中分別位于第一和第四象限,其中加速度傳感器AX,AY測量軸輸出實(shí)際測量加速度值Gx和Gy,根據(jù)式(2)計(jì)算得到俯仰角β
圖5 手柄俯仰角計(jì)算示意圖Fig 5 Schematic diagram of pitch angle calculation of joystick
當(dāng)Bx>0且BYxoy<0時α∈[π/2,π],可由式(4)得到
當(dāng)Bx<0且BYxoy<0時α∈[π,3π/2],可由式(5)得到
當(dāng)Bx>0且BYxoy<0時α∈[3π/2,2π],可由式(6)得到
手柄狀態(tài)變量由x=[αβ]T表示樓宇參觀系統(tǒng)對手柄狀態(tài)的精度要求不高,α和β均精到個位,且α∈[0°,360°],β∈[-90°,90°],因此,選擇α以9 位編碼;β以8 位編碼。
為減小傳輸數(shù)據(jù)量,手柄模塊微處理器根據(jù)手柄狀態(tài)和按鍵判斷生成動作指令,傳輸?shù)街鳈C(jī)端。
虛擬場景中視角變換動作包括視角上仰、視角下俯、視角左轉(zhuǎn)、視角右轉(zhuǎn)、視角前進(jìn)和視角后退,其中是否發(fā)生前4種動作由判斷手柄狀態(tài)決定,后2種動作由從手柄按鍵獲取。圖6所示為以一個字節(jié)編碼動作指令的方法。
圖6 動作指令編碼規(guī)則Fig 6 Encoding rule of action command
圖6中每一標(biāo)志位為1表示執(zhí)行該動作,否則,不執(zhí)行該動作。
手柄模塊初始化后,系統(tǒng)自動記錄手柄初始狀態(tài)下的狀態(tài)變量x0=[α0β0]T,然后進(jìn)入循環(huán)狀態(tài),每次循環(huán)首先讀取按鍵狀態(tài),然后獲取手柄狀態(tài)變量xi=[αiβi]T,得到狀態(tài)變化量Δxi=[ΔαiΔβi]T。
其中,Δαi=αi-α0,Δβi=βi-β0.
動作指令碼按照表1所示規(guī)則生成
表1 動作指令生成規(guī)則Tab 1 Generation rules of action command
多個動作可以同步觸發(fā),例如:視角同時左轉(zhuǎn)、上仰和前進(jìn),此時動作指令碼為00010101b,但左轉(zhuǎn)與右轉(zhuǎn)、上仰與下俯、前進(jìn)與后退不能分別同時發(fā)生。
主機(jī)端由通信驅(qū)動程序和虛擬場景應(yīng)用程序兩部分組成。通信驅(qū)動程序由C++編寫,根據(jù)接收手柄模塊發(fā)送的動作指令碼,向虛擬場景發(fā)出視角動作。虛擬場景應(yīng)用程序通常需要具備的功能與系統(tǒng)工作流程:
1)可編輯功能,即用戶可以根據(jù)需求設(shè)計(jì)自己需要的三維虛擬場景模型
2)接口功能,即虛擬場景中視角變換操作與可以由操作系統(tǒng)或其它應(yīng)用程序調(diào)用
本文選擇Vega的Lynx圖形用戶界面作為虛擬場景應(yīng)用程序,選擇Walk漫游方式,通過模擬按下鍵盤鼠標(biāo)協(xié)同控制方式定義中對應(yīng)鍵來實(shí)現(xiàn)視角變換功能;通信驅(qū)動程序根據(jù)接收動作指令,調(diào)用WinIO.dll動態(tài)鏈接庫函通過讀寫8042鍵盤鼠標(biāo)控制器的0x60和0x64寄存器,模擬按下Vega程序中設(shè)定的對應(yīng)鍵盤按鍵操作。例如:當(dāng)動作指令為00010101b(視角同時左轉(zhuǎn)、上仰和前進(jìn)),此時通信驅(qū)動程序模擬同時按下Vega程序中設(shè)定的視角左轉(zhuǎn)、上仰和前進(jìn)按鍵[5]。
3)系統(tǒng)工作流程
手柄模塊程序與主機(jī)端程序異步執(zhí)行,手柄模塊循環(huán)向主機(jī)端發(fā)送動作指令,每次發(fā)送后開計(jì)時器,等待主機(jī)回應(yīng);主機(jī)端以中斷方式接收,收到指令后模擬鍵盤操作同時向手柄模塊發(fā)送成功接收信息(ACK),若手柄模塊等待回應(yīng)超時則重新發(fā)送動作指令,手柄模塊程序流程如圖7所示,圖8(a)所示為手柄模塊定時器超時中斷子程序流程圖,圖8(b)所示為手柄模塊串口接收中斷子程序流程圖,圖8(c)所示為主機(jī)端串口接收中斷子程序流程圖,圖8(d)所示為主機(jī)端通信驅(qū)動程序流程圖。
圖7 手柄模塊程序流程Fig 7 Program flow chart of joystick module
為測試系統(tǒng)能否準(zhǔn)確感應(yīng)狀態(tài)變化并發(fā)出正確動作指令,設(shè)計(jì)如下試驗(yàn),假設(shè)圖4中|PD|=1,首先單獨(dú)在水平和垂直方向轉(zhuǎn)動手柄,直到手柄發(fā)出視角變化指令,然后在空間中任意方向轉(zhuǎn)動手柄,記錄指令發(fā)出和變化邊緣狀態(tài)變量序列{xi|i=1,2,…N},其中,xi=[αiβi]T,由此得到球坐標(biāo)序列{Pi|Pi=[|PD|]T},該坐標(biāo)序列表示的空間曲線在Y-Z平面內(nèi)投影如圖9所示。
圖9中理論指令邊界和實(shí)測指令邊界分別將Y-Z平面分割成9個子區(qū)域,當(dāng)PD端點(diǎn)在Y-Z平面內(nèi)投影分別在子區(qū)域I至IX時,對應(yīng)發(fā)出指令如表2所示。
圖8 系統(tǒng)程序流程圖Fig 8 Flow chart of system program
圖9 動作指令Y-Z平面內(nèi)投影邊界Fig 9 Action command edge projected on plane Y-Z
此外,從圖9可以看出:系統(tǒng)在實(shí)際使用中動作指令邊界與理論邊界在手柄狀態(tài)變化量Δα,Δβ在超出判斷閾值不大時基本吻合,但偏轉(zhuǎn)角度過大時兩組邊界存在一定偏差,該偏差主要是由于在使用中,人手轉(zhuǎn)動導(dǎo)致手柄繞PD軸旋轉(zhuǎn)一定角度,系統(tǒng)存在未測量的橫滾角。
表2 區(qū)域指令對照表Tab 2 Area and command comparison
該系統(tǒng)根據(jù)加速度和磁場傳感器測量結(jié)果,計(jì)算得出手柄狀態(tài)變量,動作指令通過串口傳送到主機(jī)端,在Vega虛擬場景中完成相應(yīng)虛擬場景動作,實(shí)測結(jié)果表明:在使用當(dāng)中手柄能夠根據(jù)用戶操作發(fā)出正確的動作指令,且在偏轉(zhuǎn)角度不大時實(shí)測動作指令邊緣與理論邊緣相差不大,能夠得到滿意的性能。
[1]吳 迪,黃 文.騫虛擬現(xiàn)實(shí)技術(shù)的發(fā)展過程及研究現(xiàn)狀[J].海洋測繪,2002,22(6):15 -17.
[2]花 蕾.具有較高真實(shí)感的網(wǎng)上虛擬校園構(gòu)建技術(shù)研究[D].西安:西安理工大學(xué),2010.
[3]戎海龍,戴先中,劉信羽.廚師手握鍋具運(yùn)動信息獲取方法[J].儀器儀表學(xué)報,2009,30(11):2291 -2297.
[4]蔣海濤,郭戰(zhàn)營.基于 MEMS加速度傳感器的飛行器傾角測量系統(tǒng)設(shè)計(jì)[J].計(jì)算機(jī)測量與控制,2010,18(1):107 -109.
[5]Alexei S.Nanyang Technological University virtual campus[J].IEEE Computer Graphics and Applications,2004,24(6):6 -8.