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

圖1 培訓系統框架結構
仿真培訓系統中,替身和場景的狀態一致性控制與用戶在線交流分別由不同的程序完成。客戶端和服務器端之間采用TCP進行替身和場景的狀態數據傳遞。客戶端負責發送本地用戶替身和場景變化的數據給服務端,同時從服務器端接收其他用戶和場景的最新狀態數據并進行實時更新,從而達到多用戶狀態的一致性控制。用戶之間的在線交流也采用TCP進行數據的發送和接收,從而能夠保證交流信息的實時性。系統中多用戶交互的工作原理如圖2所示。

圖2 交互工作原理
替身作為用戶在仿真培訓場景中的主要操作對象,能夠使用戶切身感受到接近實際現場的作業環境。系統為每一個進入培訓場景中的用戶自動創建替身,每個替身均通過ID進行唯一性標識。如圖3所示。

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

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

圖5 聊天界面