郭 語,鄭加柱
(南京林業大學 土木工程學院,南京 210037)
經過近十余年的發展,室內導航技術已取得了很大成就,其導航定位精度也能基本滿足人們日常出行的需求,目前正逐步走向商業化,不少信息技術公司也已經推出了適用于商場、地下停車場等公共場所的盈利性技術服務支持[1]。但是,1 個完備的商業化室內導航系統應該包含室內3 維模型構建、室內位置信息的獲取以及室內3 維場景下路徑規劃等3 部分,不能僅僅是1 個2 維模型下的導航系統,因此,構建室內3 維模型是室內導航的核心技術之一,目前室內3 維模型構建主要采用3 維點云[2]、建筑信息模型(building information modeling, BIM)[3]等方法,這些方法在構建純粹的3 維模型時較為方便,但是不能直接發布模型和建立導航格網,因此,本文提出BIM 與3 維集成(Unity 3D)平臺結合構建室內3 維模型,實現構建室內3 維模型的同時,建立室內導航的導航格網,為快速實現室內3 維場景導航提供技術支撐。在室內定位技術方面,基于無線局域網絡(wireless local area networks, WLAN)的室內定位依然是如今研究的熱點,本文也是通過獲取WLAN 信號源的接收信號強度指示(received signal strength indicator, RSSI)值來計算空間距離實現室內定位,最后完成導航系統的定位以及后續的路徑規劃測試。
Unity 3D 是美國集成技術(Unity Technologies)公司開發的一款3 維/2 維游戲、建筑設計可視化、虛擬現實開發平臺,可以為包括微軟視窗(Windows)、安卓(Android)、蘋果公司的移動操作系統(IOS)等主流操作系統開發軟件[4];其基本開發語言為C#,其相比于C++語言、加瓦(Java)語言等具有易上手、操作簡單等優點[5]。
BIM 模型作為室內導航的底圖數據,是以 歐特克·雷維特(Autodesk Revit)為平臺,根據建筑設計圖及各個房間的位置列表、信號源位置等生成BIM 模型。使用BIM 模型的優點在于可以及時查詢、修正、更新相關數據,除此之外,其數據格式是通用、可以相互操作,這為數據的跨平臺使用提供了便利,同時BIM 模型也包含電梯、樓梯、信號源身份標識號(identity, ID)信息等精細化數據,這樣便可以實現精度較高的跨樓層的定位與導航功能[6]。因此,本文選用BIM 模型作為室內3 維場景構建的基本方法。
為研究室內3 維場景的導航,首先選擇了南京林業大學實驗樓作為實驗區域。構建精度滿足要求的室內3 維模型需要實驗場地所在建筑的建筑圖紙、樓梯節點結構圖紙等原始資料。該實驗模型共6 層,其部分樓梯節點結構設計圖、建筑平面圖如圖1、圖2 所示。

圖1 樓梯節點圖
構建用于程序開發的3 維BIM 模型場景底圖,其基本步驟如下[7]:
1)創建網格、樓層線。根據建筑物的設計及建造情況創建基本網格與樓層分層線。網格的作用在于確定各建筑物構件的正確位置,為模型的 創建打好基礎;樓層線的作用則在于確定各樓層間的高度距離,以便于后期樓板與梁的創建。

圖2 試驗區域建筑平面圖
2)結構設計圖、建筑平面圖的導入。在創建網格與樓層線后,將準備好的結構設計圖和建筑平面圖導入,導入時應與第1 步中創建的網格相對應,以免出現位置偏差等錯誤。
3)創建3 維組件。依照結構設計圖和建筑平面圖依次繪制各種室內3 維組件,并將其放置于網格正確位置上。對于不同的組件應該選用不同的材質。
4)文件的保存與輸出。將創建好的室內3 維模型保存為.rvt 文件格式。本實驗區域的模型如圖3 所示。

圖3 實驗區域BIM 模型
出于最終界面及程序美觀的考慮,對于創建好的BIM 模型,將其導入3DS MAX 2018 中進行簡單渲染,渲染后將其輸出為 Unity 3D 可以使用的.fbx 文件格式,其結果如圖4 所示。此模型將是后續室內導航程序的基本場景。

圖4 Unity 3D 中3 維模型
程序開發語言為.NET C#,其版本為 Visual Studio 2012, 此導航程序包含1 個主體程序和2 個子程序。程序以生成類庫并引用的形式實現了最終完整功能,其類型為 Windows Form 窗體應用程序。
程序開發的基本思想是以Unity 3D 開發為主體,對于Unity 中使用腳本程序難以實現的,利用Visual Studio 2012 開發平臺實現,完成各子程序的開發后,封裝為類庫文件并在Unity 3D 中使用腳本程序語言調用,最終實現全部功能。其具體的基本步驟如下:
1)3 維模型的導入與設置。將渲染與文件格式轉換后的3 維模型分別導入到“自動導航”場景、“瀏覽模式”場景,并做一些參數的調整,如將3 維模型設置為不可穿透。
2)場景燈光設置。導入3 維模型后,由于模型較大,需要對場景中進行燈光設置與渲染。
3)攝影機的設置。為程序設置1 個主攝影機與1 個第1 人稱跟隨攝影機。
4)角色碰撞器的設置與第1 人稱的實現。在場景中設置1 個基本角色(使用者視角主體),并為所做角色設置碰撞器(避免自動導航時出現穿墻等情況);為角色設置第1 人稱視角,使用鼠標控制跟隨攝影機的視角變換(可360°變換)。
5)導航網格的生成與實現、關鍵問題的解決、繪制導航路線。路線的實時繪制使用Unity 3D 中Line Renderer 組件實現。
6)WLAN 信息獲取與定位子程序的制作與類庫生成、目標房間輸入子程序的制作與類庫生成與引用。
7)設置界面的實現。設置中有2 項參數可以進行設置,分別為速度與重力設置。
8)程序界面UI 及窗體設計、程序測試與完善、程序版本與發布設置。
9)程序的測試與完善。
10)開發技術文檔及使用說明的撰寫。
導航網格生成是在Unity 3D 中實現路徑規劃及自動導航的第1 步,在Unity 3D 中提供了單獨的路網生成及自動導航的組件方法, 即“Navigation”,該組件提供了導航網格快速生成、烘焙渲染的方法,也提供了實現自動導航的類庫方法“AI”,但生成導航網格操作面板“Bake”選項的各參數(如表1 所示)需要選擇合適的數值。本文根據所選實驗場地的3 維模型反復實驗,選擇的參數數值如表1 所示,按此進行參數設置,可以完成導航網格的生成。

表1 “Bake”各輸入參數說明
因室內3 維場景不同于2 維平面,在導航網格生成過程中發現:導航網格無法覆蓋;樓梯、電梯等處的導航網格無法連接或連接不合理等。因此在參數設置時,需要選擇合理的數值,其中Agent Radius 與Drop Height 的影響最為顯著。
1)導航網格無法覆蓋。本文在導航網格生成時,首先以實驗模型的最小入口寬度0.7 m 為參照,將Agent Radius 設置為最小入口寬度的一半,同時以樓梯垂直高度為參照,將Drop Height 設置為1 m,此時出現導航網格無法完全覆蓋的情況(如圖5 淺灰色方框處所示)。在程序測試過程中,也發現導航物體(用戶第1 人稱視角的主體)不能跨越此導航網格缺失處,無法實現全實驗場地的路徑規 劃與自動尋路。分析發現該問題是因為物體半徑參數設置過大造成的,因此以0.1 m 為步長依次遞減該參數。通過實驗發現在物體半徑參數設置為0.15 m 時,可以實現模型內導航網格的全部覆蓋(如圖6 所示)。

圖5 導航網格未覆蓋示意

圖6 調整后導航網格覆蓋示意
2)樓梯、電梯連接處無法連接或連接不合理。當實現了導航網格可以覆蓋所有房間后,又發現當前設置的參數值(Agent Radius=0.15 m、Drop Height=1 m)生成的導航網格在程序運行時,在樓梯、電梯連接處極易出現導航網格無法生成或者生成錯誤的情況(如圖7 所示),進而導致自動尋路被迫終止或程序的崩潰。

圖7 樓梯連接處錯誤示意
由圖7 中的方框處可看出,在樓梯與地面的連接處,由于導航網格連接不合理而導致了規劃路徑的跳躍,在這個位置物體(用戶第1 人稱視角的主體)會直接跳躍下部欄桿,與實際情況不符。分析發現引起此問題的主要原因是Agent Radius 參數值過低與Drop Height 參數值過高;因此,在上述設置的Agent Radius 參數值基礎上,以0.02 m 為步長依次提高Agent Radius 參數值,同時以0.1 m 為步長依次降低Drop Height 參數值。通過多次實驗最終在Agent Radius 值為0.21 m、Drop Height 值為0.5 m 時,在保證導航網格可以覆蓋模型內所有房間的情況下,解決了樓梯處導航格網連接錯誤的問題(如圖8 所示)。不過由圖8 與圖7 對比還可以發現,在樓梯處導航網格覆蓋區域減小,靠近樓梯兩側處沒有生成導航網格;但考慮到樓梯的功能是通行,因此,程序開發時設置了自動糾正功能來實現導航,即得到定位坐標后,程序首先會判斷此處是否覆蓋導航網格以及是否超出場景范圍,當定位坐標位于無導航格網處或超出場景范圍時,系統會自動求取距此最近的、覆蓋導航網格處的坐標,并將此坐標作為最終坐標,實現糾正功能。
本文根據上述試驗,總結出參數設置的幾條規律與技巧:
1)Agent Radius 值越小,導航網格面積越大;如果設置過大,會導致部分入口較小的房間無法完全覆蓋,如設置過小易導致像樓梯連接處的錯誤;設置此參數時應先確定所使用3 維模型最小入口的寬度,保證最小入口處可以生成導航網格。
2)Agent Height 值應保證小于3 維模型內最矮的樓層及入口高度。
3)Max Slope 值不能超過60o,應該以3 維模型內各樓梯最高坡度為準。
4)Step Height 值應保證大于3 維模型內最大 的樓梯垂直高度且不能大于Agent Height 值。
室內定位主要有基于WLAN 的定位技術[8]和基于紅外線[9]、超寬帶[10]、藍牙[11]等,而路徑規劃及自動導航方法常用的為A*算法[12]、導航網格算法[13]等。本文采用基于WLAN 的定位技術和導航網格算法,基于.NET 開發平臺,使用C#開發語言實現了RSSI 的自動獲取、空間距離的計算以及使用3 邊測量法計算得到待定點的空間3 維坐標,之后作為類庫文件在主程序中進行引用,實現了程序實時定位功能。
對于距離的計算,本文使用式(1)的衰減因子模型[14]計算原理,即

式中:D 為所需的空間距離,RSSI 為獲取的信號強度值,A 為發射端和接收端相隔1 m 時的信號強度,n 為環境衰減因子。為確定本系統此2 項參數的設置,在試驗場景中通過設置不同的4 個信號源并采集它們在不同距離接收的信號強度(如圖9所示);然后在最小二乘條件約束下分別進行擬合并取均值。在實驗場景下,取A=-44 dB·m,n=4.0,最終在程序中實現,效果如圖10 所示。

圖9 RSSI 隨距離變化圖
程序中定位按鈕可以實現對目標當前位置的自動運算,其定位方法為3 邊測量定位原理[15],所需的接入點(access point, AP)坐標在本實驗使用獨立坐標系,坐標原點位于實驗樓棟一樓大廳中心。由于定位精度變化的影響,可能會出現運算坐標超出場景范圍或位于無導航網格處的情況。因此本程序會對定位結果進行判斷,如出現上述情況,系統設置的自動糾正功能會按照2.3 節 所述原理進行糾正,以保證系統順利運行。單擊左側“刷新當前位置”按鈕,會顯示計算得到并糾正后的3 維坐標,然后跳轉到坐標處,如圖11所示。

圖10 定位功能程序效果

圖11 定位坐標示意
友好的程序使用界面、人性化程序使用方法是評價1 個程序好壞的重要標準,而這離不開用戶界面設計及窗體設計。本文主程序的界面設計使用的是Unity 3D 中的用戶界面(user interface, UI)設計系統,主要設計及制作內容為按鈕的設置、小地圖的制作、場景的跳轉等,主要程序功能及定位導航過程示意圖如圖12 所示。
在完成程序的功能實現、UI 及窗體設計以及程序測試完善后,設置發布參數及版本后便可以發布程序。
基于位置服務(location based services, LBS)的技術近些年來發展訊猛,為人們的日常生活提供各項便利服務。目前在室外環境下已經有了成熟的定位導航技術,而在室內環境中,在基于WLAN 的定位技術和室內3 維模型的構建以及自動導航功能的實現等方面仍存在著許多需要解決的技術難題。本文主要以室內3 維模型的構建作為切入點進行研究,并面向室內定位導航技術的完整流程,開發室內3 維場景下的導航程序,旨在提供1 種可供借鑒的室內定位導航程序設計開發方案。本文選擇使用Unity 3D 作為主程序的開發平臺,將BIM 與Unity 3D 結合解決3 維模型構建的一些技術難題,配合基于WLAN 技術的定位程序和路徑規劃程序實現3 維場景下導航的基本功能。