夏延哲
(廣東工業大學 計算機學院,廣州510006)
隨著中國經濟的快速增長,人們不僅僅只滿足于物質上的富足,而對精神充實的追求也越來越高。從2006年起,中國文物機構和博物館觀覽人數持續上升。博物館已經不僅是收藏、保護、研究、展示文化遺產的機構,還將成為面向未來的文化服務和教育機構。而當游客難以找到參觀的藝術品時,就會造成無序的人流流動,導致游客的參觀過程非常混亂。
本文提出通過ARKit技術,解決傳統的博物館參觀中尋找目標藝術品的途徑。針對現有室內導航過程中存在的設備運動跟蹤不準確、攝像頭圖像采集、圖像視覺處理、場景渲染等技術問題,提出了采用ARKit結合Unity 3D平臺進行室內場景導航的方法;通過整合設備攝像頭圖像信息與設備運動傳感器(包括LiDAR)信息,在AR跟蹤穩定性、渲染真實度、人機交互自然度上達到較好的效果。創建前端頁面與后端程序的交互,開發室內三維場景導航程序,完成定位場景中坐標點、路徑規劃、地圖信息保存及自動尋路等主要功能。結果證明,該方法可以實現室內自動導航,減少了游客尋找目標展品的時間,提升改善了博物館的參觀游覽情況,符合現代化博物館建設的需求。
2017年,蘋果公司正式推出了增強現實的開發框架ARKit。從本質上,AR是將2D/3D元素(文字、圖片、模型、音視頻等)放置于設備攝像頭所采集的圖像中,營造一種虛擬元素真實存在于現實世界中的假象。ARKit通過移動設備(包括手機、平板電腦等)單目攝像頭采集的圖像信息(包括LiDAR采集的信息),實現了平面檢測識別、場景幾何、環境光估計、環境光反射、圖像識別、3D物體識別等功能。但一個完備的室內導航系統還應該包含前端頁面的操作,用戶操作流程等。因此,本文提出了將ARKit與三維集成平臺結合,設計出相應的前端頁面,利用ARKit的強大功能,通過用戶選定目標點,采用合適的算法進行路徑規劃,最終實現導航的功能。創建一個現實和虛擬空間之間的對應關系,ARKit使用的技術稱為視覺慣性測距。這個過程結合了從iOS設備的運動傳感硬件與設備的攝像頭獲取到的圖像[1]。ARKit識別具有顯著特征的場景圖像,跟蹤視頻幀之間的特征差異的位置,將該信息與運動傳感數據比較,從而得到一個高精度的設備位置和運動模型,其中包含世界跟蹤還分析和理解場景的內容。使用命中測試方法找到對應于相機圖像中某個點的真實世界的表面。
ARKit官方提供了Xcode開發包,這也提高了利用其它工具進行開發的學習成本。在這種情況下,Unity構建了一個AR開發平臺-ARFoundation,該平臺架構于ARKit和ARCore之上,其目的是利用Unity的跨平臺能力,構建一種與平臺無關的AR開發環境。即,ARFoundation對ARKit與ARCore進行了再次封裝,并按照用戶的發布平臺,自動選擇合適的底層SDK版本。ARFoundation提供了一個獨立于平臺的腳本API和MonoBehaviour。因此,開發者可以通過ARFoundation使用ARCore和ARKit共有的核心功能構建,同時適用于iOS和Android兩個平臺的AR應用程序。這可以讓開發者只需開發一次應用,就可以部署到兩個平臺的設備上,不必做任何改動[2]。
程序定位導航原理的大致流程為:首先進行地圖信息的采集;然后對目標特征點信息進行識別和保存;選用合適的路徑規劃算法,生成導航路徑。
對真實環境中的掃描和測量,并且保存到后臺系統中是該模塊重點實現的問題。本程序對于三維環境動態的實時理解,主要依賴于單目SLAM技術來實現。在游客移動過程中,一方面要把攝像頭所拍到的圖像連接成地圖,另一方面將地圖的信息存儲到后方的數據庫中。同時,針對如何識別攝像頭中的平面問題,采取通過光學系統檢測到的特征計算生成。通常稱這些點為“點云(Point cloud)”。形成稀疏點云之后,在少量的內存和CPU的支持,輔以慣性系統的配合下可以定義成平面,即使在只有少量追蹤點的情況下,仍然可以有效地運作[3]。具體操作流程如圖1所示。
此模塊的功能主要是對藝術品具體位置進行定位,將藝術品的位置信息傳輸到服務器。此時需將攝像頭中藝術品的位置創建三維物體對象,并且生成該對象在導航程序中全局坐標系數據。只要選定設置好不同藝術品的位置,就可以實現相互之間的路徑生成和線路導航。三維物體在場景中的生成如圖2所示。
產生位置信息具體封裝代碼如下:



圖1 空間信息識別流程Fig.1 Spatial information identification process

圖2 位置信息采集Fig.2 Location information collection
導航路線規劃系統是通過兩個目標點在地圖中的位置信息,來進行規劃和確定的。如圖2所示,首先判斷兩點是否在同一聯通分量上。通過一次完整的dfs,可以得到一個聯通分量,只要兩點都被同一次dfs訪問過,則就存在路徑。產生路徑的核心算法負責從未被訪問到的節點列表(from表)中提取節點的序列號,從終節點的序列號開始一直調用from[終節點]往前推,直到推出某個節點i的from[i]=-1,表示節點i沒有前節點,即節點i就是起始源節點。雖然推出來的序列號順序是反向的路徑,但可以把這個反向的節點序列壓入一個棧中,然后一個一個出棧放入一個向量vec中保存,這個向量中保存的序列就是正確的順序。showPath主要調用p at h函數來準備路徑數據,并傳入一個向量vect o r給p at h函數,用來存儲路徑信息。之后再控制輸出格式把節點一個一個輸出來,就形成了一條路徑,如圖3所示。

圖3 路徑規劃示意圖Fig.3 Schematic diagram of path planning
路徑規劃中的關鍵代碼如下:

程序開發語言為.NET C#,其版本為Visual Studio 2019,本程序支持在IOS平臺上進行,兼容IOS12及以上的操作系統。
本程序的開發是以Unity3D為主要開發平臺,對于程序中需要使用到的腳本文件,則利用Visual Studio 2019進行腳本的編輯與測試,在完成腳本的編寫與ARKit的控制器成功引入之后,將程序發布到IOS設備中,并可以正常使用。其具體實現步驟如下:
(1)ARKit中控制器導入。將ARKit提供的一些關鍵的控制器導入到程序的工程中。ARWorldMap控制器用來添加環境掃描,用于掃描攝像頭中的空間信息,并且將當前環境數據保存在本地。AR Session Origin為創建的地圖設置本地坐標信息。
(2)場景內物體生成。通過Anchor Prefab腳本,使得用戶點擊攝像頭中某個已經掃描出來的錨點時,會在本地生成一個3D物體,并且記錄其當前的位置信息。該3D物體的形狀和外形可以自定義。
(3)導航路徑規劃。在場景中設置Path Finder腳本,實現各個目標點之間路徑的規劃。場景中的任意物體,需要去添加每個節點的坐標,并且在Paths中設置每條線路的規劃。如:A->B;A->C;B->C;C->D;D->A。
(4)導航線段的生成與渲染。該部分需要搭配Unity中的LineRenderer組件來實現。在線段的材質和貼圖方面,需要調整幾項參數:動態修改Tiling參數的信息。當路程較長時,則X軸的信息為總路程:MyPoint+for(int i=0;i<Each Coordinate Information)。將每個坐標的間隔距離相加,就可以得到最終的總路程信息。
(5)程序UI界面的實現。在UI設計中,考慮到不同設備的機型,通過微調UI面板的寬度與高度信息,來達到系統的自動適配。當設計分辨率與設備分辨率不同時,需要將UI界面經過一定縮放投射到屏幕上。
(6)程序的調試以及bug的修改。
(7)撰寫程序的使用說明以及開發文檔。
一個優秀的導航程序,離不開友好、人性化的使用界面。程序的界面和窗體設計是用戶是否能快速上手使用的重要因素。本文導航程序使用FairyGUI來設計前端操作頁面,通過前端清晰的操作按鈕與后臺控制器的綁定,實現了程序操作的簡化,同時提高了易用性。程序的主要功能以及定位導航過程示意如圖4所示。

圖4 定位導航過程示意圖Fig.4 Schematic diagram of positioning and navigation process
本文根據目前博物館參覽的實際情況,在對相關技術進行選型以及研究后,采用ARKit技術來設計導航系統。針對游客在游覽時存在的尋找藝術品位置不便的問題,提供了線路和路徑導航的解決方案。系統的應用,將在很大程度上解決了館內人流無序的問題,更有利于維護館內的秩序,以及更好地利用藝術品被欣賞的文化價值。