本發(fā)明涉及基于unity3d的虛擬駕駛模擬器,屬于模擬器領(lǐng)域。
背景技術(shù):
隨著近幾年汽車行業(yè)的快速發(fā)展,汽車已經(jīng)成為中國最重要的交通工具。越來越多的購買車輛的人們需要考取機(jī)動車駕駛證,雖然大多數(shù)駕校負(fù)責(zé)學(xué)員學(xué)車和考取駕照,但是大多數(shù)日益繁忙的人們顯然沒有足夠的時間去練習(xí)熟練駕駛汽車。
因此,汽車駕駛培訓(xùn)行業(yè)逐漸開始采用駕駛模擬器的培訓(xùn)方式來取代傳統(tǒng)的師傅帶徒弟的培訓(xùn)方式,提高培訓(xùn)的效率,合理分配學(xué)習(xí)資源。
然而傳統(tǒng)的汽車培訓(xùn)模擬器結(jié)構(gòu)簡單、功能單一,只能讓駕駛員熟悉方向盤、離合器、剎車等部件的操作,不能達(dá)到實車駕駛的體驗效果。基于此,虛擬駕駛模擬器應(yīng)運(yùn)而生。
虛擬駕駛模擬器是一種先進(jìn)的培訓(xùn)設(shè)備,結(jié)合多媒體技術(shù)、虛擬現(xiàn)實技術(shù)unity3d,可以創(chuàng)造一個相對真實的駕駛訓(xùn)練環(huán)境。由于虛擬駕駛模擬器安全環(huán)保、培訓(xùn)效率高等特點,已經(jīng)被廣泛的應(yīng)用于駕校培訓(xùn)。
技術(shù)實現(xiàn)要素:
發(fā)明目的:為了克服現(xiàn)有技術(shù)中存在的不足,本發(fā)明提供一種基于unity3d的虛擬駕駛模擬器,可以增強(qiáng)培訓(xùn)的沉浸感和動態(tài)真實性,以實現(xiàn)對駕駛員進(jìn)行全面的駕駛培訓(xùn)。
技術(shù)方案:為解決上述技術(shù)問題,本發(fā)明的一種基于unity3d的虛擬駕駛模擬器,包括底平臺、中間平臺和動平臺,所述底平臺為正三角形板,中間平臺也為三角形板,在底平臺的三角形頂點處均通過連接板與中間平臺連接,在連接板上安裝有絲杠,絲杠通過軸承安裝在連接板上,絲杠通過電機(jī)電動轉(zhuǎn)動,在絲杠上安裝有滑塊,滑塊上鉸接有連接桿,連接桿與動平臺鉸接,動平臺下方萬向球接有定長支柱,定長支柱固定安裝在中間平臺上。
作為優(yōu)選,所述滑塊上安裝有拉繩式位移傳感器,拉繩式位移傳感器另一端安裝在底平臺上,拉繩式位移傳感器與絲杠平行。
作為優(yōu)選,所述動平臺上安裝有姿態(tài)傳感器。
作為優(yōu)選,所述姿態(tài)傳感器與控制系統(tǒng)連接,控制系統(tǒng)與電機(jī)連接。
作為優(yōu)選,所述控制系統(tǒng)包含控制硬件和控制軟件,所述控制軟件為unity3d虛擬仿真軟件。
有益效果:本發(fā)明的基于unity3d的虛擬駕駛模擬器,具有以下優(yōu)點:
(1)該模擬器結(jié)構(gòu)簡單,采用電機(jī)絲杠模塊代替液壓缸、電動缸等部件實現(xiàn)運(yùn)動,使得制造與裝配更加簡單,同時降低了加工成本。屬于對稱結(jié)構(gòu),中間連接桿起到支撐作用,大大減小了桿件和絲杠的承受力,增加了機(jī)構(gòu)的穩(wěn)定性。
(2)該模擬器采用運(yùn)動控制卡,支持多種開源語言編程,通過dsp和fpga進(jìn)行運(yùn)動規(guī)劃,可以保證控制的實時性,實現(xiàn)快速的i/o響應(yīng),實現(xiàn)高速數(shù)據(jù)采集與發(fā)送。支持點位和連續(xù)軌跡,多軸同步,直線、圓弧、螺旋線、空間直線插補(bǔ)等運(yùn)動模式。
(3)該模擬器與虛擬現(xiàn)實技術(shù)相結(jié)合,使駕駛者在操作模擬器的時候能夠更加真實的感受駕駛時的場景變換,提高駕駛培訓(xùn)的沉浸感。采用3dsmax軟件搭建三維模型,使模型更加精確逼真,提高了系統(tǒng)仿真的真實性。相比于傳統(tǒng)的采用opengl與vc++相結(jié)合構(gòu)建視景系統(tǒng)的技術(shù),采用先進(jìn)的虛擬仿真軟件unity3d構(gòu)建視景系統(tǒng),能夠更快更簡便的搭建視景仿真系統(tǒng),降低編程難度。
附圖說明
圖1模擬器機(jī)構(gòu)簡圖。
圖2控制系統(tǒng)示意圖。
圖3模型層次結(jié)構(gòu)圖。
其中,1動平臺;2連接桿;3旋轉(zhuǎn)編碼器;4連接桿;5中間平臺;6滑塊;7編碼器;8拉繩式位移傳感器;9滑塊;10連接桿;11定長支柱;12編碼器;13滑塊;14拉繩式位移傳感器;15底平臺;16拉繩式位移傳感器。
具體實施方式
如圖1至圖3所示,本發(fā)明的基于unity3d的虛擬駕駛模擬器,包括動平臺1、底平臺15、定長支柱11以及三條驅(qū)動支鏈。三條驅(qū)動支鏈分別由結(jié)構(gòu)相同的連接桿4、2、10、絲杠、滑塊6、9、13及執(zhí)行電機(jī)形成的移動副構(gòu)成,驅(qū)動支鏈中連接桿2、4、10的末端通過球鉸與動平臺1相連,可以調(diào)整動平臺1的運(yùn)動姿態(tài),驅(qū)動支鏈中滑塊6、9、13與連接桿4、2、10之間采用球鉸連接,通過滑塊6、9、13的移動帶動連接桿4、2、10運(yùn)動,進(jìn)而改變動平臺1的運(yùn)動姿態(tài)。定長支柱11連接動平臺1與中間平臺5,通過球面副和動平臺1連接并固定在中間平臺5的中央。底平臺15為正三角形,三個頂點處分別焊接有一塊連接板,連接板的另一端與中間平臺5焊接在一起,確保中間平臺5和底平臺15相互平行。連接板主要用于安裝固定提供移動副的滾珠絲杠滑塊和執(zhí)行電機(jī),絲杠的頂端通過聯(lián)軸器與執(zhí)行電機(jī)相接,末端通過聯(lián)軸器與旋轉(zhuǎn)編碼器3、7、12相接,拉繩式位移傳感器8、14、16分別安裝于三個連接板上,其拉繩頂端分別固定于滑塊6、13、9上。動平臺1的三個頂點分別通過連接桿4、2、10與三個滑塊6、9、13相連,具體連接方式為:動平臺1的三個頂點通過安裝三個精密球鉸構(gòu)成三個球面副,三個連接桿4、2、10與三個滑塊6、9、13之間采用球鉸連接。
如圖2所示,將計算機(jī)、運(yùn)動控制卡、驅(qū)動器、執(zhí)行電機(jī)連接在一起,實現(xiàn)數(shù)據(jù)的相互傳輸。首先,將運(yùn)動控制卡插到計算機(jī)的pci插槽上,運(yùn)動控制卡與端子板之間通過pci總線連接,端子板與驅(qū)動器之間采用25針串口線束連接,驅(qū)動器與執(zhí)行電機(jī)之間采用共陽極接法連接。
軟件系統(tǒng)由視景系統(tǒng)、輸入設(shè)備接入模塊、軟硬件通信模塊、車輛位姿解算模塊組成。
如圖3所示,一種新型駕駛模擬器的虛擬場景結(jié)構(gòu)包括靜態(tài)模型、動態(tài)模型、特效模型。采用3dsmax軟件建立虛擬駕駛系統(tǒng)中的模型和動畫,然后將模型和動畫導(dǎo)出為fbx格式到unity中使用。使用3dsmax中的uvw貼圖編輯器對模型進(jìn)行貼圖坐標(biāo)修正。根據(jù)不同的模型外形表面,使用uvw貼圖編輯器對不同的坐標(biāo)軸位置進(jìn)行修改。
在3dsmax中完成場景模型的建立,將處理好的車輛、地形、建筑物等fbx格式的三維模型放到unity3d的資源文件夾assets中,unity3d將自動導(dǎo)入對應(yīng)的三維模型及相應(yīng)的貼圖和動畫文件。
為了方便管理場景里的各個模型文件,一個場景只設(shè)置有一個場景根節(jié)點,世界坐標(biāo)值一般可視為(0,0,0)。在unity3d中將根節(jié)點定義為一個3dempty,其沒有體積也沒有其他物理屬性,是相對獨立的一個三維點。其他的實體都是根節(jié)點的子節(jié)點,掛靠的子節(jié)點下可以繼續(xù)添加子節(jié)點,這樣可以形成了環(huán)境模型的層次結(jié)構(gòu)樹結(jié)構(gòu)。同時,采用自上而下的方法搭建場景,使每個幾何模型之間都存在著父子關(guān)系。
采用unity3d中的方向光源(directionallight)、點光源(pointlight)、聚光燈(spotlight)和面光源(arealight)來模擬自然界中的任意光源。通過菜單欄中的gameobject項下面的選項創(chuàng)建光源,通過程序修改光源的transform屬性,可從而控制光源的位置、旋轉(zhuǎn)等特征,使光源不停地旋轉(zhuǎn),使得視景系統(tǒng)更加豐富多彩。
在unity3d中采用可以增強(qiáng)靜態(tài)場景光照效果的lightmapping技術(shù),通過較少的性能消耗使得靜態(tài)場景看上去更真實、豐富,以及更具有立體感;選擇場景中的靜態(tài)模型(如燃料箱、路燈、建筑群、油桶等模型)后在inspector視圖中勾選static復(fù)選框,這樣可以讓這些元素參與lightmapping烘焙。在window菜單項中打開lightmapping窗口,切換到bake選項卡,設(shè)置參數(shù)。其中quality決定烘焙的質(zhì)量,high為最高,但計算時間會比較長;bounces決定光子的計算級別,當(dāng)其大于0時,可以通過設(shè)置finalgatherray是等選項獲得高質(zhì)量的光能傳遞運(yùn)算效果;ambientocclusion會使模型交界處產(chǎn)生陰影過渡效果;設(shè)置完成后,單擊bakescene按鈕開始烘焙。烘焙時間會因機(jī)器性能的差異而有所不同,在配置不太高的機(jī)器上會持續(xù)數(shù)分鐘至數(shù)十分鐘。
采用主視點和副視點相結(jié)合的方法,使這兩個視點相互輔助,給駕駛者提供完整的視角來觀察車輛模型行駛狀態(tài),增強(qiáng)駕駛者的動態(tài)沉浸感。采用動態(tài)跟隨的方法,使攝像機(jī)處于副視點時能夠跟隨車輛模型運(yùn)動,增強(qiáng)視覺體驗。車輛模型的速度越快,攝像機(jī)的視野也就越大;副視點在車輛模型行進(jìn)方向的后上方。創(chuàng)建好視點后需要為視點添加視點轉(zhuǎn)換函數(shù),使虛擬駕駛系統(tǒng)才可在不同的視點之間切換。
在scene窗口中將攝像機(jī)設(shè)置為車輛模型的子物體并調(diào)整到駕駛員眼睛的位置,拷貝當(dāng)前攝像機(jī)的transform屬性,然后在hierarchy視圖中創(chuàng)建一個empty對象,并重新命名為firstview,將這個對象也設(shè)置為車輛模型的子物體,在transform屬性中單擊pastecomponentvalues。這樣在需要切換到主視點時,直接將此empty對象的transform屬性復(fù)制到攝像機(jī)transform屬性中,就可以以駕駛員的視角觀察場景了。
采用動態(tài)跟隨的方法,使攝像機(jī)處于副視點時能夠跟隨車輛模型運(yùn)動,增強(qiáng)視覺體驗。車輛模型的速度越快,攝像機(jī)的視野也就越大;副視點在車輛模型行進(jìn)方向的后上方。創(chuàng)建好視點后需要為視點添加視點轉(zhuǎn)換函數(shù),使虛擬駕駛系統(tǒng)才可在不同的視點之間切換。
currentdistance向量為車輛模型在xz平面前進(jìn)方向的單位向量乘以設(shè)定好的系數(shù),newtargetposition向量為垂直向上的單位向量,則vector3newposition=newtargetposition-currentdistance;在hierarchy視圖中創(chuàng)建一個empty對象,并重新命名為secondview,將這個對象設(shè)置為車輛模型的子物體,為secondview附加一個腳本,在lateupdate()函數(shù)中設(shè)置副視點的位置為newposition,朝向為newtargetposition,這樣在每一幀都會更新副視點的transf屬性:transform.position=newposition;transform.lookat(newtargetposition);
采用unity3d內(nèi)部集成的nvidiaphysx物理引擎來模擬剛體運(yùn)動、布料等物理效果。根據(jù)不同的游戲?qū)ο筮x擇不同的碰撞體。通過從局部坐標(biāo)y軸由向下投射一條射線來實現(xiàn)車輪的碰撞檢測。車輪有一個通過懸掛距離向下延伸的半徑,可通過腳本中不同的屬性值來對車輛進(jìn)行控制。選中場景中需要添加碰撞體的游戲?qū)ο?,在inspector視圖中單擊addcomponent按鈕,選中physics選項,可選擇不同的碰撞體類型,這樣就在該對象上添加了碰撞體組件。
以場景中的car對象添加wheelcollider為例,在hierarchy視圖中選中car對象,為其添加一個空的子對象,重命名為wheelcolliderfl,表示賽車左前輪。為wheelcolliderfl添加一個wheelcollider組件,設(shè)置參數(shù)如圖所示,選中car的子對象wheelfl,在inspector視圖中單擊transform組件右上角的齒輪安牛逼,在彈出的列表中單擊copycomponent,這樣可以復(fù)制當(dāng)前transform組件的值。然后選中wheelcolliderfl對象,在inspector視圖中單擊transform組件右上角的齒輪按鈕,在彈出的列表中單擊pastecomponentvalues選項,這樣就將前面復(fù)制的值粘貼到了當(dāng)前transform組件上。依照上述步驟為car對象添加其它三個車輪的碰撞體。
在屏幕的顯示通道上添加一個gui資源,通過gui來獲得駕駛時的汽車運(yùn)動信息,如車速、檔位以及其它交互信息。采用unity3d內(nèi)置的一套完整的gui系統(tǒng)提供了從布局、控件到皮膚的一整套gui解決方案。
在ongui函數(shù)中調(diào)用gui代碼繪制界面,當(dāng)虛擬駕駛系統(tǒng)運(yùn)行時每幀自動調(diào)用ongui函數(shù),執(zhí)行函數(shù)中的語句。gui的控件一般都需要傳入rectangle參數(shù)來時制定屏幕繪制區(qū)域。
使用函數(shù)gui.box(newrect(10,10,150,20),"steerspeed:"+steerspeed)顯示定義好的轉(zhuǎn)角系數(shù)steerspeed,顯示的坐標(biāo)是(10,10),背景邊框的寬度150,高度為20;函數(shù)gui.box(newrect(screen.width-150,10,80,20),"fps:"+(int)(1f/time.deltatime))顯示虛擬駕駛系統(tǒng)的fps,用來監(jiān)視系統(tǒng)的畫面更新效果是否流暢,其中screen.width為屏幕的寬度,time.deltatime為了完成最后一幀的時間;其中函數(shù)gui.box(newrect(screen.width-250,screen.height-150,300,300),dashboardpic)顯示速度儀表盤,dashboardpic為定義的圖片texture變量。
輸入設(shè)備為方向盤、剎車、油門、檔位等,輸入控制接口模塊采用input類編寫。
在input類中,key與物理按鍵(鍵盤、鼠標(biāo)、搖桿上的按鍵)對應(yīng),設(shè)定其映射關(guān)系,然后通過按鍵名稱或者按鍵編碼keycode來獲得其輸入狀態(tài)。根據(jù)需要創(chuàng)建和命名虛擬按鍵,通過名稱來訪問在輸入管理器inputmanager中定義的虛擬按鍵button,設(shè)置與物理按鍵(及其組合)的消息映射。
采用輸入軸axis模擬搖桿的變化、方向盤的轉(zhuǎn)動等輸入動作,在輸入管理器中對兩個正負(fù)虛擬按鍵(positivebutton和negativebutton)進(jìn)行配置。將一個輸入軸設(shè)定成一個滑動條,左邊取值為-1,右邊取值為1。當(dāng)正按鍵按下時,滑塊向右邊的正向移動;當(dāng)按下負(fù)按鍵時,滑塊向左邊的負(fù)向移動。滑塊的位置對應(yīng)輸入軸的當(dāng)前取值。
在unity程序中使用getaxis()方法自動捕捉方向盤的左右轉(zhuǎn)動、油門的踩踏程度以及剎車等運(yùn)動。此方法返回的值是-1到1之間的一個值,將得到的數(shù)值乘以合理的參數(shù)便可以實現(xiàn)車輛模型的控制。
軟硬件通信控制模塊的開發(fā)是以unity3d的腳本編程為基礎(chǔ),在microsoftvisualstudio2012軟件上編輯生成的。其主要的開發(fā)步驟如下:
1)首先在unity3d中的hierarchy視圖中創(chuàng)建一個新的游戲物體,并重命名為gtscontroller,為此物體添加一個新的腳本gtscontroller.cs;
2)其次調(diào)入程序所需的函數(shù)動態(tài)鏈接庫:在unity3d中創(chuàng)建一個plugins文件夾,將固高提供的外部dll組件放在這個文件夾中,所有的外部引用的dll組件必須要放到這個文件夾中才能被引用,然后在腳本gtscontroller.cs中使用using的方式引用;
3)初始化運(yùn)動控制卡,其內(nèi)容主要包括開啟運(yùn)動控制卡(gt_open)、配置運(yùn)動控制器(gt_loadconfig)、axis運(yùn)動軸規(guī)劃位置清零(gt_setprfpos)、將axis軸設(shè)為點位模式(gt_prftrap);
4)調(diào)試運(yùn)行程序,運(yùn)動控制器在接收到主機(jī)發(fā)送的指令時,將執(zhí)行結(jié)果反饋到主機(jī),指示當(dāng)前指令是否正確執(zhí)行。5)在腳本gtscontroller.cs中,檢測每條指令的返回值,以判斷指令的執(zhí)行狀態(tài),并建立起必要的錯誤處理機(jī)制,保證程序安全可靠的運(yùn)行。
上述gtscontroller.cs腳本程序主要是通過調(diào)用運(yùn)動控制卡動態(tài)鏈接庫中的函數(shù)控制電機(jī)的運(yùn)動,以該腳本程序為主要運(yùn)動單元,根據(jù)視景仿真系統(tǒng)中采集的車輛運(yùn)動位姿狀態(tài)信息計算出合適的控制參數(shù),控制四自由度平臺按照指定規(guī)律運(yùn)動還原路況的。
車輛位姿解算模塊是指將汽車模型因地面的不平整而產(chǎn)生的振動、傾斜數(shù)據(jù),通過程序解算為電機(jī)運(yùn)動所需的各個參數(shù),然后再通過腳本程序轉(zhuǎn)化為四自由度平臺的頂平臺運(yùn)動位姿參數(shù)。
為了不斷讀取車輛模型的transform屬性得到車輛在場景中的坐標(biāo)(position)以及旋轉(zhuǎn)(rotation)信息。具體步驟如下:
(1)在gtscontroller.cs腳本程序中聲明一個public屬性的gameobject,命名為cargo,表示車輛對象;
(2)在hierarchy視圖中選中g(shù)tscontroller物體之后將car對象賦值給公用變量carg;
(3)在腳本中通過cargo.transform.position得到車輛的坐標(biāo)信息(x,y,z),通過cargo.transform.eulerangles得到車輛的旋轉(zhuǎn)歐拉角度(α,β,γ)。
其中,通過cargo.transform.rotation得到的是物體在世界空間坐標(biāo)變換的旋轉(zhuǎn)角度,此旋轉(zhuǎn)角度是通過quaternion(四元數(shù))儲存的;為了得到虛擬駕駛系統(tǒng)所需的車輛模型實時位姿信息,并使視景仿真系統(tǒng)的流暢,將這些語句寫在fixedupdate()函數(shù)中。
本發(fā)明上述實施軟硬件配置如下,軟件:windows7操作系統(tǒng),unity3d軟件;硬件:pc機(jī),gts-400-pv(g)-pci固高四軸高速運(yùn)動控制卡,珩源hy57dj114型步進(jìn)電機(jī),hyqd30-h0057型兩相步進(jìn)電機(jī)驅(qū)動器,e6b2-cwz6c型旋轉(zhuǎn)編碼器,wxy31-0404-s2型拉繩式位移傳感器,輸入設(shè)備選用北通方向盤、油門、剎車等。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應(yīng)當(dāng)指出:對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進(jìn)和潤飾,這些改進(jìn)和潤飾也應(yīng)視為本發(fā)明的保護(hù)范圍。