邵偉平,李東洋
(沈陽理工大學 機械工程學院,遼寧 沈陽 110159)
隨著無人飛行器在國內(nèi)外軍事、民生等領(lǐng)域的廣泛應用,作為無人飛行器中的重要分支,仿生撲翼飛行器也獲得了深入的研究。相較于微小型固定翼飛行器和旋翼飛行器的不穩(wěn)定性,撲翼飛行器的撲翼結(jié)構(gòu)可以產(chǎn)生穩(wěn)定的氣動力,實現(xiàn)懸停。在遇到外界干擾或者突發(fā)情況時,具有更好的穩(wěn)定性、靈活性和機動性[1-3]。
隨著虛擬仿真和虛擬現(xiàn)實等技術(shù)的不斷迭代,虛擬仿真的應用范圍從最初的游戲領(lǐng)域發(fā)展到工業(yè)仿真、教學培訓、航空航天等各領(lǐng)域,在軍事領(lǐng)域也有著廣闊的前景,無論是武器仿真還是模擬訓練等方面都有很強的可研究性[4-5]。
Unity3D引擎是現(xiàn)階段虛擬現(xiàn)實技術(shù)研究使用的主要平臺,支持大多數(shù)三維建模軟件和C#、Java等多種腳本語言,廣泛應用于航天、工業(yè)、軍事、醫(yī)學、教育、建筑等多個領(lǐng)域[6-7]。傳統(tǒng)的仿真軟件只能從數(shù)據(jù)方面呈現(xiàn)設(shè)計效果,而虛擬現(xiàn)實可以更直觀地感受設(shè)計成果。通過Unity3D引擎中的NavMesh功能,配合編寫的相關(guān)腳本,實現(xiàn)撲翼飛行器的自主尋路的虛擬仿真。
選擇UG進行撲80翼飛行器的三維建模,根據(jù)設(shè)計參數(shù)完成撲翼飛行器的模型制作。將模型導入還原度和精細度更好的3DMAX中做進一步處理,拆分分類,對坐標軸等進行修改,以便在Unity3D中使用,進行貼圖后導出FBX格式,導入到Unity3D,根據(jù)需要對模型部件進行父子關(guān)系以及屬性的設(shè)置,完成撲翼飛行器的準備工作。
根據(jù)實驗需要選擇設(shè)計場景,以街道為主要地形,建筑群作為尋路時的避障物體。將做好的街道模型和需要的紋理及貼圖導入到Unity3D引擎。根據(jù)街道的形式依次把紋理貼圖按照順序置于地形上,通過紋理貼圖的使用,劃出馬路、公路等區(qū)域,處理后的地表模型如圖1所示。
圖1 處理后的地表模型
將3DMAX做好的建筑物模型導入Unity3D,將建筑物組合分區(qū)填入城市,通過建筑物的分割和街道的連接使場景初步具備一個現(xiàn)實的城市樣貌。制作一些搭配場景風格的裝飾物導入場景,使城市場景看起來更加真實,如花壇、路邊長椅、路燈、告示牌、噴泉和垃圾桶等。
完成場景內(nèi)部對象的外觀和形狀后,對場景中的環(huán)境進行設(shè)置,主要包括天空盒和光照系統(tǒng)兩部分。天空盒是Unity3D引擎中對環(huán)境進行渲染的重要組件,由六個面構(gòu)成,像盒子一樣將場景囊括其中,天空盒可以增加場景的真實感,并且對硬件的負載也較小。將貼圖填入Unity3D的Skybox(天空盒)組件,把組件應用到場景攝像機上。光源是配合天空盒的重要組成部分,使場景更具真實感。Unity3D中的光源主要有四種:點光源、平行光、聚光燈和區(qū)域光。使用平行光光源搭配陰影效果達到模擬真實太陽光的照射情況,路燈上可添加點光源,場景最終效果如圖2所示。
圖2 場景最終效果
目前尋路方法眾多,各有優(yōu)劣,常用的主流算法有A*算法、NavMesh算法[8-9]。
A*算法是一種傳統(tǒng)的智能尋路算法,是使用最廣泛的尋路算法之一[10],但在Unity3D內(nèi)有尋路組件NavMeshAgent,無論是腳本編寫方面或是設(shè)定網(wǎng)格和烘焙地形方面,NavMesh算法的便捷性均優(yōu)于A*算法。在算法的效率問題上,在這種非大型場景中,NavMesh算法的效率也更高,因此選擇NavMesh算法作為本次實驗的尋路算法。
NavMesh算法分為Recast算法和Detour算法兩部分。Recast算法是NavMesh的核心,將地圖數(shù)據(jù)進行簡化和抽象處理,使其變成可用于尋路的網(wǎng)格模型,生成可導航地圖,將地圖導入Detour算法,Detour算法再基于導航網(wǎng)格進行路徑規(guī)劃。
Recast算法首先將原地圖網(wǎng)格光柵化,形成一個高度場。進一步定義可通過部分,將這些部分劃分為連續(xù)的地區(qū),同時剔除不可通過的部分。再將劃分好的可通過地區(qū)轉(zhuǎn)換為簡單的多邊形,然后進行簡化,簡化邊界和相近多邊形的邊緣,變成更利于尋路的凸多邊形。將凸多邊形網(wǎng)格三角化,并對細節(jié)進行優(yōu)化,完成導航網(wǎng)格。Detour算法基于Recast算法生成導航多邊形網(wǎng)格,通過算法尋找起止點多邊形,進行路徑規(guī)劃。提高了一定的效率,平衡了算法的運行效率和路徑的準確性,因此,NavMesh算法在非大型場景中的表現(xiàn)較為優(yōu)秀。
在Unity3D引擎的編輯器中,打開Navigation面板,包括4種標簽,如圖3所示。
圖3 Navigation面板的4種標簽
(1) 代理:設(shè)定導航時尋路對象與障礙物的接近程度,尋路對象可達到的高度等。
(2) 區(qū)域:對地圖上的物體進行分類,用層來表示,默認有三個,也可自己添加。
(3) 對象:對當前選擇的場景中的物體進行操作,其中Navigation Static判斷此物體是否作為尋路過程的一部分,所以前面制作的場景地圖和地圖上設(shè)置的障礙物等都要勾選此項。
(4) 烘焙:對當前地圖進行烘焙。完成上面幾項的設(shè)置后,點擊烘焙,生成可行走的Navmesh導航區(qū)域,如圖4所示。
圖4 Navmesh導航區(qū)域
為撲翼飛行器添加NavMesh Agent組件,對尋路對象的參數(shù)進行初步設(shè)置,如必要的速度、角速度、加速度和制動距離等,其中制動距離表示離障礙多遠時開始減速。此外,還有對障礙進行躲避時的半徑、高度等參數(shù)以及尋路的一些設(shè)置。
Unity3D引擎支持JAVA語言和C#語言進行腳本的編寫,由于C#語言在Unity3D中使用更方便,所以選擇C#作為編程語言,來配合Navigation面板和NavMesh Agent組件完成自主尋路。腳本設(shè)計以鼠標點擊位置為尋路的目標終點,且在尋路途中再次點擊其他地點,可以隨時更改目標,其部分代碼如下:
NavMeshAgent agent;
private LineRenderer lr;
void Start()
{
agent = GetComponent
//獲取組件
lr = GetComponent
InitLine();
}
……
if (Input.GetMouseButtonDown(0))
{
Ray ray = Camera.main.ScreenPointToRay
(Input.mousePosition);
RaycastHit hit;
……
}
為了更好地看到尋路時的情況,再編寫一個腳本使場景內(nèi)的攝影機跟隨撲翼飛行器,將腳本搭載在攝影機上。
將撲翼飛行器放入搭建好的場景中,添加Navigation面板,設(shè)置參數(shù),進行烘焙生成導航網(wǎng)格。為撲翼飛行器添加NavMesh Agent組件,設(shè)置各種參數(shù),將寫好的腳本搭載到撲翼飛行器上。
在運行場景中點擊無障礙處作為目標點,撲翼飛行器能避開障礙物,準確地進行尋路。為方便查看,使用著色小球作為目標點進行測試,如圖5所示,在撲翼飛行器尋路過程中點擊其他地點,可做到即時重新尋路,并且路線準確。圖6所示為撲翼飛行器尋路時的飛行姿態(tài)。
圖5 撲翼飛行器到達的目標點
圖6 撲翼飛行器尋路時的飛行姿態(tài)
基于Unity3D引擎,研究撲翼飛行器的自主尋路,建立相關(guān)模型并且進行處理。搭建適于實驗的場景地圖,選擇NavMesh算法作為尋路算法,配合Unity3D內(nèi)組件的使用,大大簡化了腳本的編寫,通過鼠標點擊進行自主尋路并隨時更換目標,實現(xiàn)了撲翼飛行器自主尋路的虛擬仿真。
由于Unity3D引擎的可視化,打破了傳統(tǒng)仿真只能用數(shù)據(jù)表現(xiàn)的單一形式,實時可見撲翼飛行器的狀態(tài)和尋路過程。Unity3D引擎作為專業(yè)的虛擬現(xiàn)實產(chǎn)品,暫時還無法與外部的飛行器系統(tǒng)對接輸出。隨著Unity3D在各場景應用的越來越廣泛,不僅會有更完善的尋路方法,也會與外部系統(tǒng)有良好的配合應用。