方艷紅,莊永智,王學(xué)淵,張紅英
(西南科技大學(xué) 信息工程學(xué)院 特殊環(huán)境機(jī)器人技術(shù)四川省重點(diǎn)實(shí)驗(yàn)室,四川 綿陽(yáng) 621010)
增強(qiáng)現(xiàn)實(shí)(AR)技術(shù)又被稱(chēng)為擴(kuò)增現(xiàn)實(shí)技術(shù),是一種實(shí)時(shí)計(jì)算攝影機(jī)影像的位置及角度并加上相應(yīng)圖像的技術(shù),已經(jīng)在游戲、電視媒體、商業(yè)推廣、導(dǎo)航、遠(yuǎn)程協(xié)作等方面有了廣泛應(yīng)用[1-4]?;贏R技術(shù)的汽車(chē)駕駛仿真實(shí)驗(yàn)系統(tǒng)能夠讓用戶(hù)在虛擬與現(xiàn)實(shí)融合的AR場(chǎng)景中控制汽車(chē)前進(jìn)、后退、轉(zhuǎn)向等,同時(shí)向用戶(hù)實(shí)時(shí)發(fā)送汽車(chē)行駛參數(shù)并進(jìn)行安全預(yù)警。從實(shí)用角度來(lái)說(shuō),通過(guò)修改汽車(chē)模型的各項(xiàng)參數(shù),可實(shí)現(xiàn)對(duì)真實(shí)汽車(chē)的模擬仿真,讓用戶(hù)足不出戶(hù)就能體會(huì)到某車(chē)型的行駛狀況。
基于AR的汽車(chē)駕駛仿真實(shí)驗(yàn)系統(tǒng)以Unity3D引擎為開(kāi)發(fā)平臺(tái)[5-6],利用移動(dòng)設(shè)備攝像頭獲取現(xiàn)實(shí)環(huán)境,采用Vuforia工具[7-8]掃描二維圖像,并將虛擬場(chǎng)景與現(xiàn)實(shí)環(huán)境疊加融合,實(shí)現(xiàn)AR場(chǎng)景呈現(xiàn)和AR交互操作;運(yùn)用C#語(yǔ)言編程實(shí)現(xiàn)汽車(chē)控制、行駛參數(shù)反饋、場(chǎng)景切換、環(huán)境隱藏等功能,通過(guò)錄入真實(shí)的汽車(chē)參數(shù),進(jìn)行汽車(chē)駕駛模擬。汽車(chē)駕駛仿真實(shí)驗(yàn)系統(tǒng)結(jié)構(gòu)框圖如圖1所示,包括UI交互模塊、AR模塊、汽車(chē)控制模塊、行駛參數(shù)反饋模塊。
圖1 汽車(chē)駕駛仿真實(shí)驗(yàn)系統(tǒng)結(jié)構(gòu)圖
圖 1所示的系統(tǒng)結(jié)構(gòu)框圖中,用戶(hù)通過(guò) UI交互模塊來(lái)控制游戲的運(yùn)行,讀取汽車(chē)行駛過(guò)程中的參數(shù),進(jìn)行場(chǎng)景切換和環(huán)境隱藏;AR模塊包括AR場(chǎng)景呈現(xiàn)以及特定模式的AR交互操作;汽車(chē)控制模塊控制汽車(chē)的前進(jìn)、后退、轉(zhuǎn)向;行駛參數(shù)反饋模塊讀取汽車(chē)的狀態(tài),經(jīng)過(guò)計(jì)算后得出反饋參數(shù),并由 UI交互模塊呈現(xiàn)給用戶(hù)。
AR模塊實(shí)現(xiàn)包含兩個(gè)部分:AR場(chǎng)景呈現(xiàn)和AR交互操作。AR場(chǎng)景呈現(xiàn)利用 Vuforia工具中的 AR Camera(AR攝像頭)取代 Unity3D引擎中的 Main Camera(主攝像頭),使用 ImageTarget作為 AR Camera的識(shí)別對(duì)象,即特定的識(shí)別圖。虛擬模型、ImageTarget與AR Camera的層次關(guān)系如圖2所示。
圖2 虛擬模型、ImageTarget與AR Camera層次關(guān)系
由圖2可見(jiàn),所有虛擬模型RaceTrack、Scene、Car1均為ImageTarget的子對(duì)象。AR模塊調(diào)用設(shè)備的攝像頭來(lái)獲取現(xiàn)實(shí)環(huán)境,令虛擬模型成為AR Camera的子對(duì)象后,虛擬模型就能疊加在攝像頭所拍攝的畫(huà)面中。當(dāng)識(shí)別圖被移動(dòng)時(shí),系統(tǒng)實(shí)時(shí)計(jì)算識(shí)別圖的坐標(biāo)位置,并更新虛擬模型的坐標(biāo),使虛擬模型跟隨識(shí)別圖移動(dòng)。
AR交互操作的流程圖如圖3所示。圖3中,系統(tǒng)進(jìn)入車(chē)輛展示模式后,掃描識(shí)別圖并加載AR場(chǎng)景,循環(huán)判斷識(shí)別圖上的特定區(qū)域是否被遮擋,若被遮擋,則認(rèn)為虛擬按鍵被按下,顯示車(chē)輛詳細(xì)信息,如車(chē)型、油耗、尺寸、發(fā)動(dòng)機(jī)型號(hào)等;若被再次遮擋,則隱藏車(chē)輛詳細(xì)信息。
汽車(chē)控制模塊主要包括汽車(chē)行駛控制和鏡頭追蹤兩個(gè)部分,實(shí)現(xiàn)流程如圖4所示。
圖3 AR交互操作流程圖
圖4 汽車(chē)控制流程圖
圖4 中,在移動(dòng)設(shè)備上,用戶(hù)通過(guò)操縱屏幕上的虛擬搖桿來(lái)控制汽車(chē)行駛,并根據(jù)虛擬汽車(chē)模型的位置和角度信息,實(shí)時(shí)更新鏡頭相對(duì)于虛擬汽車(chē)模型的位置和角度,實(shí)現(xiàn)鏡頭對(duì)汽車(chē)模型的追蹤。
行駛參數(shù)反饋模塊包括實(shí)時(shí)速度監(jiān)測(cè)、汽車(chē)行駛時(shí)間記錄、偏離車(chē)道示警、碰撞損壞提示、實(shí)時(shí)油耗計(jì)算等功能,向用戶(hù)顯示和預(yù)警汽車(chē)的行駛狀態(tài)。其中,汽車(chē)實(shí)時(shí)速度監(jiān)測(cè)主要利用 Unity3D中 Velocity函數(shù)實(shí)時(shí)獲取汽車(chē)剛體的速度,并將該速度乘以比例系數(shù),即為汽車(chē)的實(shí)時(shí)速度。若實(shí)時(shí)速度超過(guò)最小閾值,則在UI界面實(shí)時(shí)顯示,否則顯示為0,以避免由于汽車(chē)模型輕微抖動(dòng)引起的速度誤差。
汽車(chē)行駛時(shí)間記錄主要通過(guò)調(diào)用 Unity3D中InvokeRepeating函數(shù)完成。InvokeRepeating函數(shù)是一個(gè)延時(shí)循環(huán)執(zhí)行函數(shù),每隔指定時(shí)間執(zhí)行一次。本文中的計(jì)時(shí)單位是 0.01 s。汽車(chē)觸碰到起點(diǎn)線的觸發(fā)器時(shí)InvokeRepeating開(kāi)始計(jì)時(shí),行駛結(jié)束時(shí)停止計(jì)時(shí)。
偏離車(chē)道示警有3種模式:(1)當(dāng)汽車(chē)模型觸碰到車(chē)道邊緣的觸發(fā)器時(shí),UI界面會(huì)顯示示警文字,提示用戶(hù)偏離車(chē)道;(2)當(dāng)汽車(chē)模型離開(kāi)車(chē)道邊緣的觸發(fā)器,但又觸碰到車(chē)道以外場(chǎng)景的觸發(fā)器時(shí),示警文字將持續(xù)顯示;(3)當(dāng)汽車(chē)模型離開(kāi)車(chē)道邊緣的觸發(fā)器,且并未觸碰到車(chē)道以外場(chǎng)景的觸發(fā)器時(shí),UI界面不再顯示示警文字。
碰撞損壞提示主要利用 Unity3D提供的 Collider(碰撞器)實(shí)時(shí)監(jiān)測(cè)汽車(chē)與場(chǎng)景物體的碰撞情況,通過(guò)C#腳本對(duì)碰撞次數(shù)進(jìn)行統(tǒng)計(jì),若碰撞發(fā)生,將碰撞次數(shù)+1;若達(dá)到示警閾值,則提示用戶(hù)汽車(chē)即將損壞;若達(dá)到損壞閾值,則提示用戶(hù)汽車(chē)已損壞。
實(shí)時(shí)油耗計(jì)算需要實(shí)時(shí)獲取汽車(chē)當(dāng)前速度,并根據(jù)微積分的思想對(duì)油耗進(jìn)行統(tǒng)計(jì),算法流程如圖5所示。
圖5 實(shí)時(shí)油耗計(jì)算流程
由圖5可見(jiàn),游戲開(kāi)始時(shí),實(shí)時(shí)油耗值置零;系統(tǒng)每隔0.02 s采集一次汽車(chē)速度,用當(dāng)前時(shí)刻的汽車(chē)速度乘以0.02 s作為汽車(chē)的位移距離;再使用這個(gè)位移距離乘以車(chē)輛每m的油耗,則可近似算出0.02 s內(nèi)汽車(chē)的油耗;將每個(gè)0.02 s的汽車(chē)油耗相加,可得出汽車(chē)的實(shí)時(shí)油耗。
UI交互模塊主要有游戲模式切換、環(huán)境隱藏、提示信息顯示等功能。進(jìn)入系統(tǒng),用戶(hù)可以通過(guò)按鍵選擇游戲模式,包括AR游戲模式、AR車(chē)輛模型展示模式、普通游戲模式等。每一個(gè)游戲模式都對(duì)應(yīng)一個(gè)游戲場(chǎng)景,另外還有一個(gè)AR鏡頭追蹤模式場(chǎng)景。場(chǎng)景切換主要利用Unity3D提供的按鍵響應(yīng)和場(chǎng)景切換腳本來(lái)實(shí)現(xiàn)。加載全景場(chǎng)景主要代碼如下:
SceneManager.LoadScene(“ARCar-arfullview”);
在仿真實(shí)驗(yàn)中,虛擬場(chǎng)景有時(shí)會(huì)在屏幕上遮擋住攝像頭獲取的現(xiàn)實(shí)環(huán)境。為了便于用戶(hù)通過(guò)屏幕觀看真實(shí)場(chǎng)景,本設(shè)計(jì)添加一個(gè)通過(guò)按鍵來(lái)實(shí)現(xiàn)的虛擬環(huán)境隱藏功能,啟用該功能后便會(huì)隱藏虛擬場(chǎng)景中的環(huán)境,只留下車(chē)道和車(chē)輛模型。
提示信息使用 Unity3D提供的Text類(lèi)和3DText類(lèi)進(jìn)行顯示,包括汽車(chē)速度、行駛時(shí)間、偏離車(chē)道示警、碰撞損壞示警、實(shí)時(shí)油耗等信息。
在Unity3D引擎下開(kāi)發(fā)完成系統(tǒng)各功能模塊后,將其打包發(fā)布在Android平臺(tái),進(jìn)行系統(tǒng)測(cè)試。
本系統(tǒng)中設(shè)計(jì)了AR全景、車(chē)輛展示、AR鏡頭追蹤3種實(shí)驗(yàn)?zāi)J剑趯?shí)驗(yàn)過(guò)程中均需要呈現(xiàn)AR場(chǎng)景。圖6是3種實(shí)驗(yàn)?zāi)J较碌腁R場(chǎng)景呈現(xiàn)。圖6所示的3種實(shí)驗(yàn)場(chǎng)景模式可以相互切換,滿足UI交互功能。
AR交互操作主要添加在車(chē)輛展示模式中。圖 7所示是手碰觸識(shí)別圖的AR場(chǎng)景顯示。圖7(a)為手碰觸識(shí)別圖后的響應(yīng)操作,AR場(chǎng)景中顯示汽車(chē)詳細(xì)信息;圖7(b)為手再次碰觸識(shí)別圖后的響應(yīng)操作,汽車(chē)詳細(xì)信息被隱藏起來(lái)。
由圖 7可以看出,AR交互操作功能運(yùn)行正常,可以正確識(shí)別用戶(hù)的操作,并在虛擬模型上作出響應(yīng)。
汽車(chē)控制模塊主要實(shí)現(xiàn)汽車(chē)的移動(dòng)、轉(zhuǎn)向功能。圖8所示是系統(tǒng)分別在AR全景模式、AR鏡頭跟隨模式下通過(guò)虛擬搖桿對(duì)汽車(chē)的行駛控制??梢钥闯觯?chē)可以在兩種模式下正常運(yùn)行,并實(shí)現(xiàn)移動(dòng)、轉(zhuǎn)向功能。
圖6 不同模式下的AR場(chǎng)景呈現(xiàn)
圖8 汽車(chē)控制模塊測(cè)試
汽車(chē)行駛參數(shù)測(cè)試包括實(shí)時(shí)速度監(jiān)測(cè)、計(jì)時(shí)、實(shí)時(shí)油耗計(jì)算以及偏離車(chē)道示警等。圖 9所示是在 AR鏡頭跟隨模式下對(duì)上述參數(shù)的測(cè)試分析??梢钥闯觯?chē)行駛過(guò)程中的速度監(jiān)測(cè)、計(jì)時(shí)、實(shí)時(shí)油耗計(jì)算以及偏離車(chē)道示警可以實(shí)時(shí)顯示。
圖9 汽車(chē)行駛參數(shù)反饋模塊測(cè)試
UI交互模塊除了上述測(cè)試模塊中用到的信息提示功能外,還包括場(chǎng)景切換、環(huán)境隱藏功能。圖 10所示為以AR全景模式為例的環(huán)境隱藏前后對(duì)比圖。可以看出,在AR全景模式中,點(diǎn)擊了“隱藏環(huán)境”按鍵后,虛擬場(chǎng)景中車(chē)道周?chē)牟莸?、圍墻均被隱藏,僅有車(chē)道、護(hù)欄模型被加載。
圖10 AR全景模式下環(huán)境隱藏前后對(duì)比圖
本文研究的基于AR的汽車(chē)駕駛虛擬仿真實(shí)驗(yàn)系統(tǒng)是一個(gè)集AR場(chǎng)景呈現(xiàn)與交互操作、汽車(chē)控制與行駛參數(shù)反饋等功能于一體的實(shí)驗(yàn)系統(tǒng)。該系統(tǒng)能讓用戶(hù)足不出戶(hù)就可以近距離觀察汽車(chē)的外形、內(nèi)飾,體驗(yàn)汽車(chē)行駛狀態(tài),從而大大降低體驗(yàn)成本。