李 翼 徐仁桐 李舒明 呂建軍 韋乃琨
(1福建船政交通職業(yè)學院輪機工程系 福建福州 350007;2上海船舶工藝研究所 上海 200032)
虛擬裝配是采用虛擬現(xiàn)實技術(shù)、三維仿真技術(shù)、計算機圖形學技術(shù)等構(gòu)建交互式的虛擬環(huán)境[1],用戶使用交互設(shè)備在該環(huán)境中進行裝配操作的一種方法。虛擬裝配在軍事、船舶、航空等領(lǐng)域應(yīng)用廣泛,可以對產(chǎn)品設(shè)備進行可裝配性分析檢查,對裝配人員進行培訓。
虛擬裝配的交互方式有很多,最常用的是采用鼠標鍵盤進行控制,該方式方便、快捷,但沉浸感、交互感不強。采用HTC Vive或Oculus Rift頭盔配合Unity3D也可以實現(xiàn)虛擬裝配,但頭盔中看到的虛擬裝配環(huán)境畫質(zhì)顆粒感較大,畫面會卡頓、延遲,讓人眩暈。
采用Worldviz公司的PPT產(chǎn)品配合Unity3D進行船體交互操作裝配[2]。PPT作為一款實時光學追蹤系統(tǒng),具有追蹤精度高,追蹤范圍廣(可達到50m×50m),抗干擾強等特點,已成功在波音、福特得到推廣運用。PPT可以通過多種方式和軟件連接,主要有VRPN協(xié)議,RS-232接口、共享內(nèi)存等方式。Unity3D是一款時下熱門的虛擬仿真引擎[3],它能輕松搭建三維場景,開發(fā)交互動畫,制作場景特效,在游戲開發(fā)、房地產(chǎn)展示、VR/AR/MR(即Virtual Reality/Augmented Reality/Mixed Reality)、工業(yè)制造、軍事演練等領(lǐng)域運用廣泛。
PPT追蹤系統(tǒng)主要包括4個光學攝像頭,1個Eyes頭部跟蹤、1個Wand手柄、1個標定板,設(shè)備如圖1所示。Eyes和Wand上面具有多個LED Marker:其中Eyes有2個LED Marker,擁有5個自由度;Wand有3個Marker,擁有6個自由度。
虛擬裝配數(shù)據(jù)主要通過PPT追蹤系統(tǒng)獲取。首先通過標定板校準四個相機鏡頭,并確定正方向,構(gòu)成一個虛擬3D空間,如圖1所示。當Wand和Eyes在跟蹤空間中運動時,光學攝像頭能夠?qū)崟r精確地捕捉其空間位置和角度數(shù)據(jù),再通過PPT Studio N換算成標準的位置和旋轉(zhuǎn)數(shù)據(jù)。
圖1 校準3D空間
PPT獲取的標準數(shù)據(jù)通過VRPN協(xié)議進行傳輸。VRPN是一個將虛擬現(xiàn)實系統(tǒng)應(yīng)用程序和外圍設(shè)備進行通信的網(wǎng)絡(luò)接口[4],它由一套類庫組成。文章采用VRPN 7.33進行數(shù)據(jù)通信。利用CMake將VRPN源代碼進行編譯,并添加bin到path環(huán)境變量。VRPN所獲取的數(shù)據(jù),通過邏輯抽象層將相同類型的外設(shè)抽象為都派生于同一個基類的子類,例如所有的軸數(shù)據(jù)信息都派生于VRPN_Analog基類。VRPN數(shù)據(jù)通常抽象為五種類型:①Tracker記錄位置和方位信息;②Button記錄二進制按鈕信息,類似于數(shù)字量,例如鼠標按鈕、手柄按鈕的點擊事件等;③Analog記錄軸數(shù)據(jù),類似于模擬量,例如手柄遙桿、鼠標軸等;④Dial記錄增值旋轉(zhuǎn)信息,例如旋鈕等;⑤ForceDevice記錄力反饋相關(guān)信息。例如PPT Wand具有一個Tracker、一個Analog和一組Buttons。
PPT和VRPN傳輸數(shù)據(jù)至Unity的流程原理如圖2所示。
圖2 數(shù)據(jù)獲取流程
由于VRPN是C++程序,Unity C#程序不能夠直接訪問,需要進行封裝,采用C#調(diào)用C++代碼。將PPT傳輸數(shù)據(jù)方法寫成VRPN Tracker Extern、VRPN Analog Extern、VRPN Button Extern幾個主要方法,并在方法聲明中增加_declspec(dllexport)關(guān)鍵字,關(guān)鍵代碼聲明示例如下。
extern "C" _declspec( dllexport ) double VRPN Tracker Extern(char* _address, int id);編譯時需要選擇.NET 3.5版本,將編譯的dll導入Unity/Plugins, 在C#里使用DllImport對這些方法進行封裝。關(guān)鍵代碼聲明示例如下:
// EntryPoint 參數(shù)代表dll 庫中的入口點名稱
[DllImport("VRPN_PPT" , EntryPoint = "VRPNTrackerExtern"))]public static extern IntPtr Create Tracker([MarshalAs(Unmanaged Type.LPStr)] string _address, [MarshalAs(UnmanagedType.I4)] int id);
為了能夠更方便的使用PPT開發(fā)Unity,對其進一步的分類劃分,分為PPT Analog、PPT Button、PPT Tracker、PPT Wand等幾個主要的方法,代碼的封裝結(jié)構(gòu)如圖3所示。
圖3 封裝結(jié)構(gòu)
先搭建船體裝配車間三維場景,并建立雙層底分段模型。設(shè)置相機初始視角,并將PPT Tracker組件添加到相機上,配置IP為PPT服務(wù)器地址和端口,設(shè)置Tracker ID為1(表示連接到PPT Eyes),如圖4所示。建立Wand手柄三維模型,并添加PPT Wand組件,設(shè)置WandID為3(表示連接到PPT Wand)。這樣PPT Eyes控制相機視角,PPT Wand控制虛擬場景中的手柄模型,實現(xiàn)了交互操作。
圖4 PPT Tracker組件
選擇手柄抓取方式,首先需要將分段模型劃分為中小組立件節(jié)點,給每個組立添加碰撞體和剛體組件[5],并保存為Prefabs,在腳本中通過Instantiate類實例化預設(shè)。添加了碰撞體的組立件和周圍部件發(fā)生碰撞時會產(chǎn)生干涉效果,這樣便可進行設(shè)計階段的空間合理性檢查[6]。裝配前可以打亂組立件的位置,并預先定義正確的裝配序列,主要是采用string數(shù)組保存每個組立件的名稱。當裝配時,確定當前裝配數(shù)組索引,選擇錯誤不能裝配;選擇正確,則數(shù)組索引自增1。
當按下手柄Trigger按鈕,同時手柄碰撞到組立件,并且碰撞對象為當前裝配索引時,通過Transform.SetParent(Transform parent, bool world Position Stays)方法將該組立件設(shè)為手柄模型對象的子節(jié)點,便可實現(xiàn)抓?。凰砷_手柄時,通過同樣的方法將該組立件的父節(jié)點設(shè)置為初始節(jié)點,便可放置組立件。
為了能夠突出當前抓取模型,在On Trigger Enter(Collider other)方法中,將手柄觸碰的組立模型的material顏色實時更換為高亮半透明的material,整體裝配效果如圖5所示。
圖5 裝配效果
采用WorldViz PPT對PPT Wand和PPT Eyes進行了位置跟蹤,使用VRPN將獲取的數(shù)據(jù)傳輸至Unity,并進行了船體分段虛擬裝配的交互仿真。實驗表明,該方法裝配效果直觀,運行穩(wěn)定可靠,能夠在設(shè)計階段對裝配可行性、空間合理性進行分析評價,減少實際裝配的錯誤,縮短返工率,具有較強的工程應(yīng)用價值,為虛擬裝配技術(shù)在船舶行業(yè)的應(yīng)用研究提供了技術(shù)支撐。