劉賢梅, 李朝順
(東北石油大學(xué) 計(jì)算機(jī)與信息技術(shù)學(xué)院, 大慶 163000)
虛擬現(xiàn)實(shí)技術(shù)的不斷發(fā)展與廣泛應(yīng)用,大大改善了傳統(tǒng)油田員工的培訓(xùn)方式[1]。通過(guò)虛擬現(xiàn)實(shí)技術(shù)建立計(jì)算機(jī)虛擬的、可操作的培訓(xùn)系統(tǒng),使油田員工能夠在虛擬的環(huán)境下學(xué)習(xí)如何對(duì)設(shè)備進(jìn)行操作以及如何應(yīng)對(duì)突發(fā)事件,使安全操作的培訓(xùn)更加方便、逼真并易于接受。但就目前油田方面針對(duì)虛擬仿真培訓(xùn)的應(yīng)用,僅停留在能夠?qū)崿F(xiàn)完成具有臨場(chǎng)感的三維可視化場(chǎng)景,提供固定情節(jié)模式下角色與其他模型進(jìn)行簡(jiǎn)單交互的培訓(xùn)。對(duì)于油田作業(yè)培訓(xùn)過(guò)程中所要求的多崗位、多工種的高協(xié)作性,現(xiàn)有的虛擬仿真培訓(xùn)系統(tǒng)因無(wú)法實(shí)現(xiàn)全方位、多角色的協(xié)同學(xué)習(xí)而缺陷明顯。
針對(duì)上述問(wèn)題,本文利用Unity 3D開(kāi)發(fā)平臺(tái),使用C#語(yǔ)言,采用客戶(hù)端/服務(wù)器模式,將多用戶(hù)交互技術(shù)應(yīng)用到油田仿真培訓(xùn)系統(tǒng)中,從而提高了油田作業(yè)培訓(xùn)的效率、效果,降低培訓(xùn)成本和安全隱患,對(duì)油田單位具有巨大的潛在的經(jīng)濟(jì)價(jià)值,對(duì)油田新型培訓(xùn)模式的發(fā)展有著重要意義[2]。
在仿真培訓(xùn)場(chǎng)景中,通過(guò)創(chuàng)建作業(yè)人員的替身(avatar)來(lái)使培訓(xùn)用戶(hù)具有臨場(chǎng)感受,每一個(gè)進(jìn)入場(chǎng)景中的用戶(hù)都具有唯一的替身來(lái)標(biāo)識(shí)。當(dāng)多個(gè)用戶(hù)處于同一場(chǎng)景中時(shí),用戶(hù)替身的位置和方向表明了該用戶(hù)在場(chǎng)景中的視點(diǎn)。因此,仿真場(chǎng)景中的多用戶(hù)交互培訓(xùn)應(yīng)滿(mǎn)足如下需求:
(1) 能逼真地模擬油田作業(yè)場(chǎng)景。盡可能逼真的模擬作業(yè)的現(xiàn)場(chǎng)環(huán)境,包括培訓(xùn)場(chǎng)景的大小、布局和各種作業(yè)設(shè)備的三維構(gòu)造等。
(2) 能感知其他用戶(hù)的存在和行為。每個(gè)加入到仿真培訓(xùn)場(chǎng)景的用戶(hù),都能觀(guān)察到其他用戶(hù)的替身。通過(guò)觀(guān)察其他用戶(hù)的替身行為,獲知其他用戶(hù)的當(dāng)前行為。
(3) 能與其他用戶(hù)進(jìn)行交互和交流。通過(guò)控制用戶(hù)替身和其他用戶(hù)進(jìn)行交互操作,并且利用輸入設(shè)備發(fā)送文字信息實(shí)現(xiàn)培訓(xùn)人員之間的相互交流。
對(duì)上述需求進(jìn)分析,通過(guò)分層結(jié)構(gòu)思想提出的系統(tǒng)框架結(jié)構(gòu)如圖1所示。
系統(tǒng)采用C/S(Client/Server)架構(gòu),分為客戶(hù)端和服務(wù)器端兩部分。
客戶(hù)端主要顯示仿真培訓(xùn)場(chǎng)景和用戶(hù)的替身角色,用戶(hù)通過(guò)輸入設(shè)備對(duì)替身進(jìn)行控制操作,利用聊天面板編輯發(fā)送文字信息和其他用戶(hù)進(jìn)行在線(xiàn)交流。交互層對(duì)每一個(gè)用戶(hù)創(chuàng)建替身,實(shí)現(xiàn)仿真培訓(xùn)場(chǎng)景的場(chǎng)景一致性維護(hù)和多用戶(hù)交互操作的并發(fā)控制以及在線(xiàn)交流等功能。數(shù)據(jù)層存儲(chǔ)模型數(shù)據(jù)、試題數(shù)據(jù)等信息。分層結(jié)構(gòu)使系統(tǒng)具有良好的擴(kuò)展性、靈活性和可維護(hù)性[3]。

圖1 培訓(xùn)系統(tǒng)框架結(jié)構(gòu)
仿真培訓(xùn)系統(tǒng)中,替身和場(chǎng)景的狀態(tài)一致性控制與用戶(hù)在線(xiàn)交流分別由不同的程序完成。客戶(hù)端和服務(wù)器端之間采用TCP進(jìn)行替身和場(chǎng)景的狀態(tài)數(shù)據(jù)傳遞。客戶(hù)端負(fù)責(zé)發(fā)送本地用戶(hù)替身和場(chǎng)景變化的數(shù)據(jù)給服務(wù)端,同時(shí)從服務(wù)器端接收其他用戶(hù)和場(chǎng)景的最新?tīng)顟B(tài)數(shù)據(jù)并進(jìn)行實(shí)時(shí)更新,從而達(dá)到多用戶(hù)狀態(tài)的一致性控制。用戶(hù)之間的在線(xiàn)交流也采用TCP進(jìn)行數(shù)據(jù)的發(fā)送和接收,從而能夠保證交流信息的實(shí)時(shí)性。系統(tǒng)中多用戶(hù)交互的工作原理如圖2所示。

圖2 交互工作原理
替身作為用戶(hù)在仿真培訓(xùn)場(chǎng)景中的主要操作對(duì)象,能夠使用戶(hù)切身感受到接近實(shí)際現(xiàn)場(chǎng)的作業(yè)環(huán)境。系統(tǒng)為每一個(gè)進(jìn)入培訓(xùn)場(chǎng)景中的用戶(hù)自動(dòng)創(chuàng)建替身,每個(gè)替身均通過(guò)ID進(jìn)行唯一性標(biāo)識(shí)。如圖3所示。

(1) ID=1角色(2) ID=2角色
圖3 用戶(hù)替身
用戶(hù)的替身被創(chuàng)建好之后,可以通過(guò)輸入設(shè)備控制替身在仿真培訓(xùn)場(chǎng)景中漫游。通過(guò)鍵盤(pán)按鍵W、S、A、D控制替身的前、后、左、右移動(dòng)[4]。移動(dòng)過(guò)程中,通過(guò)Animator Controller播放人物運(yùn)動(dòng)動(dòng)畫(huà)。獲取按鍵輸入使用Input.GetKey(KeyCode.W)方法,控制替身移動(dòng)則采用transform.Translate(new Vector3(distance,0,0)),設(shè)置不同的Vector參數(shù)來(lái)控制不同的移動(dòng)方向。對(duì)于替身視角變化,腳本中使用Input.GetAxis("Mouse X")和Input.GetAxis("Mouse Y")來(lái)獲取鼠標(biāo)在屏幕水平和豎直方向的位移,使替身視角隨鼠標(biāo)移動(dòng)而變化。
在操控替身進(jìn)行漫游時(shí),用戶(hù)想要操作場(chǎng)景中的某一設(shè)備則通過(guò)鼠標(biāo)點(diǎn)擊設(shè)備進(jìn)行選中,獲得設(shè)備的操作權(quán)限后進(jìn)行相應(yīng)的操作。通過(guò) Ray ray =Camera.main.ScreenPointToRay(Input.mousePosition)方法,使主相機(jī)根據(jù)鼠標(biāo)點(diǎn)擊位置發(fā)出射線(xiàn),對(duì)射線(xiàn)觸碰到的模型進(jìn)行選取判斷。
培訓(xùn)系統(tǒng)中的所有用戶(hù)均會(huì)被分配不同的操作任務(wù),包括獨(dú)立操作和多用戶(hù)協(xié)同操作的任務(wù)。針對(duì)在培訓(xùn)過(guò)程中,多個(gè)用戶(hù)對(duì)同一設(shè)備進(jìn)行獨(dú)立操作而發(fā)生沖突的問(wèn)題,提出一種沖突解決模型。通過(guò)聲明一個(gè)int型的數(shù)組flag[]來(lái)保存場(chǎng)景中設(shè)備部件的操作權(quán)限是否已被用戶(hù)獲取。假設(shè)一個(gè)部件編號(hào)為x,當(dāng)flag[x]=1,表示該部件正在被某個(gè)用戶(hù)操作,其他用戶(hù)均不能對(duì)其選中和操作,并通過(guò)彈窗消息進(jìn)行提示;當(dāng)flag[x]=0時(shí),則表示用戶(hù)可以獲取該部件的操作權(quán)限,選中該部件獲得權(quán)限后進(jìn)行相應(yīng)操作。flag數(shù)組由服務(wù)器同步到所有的客戶(hù)端,使所有的用戶(hù)均能實(shí)時(shí)獲取到場(chǎng)景中可操作部件的權(quán)限信息。
培訓(xùn)過(guò)程中針對(duì)某些設(shè)備的協(xié)同操作任務(wù),需要多個(gè)用戶(hù)協(xié)同完成。參與操作的用戶(hù)通過(guò)輸入設(shè)備輸入操作信息(Package),操作信息包括對(duì)設(shè)備位置移動(dòng),角度變化。客戶(hù)端將操作信息通過(guò)SendStatus方法發(fā)送到服務(wù)器,由服務(wù)器ProcessPackage方法進(jìn)行處理。如果服務(wù)器判斷多個(gè)用戶(hù)的操作信息一致(如:操作設(shè)備向上移動(dòng)),則向客戶(hù)端發(fā)送可執(zhí)行指令,由客戶(hù)端執(zhí)行對(duì)應(yīng)操作。當(dāng)操作信息不一致時(shí)(如:用戶(hù)1操作設(shè)備向上移動(dòng),用戶(hù)2操作設(shè)備向右移動(dòng)),則操作不會(huì)執(zhí)行。多用戶(hù)協(xié)同操作設(shè)備使其向上移動(dòng)一段距離,如圖4所示。

圖4 協(xié)同操作設(shè)備
在進(jìn)行油田作業(yè)仿真培訓(xùn)過(guò)程中,為便于在仿真開(kāi)始后用戶(hù)進(jìn)行操作任務(wù)分配和操作過(guò)程中多用戶(hù)之間的交流溝通和協(xié)作,構(gòu)建一個(gè)在線(xiàn)交流功能模塊。
在服務(wù)器端的類(lèi)中,定義一個(gè)ArrayList來(lái)保存聊天用戶(hù) IP,用戶(hù)連接服務(wù)器成功后將當(dāng)前在線(xiàn)的用戶(hù) IP 地址添加到隊(duì)列中,然后不斷的從客戶(hù)端接收消息,對(duì)信息進(jìn)行UTF-8編碼后向 IP 隊(duì)列中的用戶(hù)廣播消息,編碼能夠確保漢字信息能夠被傳遞。服務(wù)器類(lèi)的描述方法如下:
class ChatClient
{
public ArrayList ALLClients = new ArrayList( ); //客戶(hù)列表
public string _client IP; //客戶(hù)端 IP
public ChatClient( );// 把當(dāng)前用戶(hù)實(shí)例加入用戶(hù)列表當(dāng)中
public void ReceiveMessage( );//接受客戶(hù)端消息
public void SendMessage( );// 向客戶(hù)端發(fā)送消息
public void Broadcast( );// 向客戶(hù)端廣播消息
}
在客戶(hù)端中,通過(guò) GUI 的連接按鈕發(fā)送聊天請(qǐng)求,并設(shè)置聊天名稱(chēng),在輸入框中輸入聊天消息,客戶(hù)端獲取消息后對(duì)消息進(jìn)行編碼后發(fā)送給服務(wù)器端,同時(shí)將服務(wù)器廣播的消息解碼后顯示在 GUI 的聊天信息界面中。用戶(hù)聊天界面如圖5所示。
本文通過(guò)對(duì)虛擬環(huán)境下多用戶(hù)交互關(guān)鍵技術(shù)研究,并將研究成果應(yīng)用于油田作業(yè)仿真培訓(xùn)系統(tǒng)。該系統(tǒng)通過(guò)建立多人網(wǎng)絡(luò)虛擬環(huán)境,實(shí)現(xiàn)了多人在線(xiàn)實(shí)時(shí)交互功能,彌補(bǔ)了多數(shù)培訓(xùn)系統(tǒng)只能進(jìn)行獨(dú)立崗位學(xué)習(xí)的缺點(diǎn),優(yōu)化了虛擬仿真培訓(xùn)的開(kāi)發(fā)模式,提升了虛擬培訓(xùn)效果。為了避免網(wǎng)絡(luò)延遲、系統(tǒng)運(yùn)行卡頓、模型相交重疊等情況,還需要在數(shù)據(jù)傳遞、系統(tǒng)優(yōu)化、碰撞檢測(cè)等方面進(jìn)一步研究。

圖5 聊天界面