郭 語,鄭加柱
(南京林業(yè)大學 土木工程學院,南京 210037)
經(jīng)過近十余年的發(fā)展,室內(nèi)導航技術(shù)已取得了很大成就,其導航定位精度也能基本滿足人們?nèi)粘3鲂械男枨?,目前正逐步走向商業(yè)化,不少信息技術(shù)公司也已經(jīng)推出了適用于商場、地下停車場等公共場所的盈利性技術(shù)服務(wù)支持[1]。但是,1 個完備的商業(yè)化室內(nèi)導航系統(tǒng)應(yīng)該包含室內(nèi)3 維模型構(gòu)建、室內(nèi)位置信息的獲取以及室內(nèi)3 維場景下路徑規(guī)劃等3 部分,不能僅僅是1 個2 維模型下的導航系統(tǒng),因此,構(gòu)建室內(nèi)3 維模型是室內(nèi)導航的核心技術(shù)之一,目前室內(nèi)3 維模型構(gòu)建主要采用3 維點云[2]、建筑信息模型(building information modeling, BIM)[3]等方法,這些方法在構(gòu)建純粹的3 維模型時較為方便,但是不能直接發(fā)布模型和建立導航格網(wǎng),因此,本文提出BIM 與3 維集成(Unity 3D)平臺結(jié)合構(gòu)建室內(nèi)3 維模型,實現(xiàn)構(gòu)建室內(nèi)3 維模型的同時,建立室內(nèi)導航的導航格網(wǎng),為快速實現(xiàn)室內(nèi)3 維場景導航提供技術(shù)支撐。在室內(nèi)定位技術(shù)方面,基于無線局域網(wǎng)絡(luò)(wireless local area networks, WLAN)的室內(nèi)定位依然是如今研究的熱點,本文也是通過獲取WLAN 信號源的接收信號強度指示(received signal strength indicator, RSSI)值來計算空間距離實現(xiàn)室內(nèi)定位,最后完成導航系統(tǒng)的定位以及后續(xù)的路徑規(guī)劃測試。
Unity 3D 是美國集成技術(shù)(Unity Technologies)公司開發(fā)的一款3 維/2 維游戲、建筑設(shè)計可視化、虛擬現(xiàn)實開發(fā)平臺,可以為包括微軟視窗(Windows)、安卓(Android)、蘋果公司的移動操作系統(tǒng)(IOS)等主流操作系統(tǒng)開發(fā)軟件[4];其基本開發(fā)語言為C#,其相比于C++語言、加瓦(Java)語言等具有易上手、操作簡單等優(yōu)點[5]。
BIM 模型作為室內(nèi)導航的底圖數(shù)據(jù),是以 歐特克·雷維特(Autodesk Revit)為平臺,根據(jù)建筑設(shè)計圖及各個房間的位置列表、信號源位置等生成BIM 模型。使用BIM 模型的優(yōu)點在于可以及時查詢、修正、更新相關(guān)數(shù)據(jù),除此之外,其數(shù)據(jù)格式是通用、可以相互操作,這為數(shù)據(jù)的跨平臺使用提供了便利,同時BIM 模型也包含電梯、樓梯、信號源身份標識號(identity, ID)信息等精細化數(shù)據(jù),這樣便可以實現(xiàn)精度較高的跨樓層的定位與導航功能[6]。因此,本文選用BIM 模型作為室內(nèi)3 維場景構(gòu)建的基本方法。
為研究室內(nèi)3 維場景的導航,首先選擇了南京林業(yè)大學實驗樓作為實驗區(qū)域。構(gòu)建精度滿足要求的室內(nèi)3 維模型需要實驗場地所在建筑的建筑圖紙、樓梯節(jié)點結(jié)構(gòu)圖紙等原始資料。該實驗模型共6 層,其部分樓梯節(jié)點結(jié)構(gòu)設(shè)計圖、建筑平面圖如圖1、圖2 所示。
圖1 樓梯節(jié)點圖
構(gòu)建用于程序開發(fā)的3 維BIM 模型場景底圖,其基本步驟如下[7]:
1)創(chuàng)建網(wǎng)格、樓層線。根據(jù)建筑物的設(shè)計及建造情況創(chuàng)建基本網(wǎng)格與樓層分層線。網(wǎng)格的作用在于確定各建筑物構(gòu)件的正確位置,為模型的 創(chuàng)建打好基礎(chǔ);樓層線的作用則在于確定各樓層間的高度距離,以便于后期樓板與梁的創(chuàng)建。
圖2 試驗區(qū)域建筑平面圖
2)結(jié)構(gòu)設(shè)計圖、建筑平面圖的導入。在創(chuàng)建網(wǎng)格與樓層線后,將準備好的結(jié)構(gòu)設(shè)計圖和建筑平面圖導入,導入時應(yīng)與第1 步中創(chuàng)建的網(wǎng)格相對應(yīng),以免出現(xiàn)位置偏差等錯誤。
3)創(chuàng)建3 維組件。依照結(jié)構(gòu)設(shè)計圖和建筑平面圖依次繪制各種室內(nèi)3 維組件,并將其放置于網(wǎng)格正確位置上。對于不同的組件應(yīng)該選用不同的材質(zhì)。
4)文件的保存與輸出。將創(chuàng)建好的室內(nèi)3 維模型保存為.rvt 文件格式。本實驗區(qū)域的模型如圖3 所示。
圖3 實驗區(qū)域BIM 模型
出于最終界面及程序美觀的考慮,對于創(chuàng)建好的BIM 模型,將其導入3DS MAX 2018 中進行簡單渲染,渲染后將其輸出為 Unity 3D 可以使用的.fbx 文件格式,其結(jié)果如圖4 所示。此模型將是后續(xù)室內(nèi)導航程序的基本場景。
圖4 Unity 3D 中3 維模型
程序開發(fā)語言為.NET C#,其版本為 Visual Studio 2012, 此導航程序包含1 個主體程序和2 個子程序。程序以生成類庫并引用的形式實現(xiàn)了最終完整功能,其類型為 Windows Form 窗體應(yīng)用程序。
程序開發(fā)的基本思想是以Unity 3D 開發(fā)為主體,對于Unity 中使用腳本程序難以實現(xiàn)的,利用Visual Studio 2012 開發(fā)平臺實現(xiàn),完成各子程序的開發(fā)后,封裝為類庫文件并在Unity 3D 中使用腳本程序語言調(diào)用,最終實現(xiàn)全部功能。其具體的基本步驟如下:
1)3 維模型的導入與設(shè)置。將渲染與文件格式轉(zhuǎn)換后的3 維模型分別導入到“自動導航”場景、“瀏覽模式”場景,并做一些參數(shù)的調(diào)整,如將3 維模型設(shè)置為不可穿透。
2)場景燈光設(shè)置。導入3 維模型后,由于模型較大,需要對場景中進行燈光設(shè)置與渲染。
3)攝影機的設(shè)置。為程序設(shè)置1 個主攝影機與1 個第1 人稱跟隨攝影機。
4)角色碰撞器的設(shè)置與第1 人稱的實現(xiàn)。在場景中設(shè)置1 個基本角色(使用者視角主體),并為所做角色設(shè)置碰撞器(避免自動導航時出現(xiàn)穿墻等情況);為角色設(shè)置第1 人稱視角,使用鼠標控制跟隨攝影機的視角變換(可360°變換)。
5)導航網(wǎng)格的生成與實現(xiàn)、關(guān)鍵問題的解決、繪制導航路線。路線的實時繪制使用Unity 3D 中Line Renderer 組件實現(xiàn)。
6)WLAN 信息獲取與定位子程序的制作與類庫生成、目標房間輸入子程序的制作與類庫生成與引用。
7)設(shè)置界面的實現(xiàn)。設(shè)置中有2 項參數(shù)可以進行設(shè)置,分別為速度與重力設(shè)置。
8)程序界面UI 及窗體設(shè)計、程序測試與完善、程序版本與發(fā)布設(shè)置。
9)程序的測試與完善。
10)開發(fā)技術(shù)文檔及使用說明的撰寫。
導航網(wǎng)格生成是在Unity 3D 中實現(xiàn)路徑規(guī)劃及自動導航的第1 步,在Unity 3D 中提供了單獨的路網(wǎng)生成及自動導航的組件方法, 即“Navigation”,該組件提供了導航網(wǎng)格快速生成、烘焙渲染的方法,也提供了實現(xiàn)自動導航的類庫方法“AI”,但生成導航網(wǎng)格操作面板“Bake”選項的各參數(shù)(如表1 所示)需要選擇合適的數(shù)值。本文根據(jù)所選實驗場地的3 維模型反復實驗,選擇的參數(shù)數(shù)值如表1 所示,按此進行參數(shù)設(shè)置,可以完成導航網(wǎng)格的生成。
表1 “Bake”各輸入?yún)?shù)說明
因室內(nèi)3 維場景不同于2 維平面,在導航網(wǎng)格生成過程中發(fā)現(xiàn):導航網(wǎng)格無法覆蓋;樓梯、電梯等處的導航網(wǎng)格無法連接或連接不合理等。因此在參數(shù)設(shè)置時,需要選擇合理的數(shù)值,其中Agent Radius 與Drop Height 的影響最為顯著。
1)導航網(wǎng)格無法覆蓋。本文在導航網(wǎng)格生成時,首先以實驗模型的最小入口寬度0.7 m 為參照,將Agent Radius 設(shè)置為最小入口寬度的一半,同時以樓梯垂直高度為參照,將Drop Height 設(shè)置為1 m,此時出現(xiàn)導航網(wǎng)格無法完全覆蓋的情況(如圖5 淺灰色方框處所示)。在程序測試過程中,也發(fā)現(xiàn)導航物體(用戶第1 人稱視角的主體)不能跨越此導航網(wǎng)格缺失處,無法實現(xiàn)全實驗場地的路徑規(guī) 劃與自動尋路。分析發(fā)現(xiàn)該問題是因為物體半徑參數(shù)設(shè)置過大造成的,因此以0.1 m 為步長依次遞減該參數(shù)。通過實驗發(fā)現(xiàn)在物體半徑參數(shù)設(shè)置為0.15 m 時,可以實現(xiàn)模型內(nèi)導航網(wǎng)格的全部覆蓋(如圖6 所示)。
圖5 導航網(wǎng)格未覆蓋示意
圖6 調(diào)整后導航網(wǎng)格覆蓋示意
2)樓梯、電梯連接處無法連接或連接不合理。當實現(xiàn)了導航網(wǎng)格可以覆蓋所有房間后,又發(fā)現(xiàn)當前設(shè)置的參數(shù)值(Agent Radius=0.15 m、Drop Height=1 m)生成的導航網(wǎng)格在程序運行時,在樓梯、電梯連接處極易出現(xiàn)導航網(wǎng)格無法生成或者生成錯誤的情況(如圖7 所示),進而導致自動尋路被迫終止或程序的崩潰。
圖7 樓梯連接處錯誤示意
由圖7 中的方框處可看出,在樓梯與地面的連接處,由于導航網(wǎng)格連接不合理而導致了規(guī)劃路徑的跳躍,在這個位置物體(用戶第1 人稱視角的主體)會直接跳躍下部欄桿,與實際情況不符。分析發(fā)現(xiàn)引起此問題的主要原因是Agent Radius 參數(shù)值過低與Drop Height 參數(shù)值過高;因此,在上述設(shè)置的Agent Radius 參數(shù)值基礎(chǔ)上,以0.02 m 為步長依次提高Agent Radius 參數(shù)值,同時以0.1 m 為步長依次降低Drop Height 參數(shù)值。通過多次實驗最終在Agent Radius 值為0.21 m、Drop Height 值為0.5 m 時,在保證導航網(wǎng)格可以覆蓋模型內(nèi)所有房間的情況下,解決了樓梯處導航格網(wǎng)連接錯誤的問題(如圖8 所示)。不過由圖8 與圖7 對比還可以發(fā)現(xiàn),在樓梯處導航網(wǎng)格覆蓋區(qū)域減小,靠近樓梯兩側(cè)處沒有生成導航網(wǎng)格;但考慮到樓梯的功能是通行,因此,程序開發(fā)時設(shè)置了自動糾正功能來實現(xiàn)導航,即得到定位坐標后,程序首先會判斷此處是否覆蓋導航網(wǎng)格以及是否超出場景范圍,當定位坐標位于無導航格網(wǎng)處或超出場景范圍時,系統(tǒng)會自動求取距此最近的、覆蓋導航網(wǎng)格處的坐標,并將此坐標作為最終坐標,實現(xiàn)糾正功能。
本文根據(jù)上述試驗,總結(jié)出參數(shù)設(shè)置的幾條規(guī)律與技巧:
1)Agent Radius 值越小,導航網(wǎng)格面積越大;如果設(shè)置過大,會導致部分入口較小的房間無法完全覆蓋,如設(shè)置過小易導致像樓梯連接處的錯誤;設(shè)置此參數(shù)時應(yīng)先確定所使用3 維模型最小入口的寬度,保證最小入口處可以生成導航網(wǎng)格。
2)Agent Height 值應(yīng)保證小于3 維模型內(nèi)最矮的樓層及入口高度。
3)Max Slope 值不能超過60o,應(yīng)該以3 維模型內(nèi)各樓梯最高坡度為準。
4)Step Height 值應(yīng)保證大于3 維模型內(nèi)最大 的樓梯垂直高度且不能大于Agent Height 值。
室內(nèi)定位主要有基于WLAN 的定位技術(shù)[8]和基于紅外線[9]、超寬帶[10]、藍牙[11]等,而路徑規(guī)劃及自動導航方法常用的為A*算法[12]、導航網(wǎng)格算法[13]等。本文采用基于WLAN 的定位技術(shù)和導航網(wǎng)格算法,基于.NET 開發(fā)平臺,使用C#開發(fā)語言實現(xiàn)了RSSI 的自動獲取、空間距離的計算以及使用3 邊測量法計算得到待定點的空間3 維坐標,之后作為類庫文件在主程序中進行引用,實現(xiàn)了程序?qū)崟r定位功能。
對于距離的計算,本文使用式(1)的衰減因子模型[14]計算原理,即
式中:D 為所需的空間距離,RSSI 為獲取的信號強度值,A 為發(fā)射端和接收端相隔1 m 時的信號強度,n 為環(huán)境衰減因子。為確定本系統(tǒng)此2 項參數(shù)的設(shè)置,在試驗場景中通過設(shè)置不同的4 個信號源并采集它們在不同距離接收的信號強度(如圖9所示);然后在最小二乘條件約束下分別進行擬合并取均值。在實驗場景下,取A=-44 dB·m,n=4.0,最終在程序中實現(xiàn),效果如圖10 所示。
圖9 RSSI 隨距離變化圖
程序中定位按鈕可以實現(xiàn)對目標當前位置的自動運算,其定位方法為3 邊測量定位原理[15],所需的接入點(access point, AP)坐標在本實驗使用獨立坐標系,坐標原點位于實驗樓棟一樓大廳中心。由于定位精度變化的影響,可能會出現(xiàn)運算坐標超出場景范圍或位于無導航網(wǎng)格處的情況。因此本程序會對定位結(jié)果進行判斷,如出現(xiàn)上述情況,系統(tǒng)設(shè)置的自動糾正功能會按照2.3 節(jié) 所述原理進行糾正,以保證系統(tǒng)順利運行。單擊左側(cè)“刷新當前位置”按鈕,會顯示計算得到并糾正后的3 維坐標,然后跳轉(zhuǎn)到坐標處,如圖11所示。
圖10 定位功能程序效果
圖11 定位坐標示意
友好的程序使用界面、人性化程序使用方法是評價1 個程序好壞的重要標準,而這離不開用戶界面設(shè)計及窗體設(shè)計。本文主程序的界面設(shè)計使用的是Unity 3D 中的用戶界面(user interface, UI)設(shè)計系統(tǒng),主要設(shè)計及制作內(nèi)容為按鈕的設(shè)置、小地圖的制作、場景的跳轉(zhuǎn)等,主要程序功能及定位導航過程示意圖如圖12 所示。
在完成程序的功能實現(xiàn)、UI 及窗體設(shè)計以及程序測試完善后,設(shè)置發(fā)布參數(shù)及版本后便可以發(fā)布程序。
基于位置服務(wù)(location based services, LBS)的技術(shù)近些年來發(fā)展訊猛,為人們的日常生活提供各項便利服務(wù)。目前在室外環(huán)境下已經(jīng)有了成熟的定位導航技術(shù),而在室內(nèi)環(huán)境中,在基于WLAN 的定位技術(shù)和室內(nèi)3 維模型的構(gòu)建以及自動導航功能的實現(xiàn)等方面仍存在著許多需要解決的技術(shù)難題。本文主要以室內(nèi)3 維模型的構(gòu)建作為切入點進行研究,并面向室內(nèi)定位導航技術(shù)的完整流程,開發(fā)室內(nèi)3 維場景下的導航程序,旨在提供1 種可供借鑒的室內(nèi)定位導航程序設(shè)計開發(fā)方案。本文選擇使用Unity 3D 作為主程序的開發(fā)平臺,將BIM 與Unity 3D 結(jié)合解決3 維模型構(gòu)建的一些技術(shù)難題,配合基于WLAN 技術(shù)的定位程序和路徑規(guī)劃程序?qū)崿F(xiàn)3 維場景下導航的基本功能。