蔡凱駿1, 張偉明1, 趙鴻飛, 師 磊
(1.陸軍勤務學院 油料系,重慶 401331;2.中國人民解放軍 31605部隊,南京 211100)
輸油泵機組是輸油管線系統的核心設備,主要包括發動機、離心泵和增速器等,在石油化工和軍事供油領域具有重要應用。正確、熟練的維修活動是保持泵機組較高可用度的關鍵,其中拆卸與裝配是所有維修活動中普遍存在的步驟,因此針對使用人員的維修拆裝訓練尤為重要。傳統維修拆裝訓練主要依靠實裝進行,受場地、時間、費用等因素限制,訓練效果受到一定影響。隨著虛擬現實技術的不斷發展與成熟,其在維修領域的應用研究引起了廣泛關注[1]。Abate等[2]開發了面向航天領域的虛擬訓練系統,Jayaram等[3]研究了人體工效學虛擬評估系統,楊新紅等[4]分別開發了車輛虛擬實驗系統。但是,上述系統針對產品的結構展示與操作,受訓者主要采用觀看以及少量操作的方式參與訓練。而針對輸油泵機組維修拆裝的虛擬訓練系統需要受訓者利用鼠標等設備進行大量操作以達到較好的訓練效果,系統的交互性明顯增強。鄒俞等[5]、崔慶春等[6]分別基于Kinect和OSG開發了沉浸式的交互式訓練系統。但是沉浸式系統的造價高昂,操作精度受設備影響。與之相比,桌面式系統成本低、易于開發且操作方便,適合面向拆裝訓練的虛擬維修系統。因此,本文研究了面向輸油泵機組虛擬拆卸與裝配訓練的關鍵技術并設計了相應的桌面式虛擬維修系統。
仿真平臺是虛擬維修訓練系統實現擬實視覺效果和人機交互的基礎。當前圖形程序接口OpenGL以及面向Web三維虛擬仿真的Java 3D、VRML等可用于構建虛擬維修仿真平臺[7],但是利用上述編程語言開發效率較低,難度較大。現有的成熟商用虛擬現實軟件由于易學易用易獲取且性能較好,被廣泛應用于虛擬維修訓練系統的設計與開發[8-13],總結各軟件平臺的功能、特點及其適合應用領域如表1所示。
面向拆卸與裝配的輸油泵機組虛擬維修訓練系統需要較強的交互性和較好的視覺效果。通過對比可以看出,Unity3D具有視覺效果好,交互式設計方便,靈活易操作等突出優勢,故選取Unity3D作為系統開發平臺。

表1 不同虛擬維修仿真平臺對比
系統主要作用是使輸油泵機組使用、維修人員掌握設備維修拆裝的要求與方法,提高維修能力與效率,因此對系統提出功能和性能兩方面需求。
功能需求主要包括:
1)能對設備常見保養、故障維修進行訓練,能通過鍵盤、鼠標等實現交互式拆裝。
2)采集操作過程數據并考評。性能需求方面,系統能在所有windows系統中使用。為保證適用性,系統在具有中低等配置的計算機(處理器Inter Core i5 2410M,圖形處理器 NVIDIA GeForce GT 550M,內存2 GB)運行時,場景渲染頻率不小于30FPS(Frames Per Second)。
本文參考了國內外通用虛擬訓練(General Virtual Environment, GVE)體系理念[14-15],針對輸油泵機組使用過程中的維修情況,提出如圖1所示的多層次模塊化訓練結構體系。系統主要包括維修訓練,技能考核兩大部分。
1)維修訓練按照從簡到難的順序,包括子裝配體拆裝訓練、設備保養、故障維修、完全拆解與裝配4個內容。受訓者通過鼠標點擊拖拽與鍵盤操作相結合完成相應維修拆裝任務,交互性較強。
2)技能考核考察受訓者設備維修技能的掌握程度。獲取、分析維修過程中各步驟完成時間、使用提示次數、錯誤操作次數等數據并進行打分。

圖1 系統多層次模塊化體系結構圖
系統交互式拆裝設計目的是使受訓者經過自主判斷后,可通過鼠標、鍵盤完成零部件的拆裝、工具的拾取等操作,更好地模擬實際維修過程,主要功能如下:
1)受訓者移動鼠標光標至目標零件上的任意位置,按住左鍵并移動鼠標可實現拖拽效果。
2)零件在拖拽過程中始終沿著預定的拆裝路徑移動。
3)零件移動時限于初始位置和目標位置之間。拖拽零件到達指定位置后,零件不能再拖動。
為實現上述功能,鼠標拖動時零件位置計算是關鍵,對此提出如下算法。
Step1:根據零件在世界坐標系的坐標值PWorld,通過WorldToScreenPoint函數得到屏幕坐標系的坐標值PScreen。
Step2:鼠標點擊時計算鼠標光標位置與零件中心位置的偏差向量d。每次鼠標點擊時Unity調用OnMouseDown函數,在該函數中將PScreen中Z軸的值PScreen.z賦給MScreen.z,其中MScreen為鼠標光標位置在屏幕坐標系的坐標值。通過ScreenToWorldPoint函數得到光標在世界坐標系的坐標值MWorld。計算鼠標光標位置與零件中心位置的偏差向量d=PWorld-MWorld。



圖2為零件位置計算示意圖,圖3為算法流程圖。

圖2 零件位置計算示意圖

圖3 算法流程示意圖
拆卸與裝配過程中,由于裝配關系的約束,待拆裝零件滿足一定的拆裝順序。因此對于某一零件,需根據其它相關零件的狀態以決定其是否可拆裝。Unity提供了Update函數在系統運行的每一幀調用一次。因此在該函數中利用條件判斷語句可實現零件狀態的實時監控,是一種較為方便的方法。但是當某一維修過程涉及零部件數量眾多時,利用Update函數監控所有零部件狀態會造成大量計算資源的浪費,嚴重時造成運行畫面的卡頓現象。對此本文研究了一種基于事件驅動的改進方案。
事件驅動的實現主要依賴以下3個核心部分:
1)事件監聽器:事件監聽器需要被告知事件是否發生,因此將需要根據其它零件的拆裝狀態來決定自己是否可拆裝的零件定義為事件監聽器。
2)消息傳遞器:當某一事件發生時,消息傳遞器發送相關消息至該事件的全部監聽器。
3)事件管理器:設置為單例持久對象以提供全局訪問行為。事件管理器連接監聽器與傳遞器,并接收傳遞器發送的消息然后以事件的形式發送給監聽器。
例如某拆卸過程中,零件A和B拆卸后零件C才可拆,實現這一關系的事件驅動原理如圖4所示。

圖4 事件驅動原理
首先定義了IListener接口,通過繼承接口,其它對象根據多態機制可調用接口函數,因此任何類型對象均可設置為事件監聽器。IListener接口偽代碼如下:
public enum EVENT_NAME{事件A,事件B,事件C,……}
public interface IListener
{
Event (EVENT_NAME Event_Name, Component Sender, Object Param=null) {}
}
使零件C繼承IListener接口,則零件C可設置為事件監聽器。
事件管理器主要包括添加監聽器和消息傳遞器兩個函數。其中消息傳遞器的作用是將發生的事件通知相應監聽器。事件管理器偽代碼如下:
事件管理器
{
定義Dictionary< EVENT_NAME,List
添加監聽器(EVENT_NAME Event_Name, IListener Listener)
{
if(事件Event_Name已存在監聽器列表)
將Listener添加進列表;
else
{
新建監聽器列表,將Listener添加進列表;
將Event_Name與監聽器列表添加進監聽器數組Listeners;
}
}
消息傳遞器(EVENT_NAME Event_Name, Component Sender, Object Param=null)
{
if(Event_Name事件沒有對應監聽器)
返回;
遍歷事件Event_Name的所有監聽器,調用監聽器的Event函數;
}
移除事件(EVENT_Name Event_Name)
{
移除Listeners中的Event_Type項;
}
}
零件C通過事件管理器的添加監聽器方法,針對零件A完成拆卸和零件B完成拆卸這兩個事件注冊為監聽器。當零件A和零件B完成拆卸時,通過消息傳遞器通知零件C,C利用Event函數使其自身處于可拆卸狀態。
相比利用Update函數系統每一幀對零件狀態進行判斷,基于事件驅動的方法只需在事件發生時將消息通知監聽器,很大程度上節省了計算資源。
根據前述相關技術,基于Unity3D軟件設計并開發了輸油泵機組虛擬維修訓練系統。維修拆裝訓練過程如圖5(a)所示。維修拆裝訓練或技能考核科目結束后存儲受訓者各操作步驟的完成時間、錯誤操作次數、使用提示次數等數據如圖5(b)所示。

圖5 系統實現
利用Profiler工具對系統性能進行測試。當系統運行時,Profiler工具獲取中央處理器、圖形處理器的負載、幀率等性能數據并提供圖形化顯示。系統硬件平臺同2.1節,進行拆裝訓練時的性能數據如圖6所示。圖中橫坐標表示幀,縱坐標顯示了各幀的幀率、時間和計算開銷,其中較大值反映了苛刻的運行環境,此時幀率較低,計算開銷較大。受訓者開始拆裝訓練時還未將視角移動至設備處,這時設備模型未在屏幕顯示,系統幀率保持在60FPS以上,如圖前半段所示。當受訓者將視角移動至設備處并開始維修操作時,系統計算開銷增大、幀率降低,如圖后半段所示,但仍保持在30FPS以上,滿足系統性能需求。系統在整個訓練過程中運行流暢,維修模擬效果較好,驗證了本文方法的有效性。

圖6 系統運行性能
1)本文總結了現有主流虛擬維修仿真平臺的特點及適用領域,分析了以Unity3D作為系統開發平臺的優勢。
2)依據系統面向的對象和目的,分析了系統功能和性能需求。設計了系統多層次模塊化體系結構,確定了主要包含的訓練科目。
3)提出了零件位置更新算法,實現了維修訓練時鼠標拖動零件的交互式拆裝功能。針對維修過程中零件拆裝的先后順序問題,研究了基于事件驅動編程的改進方法,節省了計算資源。
4)經實際運行測試,系統滿足各項功能和性能需求,維修模擬效果較好,驗證了本文方法的有效性。系統不僅滿足輸油泵機組維修訓練的需求,還可為其它產品的維修拆裝訓練系統設計提供參考。