蔡凱駿1, 張偉明1, 趙鴻飛, 師 磊
(1.陸軍勤務(wù)學(xué)院 油料系,重慶 401331;2.中國(guó)人民解放軍 31605部隊(duì),南京 211100)
輸油泵機(jī)組是輸油管線系統(tǒng)的核心設(shè)備,主要包括發(fā)動(dòng)機(jī)、離心泵和增速器等,在石油化工和軍事供油領(lǐng)域具有重要應(yīng)用。正確、熟練的維修活動(dòng)是保持泵機(jī)組較高可用度的關(guān)鍵,其中拆卸與裝配是所有維修活動(dòng)中普遍存在的步驟,因此針對(duì)使用人員的維修拆裝訓(xùn)練尤為重要。傳統(tǒng)維修拆裝訓(xùn)練主要依靠實(shí)裝進(jìn)行,受場(chǎng)地、時(shí)間、費(fèi)用等因素限制,訓(xùn)練效果受到一定影響。隨著虛擬現(xiàn)實(shí)技術(shù)的不斷發(fā)展與成熟,其在維修領(lǐng)域的應(yīng)用研究引起了廣泛關(guān)注[1]。Abate等[2]開(kāi)發(fā)了面向航天領(lǐng)域的虛擬訓(xùn)練系統(tǒng),Jayaram等[3]研究了人體工效學(xué)虛擬評(píng)估系統(tǒng),楊新紅等[4]分別開(kāi)發(fā)了車輛虛擬實(shí)驗(yàn)系統(tǒng)。但是,上述系統(tǒng)針對(duì)產(chǎn)品的結(jié)構(gòu)展示與操作,受訓(xùn)者主要采用觀看以及少量操作的方式參與訓(xùn)練。而針對(duì)輸油泵機(jī)組維修拆裝的虛擬訓(xùn)練系統(tǒng)需要受訓(xùn)者利用鼠標(biāo)等設(shè)備進(jìn)行大量操作以達(dá)到較好的訓(xùn)練效果,系統(tǒng)的交互性明顯增強(qiáng)。鄒俞等[5]、崔慶春等[6]分別基于Kinect和OSG開(kāi)發(fā)了沉浸式的交互式訓(xùn)練系統(tǒng)。但是沉浸式系統(tǒng)的造價(jià)高昂,操作精度受設(shè)備影響。與之相比,桌面式系統(tǒng)成本低、易于開(kāi)發(fā)且操作方便,適合面向拆裝訓(xùn)練的虛擬維修系統(tǒng)。因此,本文研究了面向輸油泵機(jī)組虛擬拆卸與裝配訓(xùn)練的關(guān)鍵技術(shù)并設(shè)計(jì)了相應(yīng)的桌面式虛擬維修系統(tǒng)。
仿真平臺(tái)是虛擬維修訓(xùn)練系統(tǒng)實(shí)現(xiàn)擬實(shí)視覺(jué)效果和人機(jī)交互的基礎(chǔ)。當(dāng)前圖形程序接口OpenGL以及面向Web三維虛擬仿真的Java 3D、VRML等可用于構(gòu)建虛擬維修仿真平臺(tái)[7],但是利用上述編程語(yǔ)言開(kāi)發(fā)效率較低,難度較大。現(xiàn)有的成熟商用虛擬現(xiàn)實(shí)軟件由于易學(xué)易用易獲取且性能較好,被廣泛應(yīng)用于虛擬維修訓(xùn)練系統(tǒng)的設(shè)計(jì)與開(kāi)發(fā)[8-13],總結(jié)各軟件平臺(tái)的功能、特點(diǎn)及其適合應(yīng)用領(lǐng)域如表1所示。
面向拆卸與裝配的輸油泵機(jī)組虛擬維修訓(xùn)練系統(tǒng)需要較強(qiáng)的交互性和較好的視覺(jué)效果。通過(guò)對(duì)比可以看出,Unity3D具有視覺(jué)效果好,交互式設(shè)計(jì)方便,靈活易操作等突出優(yōu)勢(shì),故選取Unity3D作為系統(tǒng)開(kāi)發(fā)平臺(tái)。
表1 不同虛擬維修仿真平臺(tái)對(duì)比
系統(tǒng)主要作用是使輸油泵機(jī)組使用、維修人員掌握設(shè)備維修拆裝的要求與方法,提高維修能力與效率,因此對(duì)系統(tǒng)提出功能和性能兩方面需求。
功能需求主要包括:
1)能對(duì)設(shè)備常見(jiàn)保養(yǎng)、故障維修進(jìn)行訓(xùn)練,能通過(guò)鍵盤、鼠標(biāo)等實(shí)現(xiàn)交互式拆裝。
2)采集操作過(guò)程數(shù)據(jù)并考評(píng)。性能需求方面,系統(tǒng)能在所有windows系統(tǒng)中使用。為保證適用性,系統(tǒng)在具有中低等配置的計(jì)算機(jī)(處理器Inter Core i5 2410M,圖形處理器 NVIDIA GeForce GT 550M,內(nèi)存2 GB)運(yùn)行時(shí),場(chǎng)景渲染頻率不小于30FPS(Frames Per Second)。
本文參考了國(guó)內(nèi)外通用虛擬訓(xùn)練(General Virtual Environment, GVE)體系理念[14-15],針對(duì)輸油泵機(jī)組使用過(guò)程中的維修情況,提出如圖1所示的多層次模塊化訓(xùn)練結(jié)構(gòu)體系。系統(tǒng)主要包括維修訓(xùn)練,技能考核兩大部分。
1)維修訓(xùn)練按照從簡(jiǎn)到難的順序,包括子裝配體拆裝訓(xùn)練、設(shè)備保養(yǎng)、故障維修、完全拆解與裝配4個(gè)內(nèi)容。受訓(xùn)者通過(guò)鼠標(biāo)點(diǎn)擊拖拽與鍵盤操作相結(jié)合完成相應(yīng)維修拆裝任務(wù),交互性較強(qiáng)。
2)技能考核考察受訓(xùn)者設(shè)備維修技能的掌握程度。獲取、分析維修過(guò)程中各步驟完成時(shí)間、使用提示次數(shù)、錯(cuò)誤操作次數(shù)等數(shù)據(jù)并進(jìn)行打分。
圖1 系統(tǒng)多層次模塊化體系結(jié)構(gòu)圖
系統(tǒng)交互式拆裝設(shè)計(jì)目的是使受訓(xùn)者經(jīng)過(guò)自主判斷后,可通過(guò)鼠標(biāo)、鍵盤完成零部件的拆裝、工具的拾取等操作,更好地模擬實(shí)際維修過(guò)程,主要功能如下:
1)受訓(xùn)者移動(dòng)鼠標(biāo)光標(biāo)至目標(biāo)零件上的任意位置,按住左鍵并移動(dòng)鼠標(biāo)可實(shí)現(xiàn)拖拽效果。
2)零件在拖拽過(guò)程中始終沿著預(yù)定的拆裝路徑移動(dòng)。
3)零件移動(dòng)時(shí)限于初始位置和目標(biāo)位置之間。拖拽零件到達(dá)指定位置后,零件不能再拖動(dòng)。
為實(shí)現(xiàn)上述功能,鼠標(biāo)拖動(dòng)時(shí)零件位置計(jì)算是關(guān)鍵,對(duì)此提出如下算法。
Step1:根據(jù)零件在世界坐標(biāo)系的坐標(biāo)值PWorld,通過(guò)WorldToScreenPoint函數(shù)得到屏幕坐標(biāo)系的坐標(biāo)值PScreen。
Step2:鼠標(biāo)點(diǎn)擊時(shí)計(jì)算鼠標(biāo)光標(biāo)位置與零件中心位置的偏差向量d。每次鼠標(biāo)點(diǎn)擊時(shí)Unity調(diào)用OnMouseDown函數(shù),在該函數(shù)中將PScreen中Z軸的值PScreen.z賦給MScreen.z,其中MScreen為鼠標(biāo)光標(biāo)位置在屏幕坐標(biāo)系的坐標(biāo)值。通過(guò)ScreenToWorldPoint函數(shù)得到光標(biāo)在世界坐標(biāo)系的坐標(biāo)值MWorld。計(jì)算鼠標(biāo)光標(biāo)位置與零件中心位置的偏差向量d=PWorld-MWorld。
圖2為零件位置計(jì)算示意圖,圖3為算法流程圖。
圖2 零件位置計(jì)算示意圖
圖3 算法流程示意圖
拆卸與裝配過(guò)程中,由于裝配關(guān)系的約束,待拆裝零件滿足一定的拆裝順序。因此對(duì)于某一零件,需根據(jù)其它相關(guān)零件的狀態(tài)以決定其是否可拆裝。Unity提供了Update函數(shù)在系統(tǒng)運(yùn)行的每一幀調(diào)用一次。因此在該函數(shù)中利用條件判斷語(yǔ)句可實(shí)現(xiàn)零件狀態(tài)的實(shí)時(shí)監(jiān)控,是一種較為方便的方法。但是當(dāng)某一維修過(guò)程涉及零部件數(shù)量眾多時(shí),利用Update函數(shù)監(jiān)控所有零部件狀態(tài)會(huì)造成大量計(jì)算資源的浪費(fèi),嚴(yán)重時(shí)造成運(yùn)行畫面的卡頓現(xiàn)象。對(duì)此本文研究了一種基于事件驅(qū)動(dòng)的改進(jìn)方案。
事件驅(qū)動(dòng)的實(shí)現(xiàn)主要依賴以下3個(gè)核心部分:
1)事件監(jiān)聽(tīng)器:事件監(jiān)聽(tīng)器需要被告知事件是否發(fā)生,因此將需要根據(jù)其它零件的拆裝狀態(tài)來(lái)決定自己是否可拆裝的零件定義為事件監(jiān)聽(tīng)器。
2)消息傳遞器:當(dāng)某一事件發(fā)生時(shí),消息傳遞器發(fā)送相關(guān)消息至該事件的全部監(jiān)聽(tīng)器。
3)事件管理器:設(shè)置為單例持久對(duì)象以提供全局訪問(wèn)行為。事件管理器連接監(jiān)聽(tīng)器與傳遞器,并接收傳遞器發(fā)送的消息然后以事件的形式發(fā)送給監(jiān)聽(tīng)器。
例如某拆卸過(guò)程中,零件A和B拆卸后零件C才可拆,實(shí)現(xiàn)這一關(guān)系的事件驅(qū)動(dòng)原理如圖4所示。
圖4 事件驅(qū)動(dòng)原理
首先定義了IListener接口,通過(guò)繼承接口,其它對(duì)象根據(jù)多態(tài)機(jī)制可調(diào)用接口函數(shù),因此任何類型對(duì)象均可設(shè)置為事件監(jiān)聽(tīng)器。IListener接口偽代碼如下:
public enum EVENT_NAME{事件A,事件B,事件C,……}
public interface IListener
{
Event (EVENT_NAME Event_Name, Component Sender, Object Param=null) {}
}
使零件C繼承IListener接口,則零件C可設(shè)置為事件監(jiān)聽(tīng)器。
事件管理器主要包括添加監(jiān)聽(tīng)器和消息傳遞器兩個(gè)函數(shù)。其中消息傳遞器的作用是將發(fā)生的事件通知相應(yīng)監(jiān)聽(tīng)器。事件管理器偽代碼如下:
事件管理器
{
定義Dictionary< EVENT_NAME,List
添加監(jiān)聽(tīng)器(EVENT_NAME Event_Name, IListener Listener)
{
if(事件Event_Name已存在監(jiān)聽(tīng)器列表)
將Listener添加進(jìn)列表;
else
{
新建監(jiān)聽(tīng)器列表,將Listener添加進(jìn)列表;
將Event_Name與監(jiān)聽(tīng)器列表添加進(jìn)監(jiān)聽(tīng)器數(shù)組Listeners;
}
}
消息傳遞器(EVENT_NAME Event_Name, Component Sender, Object Param=null)
{
if(Event_Name事件沒(méi)有對(duì)應(yīng)監(jiān)聽(tīng)器)
返回;
遍歷事件Event_Name的所有監(jiān)聽(tīng)器,調(diào)用監(jiān)聽(tīng)器的Event函數(shù);
}
移除事件(EVENT_Name Event_Name)
{
移除Listeners中的Event_Type項(xiàng);
}
}
零件C通過(guò)事件管理器的添加監(jiān)聽(tīng)器方法,針對(duì)零件A完成拆卸和零件B完成拆卸這兩個(gè)事件注冊(cè)為監(jiān)聽(tīng)器。當(dāng)零件A和零件B完成拆卸時(shí),通過(guò)消息傳遞器通知零件C,C利用Event函數(shù)使其自身處于可拆卸狀態(tài)。
相比利用Update函數(shù)系統(tǒng)每一幀對(duì)零件狀態(tài)進(jìn)行判斷,基于事件驅(qū)動(dòng)的方法只需在事件發(fā)生時(shí)將消息通知監(jiān)聽(tīng)器,很大程度上節(jié)省了計(jì)算資源。
根據(jù)前述相關(guān)技術(shù),基于Unity3D軟件設(shè)計(jì)并開(kāi)發(fā)了輸油泵機(jī)組虛擬維修訓(xùn)練系統(tǒng)。維修拆裝訓(xùn)練過(guò)程如圖5(a)所示。維修拆裝訓(xùn)練或技能考核科目結(jié)束后存儲(chǔ)受訓(xùn)者各操作步驟的完成時(shí)間、錯(cuò)誤操作次數(shù)、使用提示次數(shù)等數(shù)據(jù)如圖5(b)所示。
圖5 系統(tǒng)實(shí)現(xiàn)
利用Profiler工具對(duì)系統(tǒng)性能進(jìn)行測(cè)試。當(dāng)系統(tǒng)運(yùn)行時(shí),Profiler工具獲取中央處理器、圖形處理器的負(fù)載、幀率等性能數(shù)據(jù)并提供圖形化顯示。系統(tǒng)硬件平臺(tái)同2.1節(jié),進(jìn)行拆裝訓(xùn)練時(shí)的性能數(shù)據(jù)如圖6所示。圖中橫坐標(biāo)表示幀,縱坐標(biāo)顯示了各幀的幀率、時(shí)間和計(jì)算開(kāi)銷,其中較大值反映了苛刻的運(yùn)行環(huán)境,此時(shí)幀率較低,計(jì)算開(kāi)銷較大。受訓(xùn)者開(kāi)始拆裝訓(xùn)練時(shí)還未將視角移動(dòng)至設(shè)備處,這時(shí)設(shè)備模型未在屏幕顯示,系統(tǒng)幀率保持在60FPS以上,如圖前半段所示。當(dāng)受訓(xùn)者將視角移動(dòng)至設(shè)備處并開(kāi)始維修操作時(shí),系統(tǒng)計(jì)算開(kāi)銷增大、幀率降低,如圖后半段所示,但仍保持在30FPS以上,滿足系統(tǒng)性能需求。系統(tǒng)在整個(gè)訓(xùn)練過(guò)程中運(yùn)行流暢,維修模擬效果較好,驗(yàn)證了本文方法的有效性。
圖6 系統(tǒng)運(yùn)行性能
1)本文總結(jié)了現(xiàn)有主流虛擬維修仿真平臺(tái)的特點(diǎn)及適用領(lǐng)域,分析了以Unity3D作為系統(tǒng)開(kāi)發(fā)平臺(tái)的優(yōu)勢(shì)。
2)依據(jù)系統(tǒng)面向的對(duì)象和目的,分析了系統(tǒng)功能和性能需求。設(shè)計(jì)了系統(tǒng)多層次模塊化體系結(jié)構(gòu),確定了主要包含的訓(xùn)練科目。
3)提出了零件位置更新算法,實(shí)現(xiàn)了維修訓(xùn)練時(shí)鼠標(biāo)拖動(dòng)零件的交互式拆裝功能。針對(duì)維修過(guò)程中零件拆裝的先后順序問(wèn)題,研究了基于事件驅(qū)動(dòng)編程的改進(jìn)方法,節(jié)省了計(jì)算資源。
4)經(jīng)實(shí)際運(yùn)行測(cè)試,系統(tǒng)滿足各項(xiàng)功能和性能需求,維修模擬效果較好,驗(yàn)證了本文方法的有效性。系統(tǒng)不僅滿足輸油泵機(jī)組維修訓(xùn)練的需求,還可為其它產(chǎn)品的維修拆裝訓(xùn)練系統(tǒng)設(shè)計(jì)提供參考。