顧青濤,孫書良
(1.北京衛(wèi)星導(dǎo)航中心,北京100094; 2.衛(wèi)星導(dǎo)航系統(tǒng)與裝備技術(shù)國家重點實驗室,河北 石家莊 050081)
根據(jù)近幾年的統(tǒng)計,人們的生活時間有80%~90%處于室內(nèi)環(huán)境中,包括在商場、機場、圖書館和大學校園等場所[1],同時70%的移動電話和80%的蜂窩數(shù)據(jù)傳輸來自于室內(nèi)[2],這些引起了人們對基于位置服務(wù)與位置感知的室內(nèi)定位的濃厚興趣,例如對建設(shè)中的建筑物進行導(dǎo)航與規(guī)劃、資產(chǎn)跟蹤,還有一些老年人輔助生活等[3]。
傳感器技術(shù)與網(wǎng)絡(luò)技術(shù)的發(fā)展為室內(nèi)定位方法的拓展與應(yīng)用提供技術(shù)支撐[4]。無線網(wǎng)絡(luò)的普及使得基于WiFi技術(shù)的室內(nèi)定位方法得以實施,但WiFi信號多徑效應(yīng)又限制了其單一方法的定位精度[5];地磁匹配技術(shù)作為定位方法已有多年發(fā)展歷史[6],但室內(nèi)磁場環(huán)境受建筑特點及環(huán)境因素影響,出現(xiàn)磁場分布異常現(xiàn)象[7],單一地磁無法達到室內(nèi)人員定位的精度需求[8]。
圍繞上述單一定位方式局限性,本文將RSSI與地磁匹配方法融合,利用移動端固有的WiFi模塊與地磁傳感器模塊開展室內(nèi)組合定位算法的設(shè)計與測試。提出將平面位置坐標、最近與次最近RSSI、WiFi數(shù)據(jù)和地磁數(shù)據(jù)組成聯(lián)合指紋,分別基于Android平臺和javaEE開發(fā)移動端并搭建服務(wù)器[9],服務(wù)器端接收移動端提供的最近和次最近的RSSI后與數(shù)據(jù)庫信息進行粗匹配,利用求解得到的地磁數(shù)據(jù)hausdorff距離開展精匹配并向移動端提供室內(nèi)位置信息[10]。
通過采集WiFi信號和地磁數(shù)據(jù),篩選最強與次最強RSSI并結(jié)合室內(nèi)平面坐標組成聯(lián)合指紋,通過Android平臺和javaEE開發(fā)平臺搭建移動端和服務(wù)器端[11]。
由圖1所示的系統(tǒng)框架可看出,室內(nèi)定位系統(tǒng)由移動端和服務(wù)器端構(gòu)成,移動端包括交互層、業(yè)務(wù)邏輯層和控制層[12],交互層為用戶提供操作界面并顯示室內(nèi)平面地圖及定位位置,業(yè)務(wù)邏輯層負責處理平面坐標數(shù)據(jù),控制層完成與服務(wù)器的數(shù)據(jù)通信;服務(wù)器端包括控制層、業(yè)務(wù)邏輯層和數(shù)據(jù)庫層,數(shù)據(jù)庫層保存采集的數(shù)據(jù),業(yè)務(wù)邏輯層負責處理RSSI與地磁數(shù)據(jù)匹配解算等業(yè)務(wù)邏輯,控制層負責完成與移動端的數(shù)據(jù)通信。

圖1 系統(tǒng)框架
1.1.1交互層
自定義MapImageView:基于安卓開發(fā)平臺,繼承ImageView控件,自定義加載圖片控件MapImageView,該控件重寫屏幕觸摸事件onTouch并添加手勢探測器GestureDetector,處理圖片移動和縮放,方便用戶采集數(shù)據(jù)時精確選擇圖上位置點。通過畫布Canvas的drawBitmap函數(shù),在圖中繪制標志點,為自定義控件MapImageView添加addPoint函數(shù)與drawPosition函數(shù),用于繪制圖上關(guān)鍵點和定位位置。
UI界面實現(xiàn):通過主界面布局文件添加豎向的LinearLayout線性布局,該布局中添加MapImageView和包含功能按鈕的2個橫向LinearLayout線性布局組成主界面UI[13]。在主界面MainActivity中注冊功能按鈕點擊監(jiān)聽器OnClickListener,用于響應(yīng)功能按鈕的點擊事件,處理用戶的操作。
1.1.2業(yè)務(wù)邏輯層
為組成匹配需要的聯(lián)合指紋庫,移動端業(yè)務(wù)邏輯層處理采集路徑的關(guān)鍵點、周期性采集的地磁數(shù)據(jù)、WiFi數(shù)據(jù)并分別保存到List集合中。用戶通過點擊下一段功能按鈕,依據(jù)采集數(shù)據(jù)量,通過平均分配平面坐標位置x、y,結(jié)合每組的WiFi與地磁數(shù)據(jù)組成聯(lián)合指紋,利用谷歌的Gson插件將聯(lián)合指紋轉(zhuǎn)換成json數(shù)據(jù)傳遞到控制層[14]。定位模式下獲取控制層從服務(wù)器得到的坐標數(shù)據(jù),根據(jù)當前圖像的縮放比例得到圖上距離,傳遞到交互層。
1.1.3控制層
利用http協(xié)議,移動端控制層將采集的數(shù)據(jù)傳輸?shù)椒?wù)器,系統(tǒng)處于定位模式時,將采集的數(shù)據(jù)傳遞給服務(wù)器后獲取最佳匹配位置并傳遞給業(yè)務(wù)邏輯層。本文提出采用okHttp框架,利用okHttpClient的newCall方法傳遞Request參數(shù),Request參數(shù)中包含封裝采集數(shù)據(jù)的RequestBody與服務(wù)器接口信息,并在Callback回調(diào)函數(shù)中處理服務(wù)器返回數(shù)據(jù)。
利用Spring、SpringMVC和Mabatis框架(SSM框架)搭建服務(wù)器開發(fā)環(huán)境。
1.2.1控制層
利用注解@Controller添加控制器IndoorController,利用注解@RequestMapping為控制器IndoorController添加saveindoorData、getPosition兩個請求映射。通過服務(wù)器端控制層接收移動端的服務(wù)請求后,利用請求映射參數(shù)HttpServerletRequest獲取數(shù)據(jù)并傳遞到業(yè)務(wù)邏輯層,利用HttpServerletRespose將業(yè)務(wù)邏輯層的處理結(jié)果返回到移動端。
1.2.2業(yè)務(wù)邏輯層
通過接收控制層saveindoorData請求映射中的數(shù)據(jù),利用數(shù)據(jù)庫層的Dao對象將采集的聯(lián)合指紋保存到數(shù)據(jù)庫。定位模式時,接收getPosition請求映射的數(shù)據(jù),利用請求數(shù)據(jù)中的最近BSSID、次最近BSSID篩選數(shù)據(jù)庫數(shù)據(jù),解算篩選后的地磁數(shù)據(jù)的hausdorff距離進行精匹配獲取坐標數(shù)據(jù)并返回。
1.2.3數(shù)據(jù)庫層
依據(jù)SQL語句[15],實現(xiàn)通過最近與次最近BSSID、模糊查詢等操作函數(shù)對保存在mysql數(shù)據(jù)庫的聯(lián)合指紋進行查詢并反饋結(jié)果。
為獲取聯(lián)合指紋庫中的最近與次最近RSSI和WiFi數(shù)據(jù),利用Android系統(tǒng)固有的WiFi模塊采集WiFi信號,基于WiFi信號強度與傳輸距離成正比的特性,提出利用WiFi信號強度對采集的WiFi數(shù)據(jù)進行排序。以走廊兩側(cè)WiFi信號為采集目標,開啟安卓系統(tǒng)WiFi信號接收服務(wù),采集WiFi信號、篩選WiFi的AP地址BSSID、網(wǎng)絡(luò)名稱SSID、信號強度level過程如下:
① 通過getSystemService(Context.WIFI_ SERVICE)獲取定位管理器WiFiManager,調(diào)用WiFiManager的setWiFiEnabled(true)方法開啟WiFi;
② 利用WiFiManager的startScan()方法掃描WiFi信號;
③ 調(diào)用WiFiManager的getScanResults()方法得到掃描結(jié)果List
④ 通過ScanResult變量得到AP的BSSID、SSID和level的值,結(jié)合平面坐標并保存為:
X坐標:Xn;Y坐標:Yn;Ap數(shù)據(jù):
[{“BSSID”:”f0:b4:29:52:d8:73”,”SSID”:”RS101”,”level”:-47},{“BSSID”:”f2:b4:29:1d:41:c6”,”SSID”:”RS103Visit”,”level”:-53},{“BSSID”:”f0:b4:29:1d:41:c4”,”SSID”:”RS103”,”level”:-54}]
基于Android手機終端固有的地磁傳感器在不同時刻條件下采集室內(nèi)地磁數(shù)據(jù)如圖2所示。




圖2 地磁場信息比對
圖2(a)是2次采集數(shù)據(jù)的三維分布;圖2(b)、圖2(c)和圖2(d)分別是x、y、z軸的地磁數(shù)據(jù)分布特征比對,通過分析地磁數(shù)據(jù)特征分布可看出,不同時刻的地磁場分布特征穩(wěn)定不變,保證利用地磁數(shù)據(jù)進行室內(nèi)定位方法的可行性。基于Android平臺獲取地磁數(shù)據(jù)的過程如下:
① 調(diào)用getSystemService(Context.SENSOR_ SERVICE)方法獲取傳感器管理器SensorManeger,SensorManeger管理安卓平臺傳感器的操作;
② 調(diào)用SensorManeger的getDefaltSensor(Sensor.TYPE_MAGNETIC_FIELD)獲取地磁傳感器;
③ 調(diào)用SensorManeger的registerListener()方法注冊地磁數(shù)據(jù)監(jiān)聽器SensorEventLitener,地磁數(shù)據(jù)變化時,系統(tǒng)回調(diào)SensorEventLitener的onSensorChanged()函數(shù);
④ 在onSensorChanged(SensorEvent event)函數(shù)中event的values變量中獲取地磁數(shù)據(jù)。
為避免數(shù)據(jù)采集過程中因手機搖擺引起的誤差,設(shè)計將手機坐標系下獲取的地磁數(shù)據(jù)轉(zhuǎn)換到導(dǎo)航坐標系。其中,手機坐標系定義為x軸水平指向右、y軸垂直向上、z軸是指向屏幕正面向外[16],如圖3所示。

圖3 手機坐標系
SensorManeger提供getRotationMatrix()方法用于獲取設(shè)備旋轉(zhuǎn)矩陣,通過式(1)完成地磁數(shù)據(jù)到導(dǎo)航坐標系的轉(zhuǎn)換。
(1)
式中,magx、magy、magz分別為手機端采集的三軸地磁數(shù)據(jù);magx′magy′magz′為地磁數(shù)據(jù)在導(dǎo)航坐標系的表現(xiàn)形式;R為手機坐標系相對導(dǎo)航坐標系的旋轉(zhuǎn)矩陣。getRotationMatrix()定義的導(dǎo)航坐標系如圖4所示[17]。

圖4 導(dǎo)航坐標系
圖4中,x軸切向地面設(shè)備當前位置指向東、y軸切向地面設(shè)備當前位置指向磁北極、z軸垂直當?shù)厮矫娌⒅赶蛱臁?/p>
通過分析多種地磁匹配技術(shù)的優(yōu)缺點與適用性[18],確定以Hausdorff距離為度量的地磁數(shù)據(jù)匹配方法,該方法不僅考慮2個目標之間的距離關(guān)系還涉及目標之間的形狀差異[19]。針對Hausdorff距離用于測量2個點集的匹配程度并且不強調(diào)配對點,具有很強的抗干擾能力和容錯能力。本文提出在建立地磁數(shù)據(jù)庫時以每3 s保存一次地磁數(shù)據(jù)并組成點集M,在實際定位過程中每3 s采集一次地磁數(shù)據(jù)組成點集N(如式(2))。通過計算點集M、N的Hausdorff距離,以距離越小匹配程度越高為判斷依據(jù)。
(2)
M、N兩個點集的Hausdorff距離計算過程為:
H(M,N)=max(h(M,N),h(N,M)),
(3)
(4)
(5)
式中,‖·‖是定義在集合M和N的范數(shù),以兩點間幾何最短距離為判定準則得到地磁數(shù)據(jù)范數(shù)計算公式:
(6)
點集M和N之間的Hausdorff距離為M點集所有點到N點集所有點最小距離的最大值maxM與N點集所有點到M點集所有點最小距離的最大值maxN中的最大值,即
H(M,N)=max(maxM,maxN)。
(7)
基于RSSI與地磁定位原理的特征[20],設(shè)計以當前位置所有WiFi數(shù)據(jù)地址BSSID、信號強度level、網(wǎng)絡(luò)名稱SSID、最近BSSID、次最近BSSID、當前位置3 s內(nèi)所有的地磁數(shù)據(jù)為聯(lián)合指紋,如表1所示。
表1聯(lián)合指紋數(shù)據(jù)

類別數(shù)據(jù)id233x694y199firstBSSID80:89:17:c4:66:1esecondBSSID14:e6:e4:2e:1c:caWiFiData[{“BSSID”:”80:89:17:c4:66:1e”,”SSID”:”108”,”level”:-47},{“BSSID”:”14:e6:e4:2e:1c:ca”,”SSID”:”GIS105”,”level”:-53},{“BSSID”:”14:e6:e4:2e:1c:ca”,”SSID”:”RS106”,”level”:-64},{“BSSID”:”10:c6:e4:2e:12:3a”,”SSID”:”免WiFi”,”level”:-68}]magData[{“mag”:[27.778625,-9.1796875,-24.119568]},{“mag”:[28.019714,-9.47876,-23.939415]},{“mag”:[28.318787,-9.599304,-23.399353]},{“mag”:[28.799438,-9.779358,-23.35684]}]
通過以3 s為周期不斷循環(huán)采集數(shù)據(jù),系統(tǒng)處于定位模式時的移動端向服務(wù)器請求匹配服務(wù),服務(wù)器首先根據(jù)采集的最近和次最近BSSID與篩選數(shù)據(jù)庫數(shù)據(jù)進行粗匹配;其次,以Hausdorff距離為度量對地磁數(shù)據(jù)進行精匹配并得到最佳匹配點坐標x、y后返回給移動端,完成對移動端用戶位置信息請求的答復(fù)。
基于RSSI與地磁融合定位原理,搭建移動端和服務(wù)器端開發(fā)環(huán)境,根據(jù)系統(tǒng)需求設(shè)計的移動端UI界面主要由一個圖片控件ImageView和功能按鈕組成(路徑、開始、下一段、停止、定位、清除、下一個點)。為驗證系統(tǒng)穩(wěn)定性與精度,本文搭建了實驗樓測試環(huán)境,通過量邊繪制室內(nèi)實驗建筑平面圖并獲取平面位置坐標,如圖5所示。

圖5 室內(nèi)平面圖
實驗測試過程如下:
① 拖動MapImageView控件加載的室內(nèi)平面圖,以位于MapImageView中央位置不變的小旗子為標志點,通過拖動平面圖并選取小旗對應(yīng)的位置點為采集路徑的關(guān)鍵點。基于Canvas的drawLine、drawBitmap函數(shù)繪制實驗數(shù)據(jù)采集路線A—B—C—D—C—B—A和關(guān)鍵點,如圖6所示。

圖6 選擇路徑
② 手機平放胸前,在實驗軌跡起始點A處點擊開始按鈕采集數(shù)據(jù),依照計劃路線勻速行走,到達B點時點擊下一段,開始下一段數(shù)據(jù)的采集,依次采集每一路線段,最終返回A點結(jié)束采集。
③ 點擊定位按鈕開啟定位模式,移動端控制層將采集的實時數(shù)據(jù)傳遞到服務(wù)器端進行匹配并獲取待匹配位置點的坐標x、y,利用Canvas的drawBitmap函數(shù)繪制到當前平面圖上。

圖7 實驗效果
如圖7所示,通過采集實驗樓數(shù)據(jù)搭建指紋庫,選擇定位模式后分別以圖6中的A為起始點,途徑B點、實驗樓大廳中央,走到F室的前門后靜止。可看出采用定位模式繪制的圖上位置與實際相符,通過實際測量得到系統(tǒng)相對定位誤差優(yōu)于3 m,能夠滿足個人室內(nèi)定位需求。
基于Android和javaEE平臺設(shè)計并實現(xiàn)RSSI與地磁融合的室內(nèi)定位系統(tǒng)。通過繪制實驗室平面圖,事先利用移動端采集WiFi與地磁數(shù)據(jù)并上傳至服務(wù)器端后建立數(shù)據(jù)匹配指紋庫,通過實時定位過程中移動端采集的人員運動信息上傳服務(wù)器后,與建立的數(shù)據(jù)庫開展粗匹配和精確匹配并獲取最佳位置。設(shè)計并實現(xiàn)系統(tǒng)對移動端與服務(wù)器端模塊后搭建測試環(huán)境,實驗結(jié)果表明系統(tǒng)定位誤差控制在3 m內(nèi),能夠滿足一般室內(nèi)定位精度要求。相對于其他單一室內(nèi)定位技術(shù)而言,該方法融合了室內(nèi)RSSI和地磁數(shù)據(jù)定位方法的優(yōu)勢且操作方便、成本低廉且可靠性高,適用于智能手機的室內(nèi)定位服務(wù)。