顧青濤,孫書良
(1.北京衛(wèi)星導(dǎo)航中心,北京100094; 2.衛(wèi)星導(dǎo)航系統(tǒng)與裝備技術(shù)國(guó)家重點(diǎn)實(shí)驗(yàn)室,河北 石家莊 050081)
根據(jù)近幾年的統(tǒng)計(jì),人們的生活時(shí)間有80%~90%處于室內(nèi)環(huán)境中,包括在商場(chǎng)、機(jī)場(chǎng)、圖書館和大學(xué)校園等場(chǎng)所[1],同時(shí)70%的移動(dòng)電話和80%的蜂窩數(shù)據(jù)傳輸來自于室內(nèi)[2],這些引起了人們對(duì)基于位置服務(wù)與位置感知的室內(nèi)定位的濃厚興趣,例如對(duì)建設(shè)中的建筑物進(jìn)行導(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)定位方法得以實(shí)施,但WiFi信號(hào)多徑效應(yīng)又限制了其單一方法的定位精度[5];地磁匹配技術(shù)作為定位方法已有多年發(fā)展歷史[6],但室內(nèi)磁場(chǎng)環(huán)境受建筑特點(diǎn)及環(huán)境因素影響,出現(xiàn)磁場(chǎng)分布異常現(xiàn)象[7],單一地磁無法達(dá)到室內(nèi)人員定位的精度需求[8]。
圍繞上述單一定位方式局限性,本文將RSSI與地磁匹配方法融合,利用移動(dòng)端固有的WiFi模塊與地磁傳感器模塊開展室內(nèi)組合定位算法的設(shè)計(jì)與測(cè)試。提出將平面位置坐標(biāo)、最近與次最近RSSI、WiFi數(shù)據(jù)和地磁數(shù)據(jù)組成聯(lián)合指紋,分別基于Android平臺(tái)和javaEE開發(fā)移動(dòng)端并搭建服務(wù)器[9],服務(wù)器端接收移動(dòng)端提供的最近和次最近的RSSI后與數(shù)據(jù)庫(kù)信息進(jìn)行粗匹配,利用求解得到的地磁數(shù)據(jù)hausdorff距離開展精匹配并向移動(dòng)端提供室內(nèi)位置信息[10]。
通過采集WiFi信號(hào)和地磁數(shù)據(jù),篩選最強(qiáng)與次最強(qiáng)RSSI并結(jié)合室內(nèi)平面坐標(biāo)組成聯(lián)合指紋,通過Android平臺(tái)和javaEE開發(fā)平臺(tái)搭建移動(dòng)端和服務(wù)器端[11]。
由圖1所示的系統(tǒng)框架可看出,室內(nèi)定位系統(tǒng)由移動(dòng)端和服務(wù)器端構(gòu)成,移動(dòng)端包括交互層、業(yè)務(wù)邏輯層和控制層[12],交互層為用戶提供操作界面并顯示室內(nèi)平面地圖及定位位置,業(yè)務(wù)邏輯層負(fù)責(zé)處理平面坐標(biāo)數(shù)據(jù),控制層完成與服務(wù)器的數(shù)據(jù)通信;服務(wù)器端包括控制層、業(yè)務(wù)邏輯層和數(shù)據(jù)庫(kù)層,數(shù)據(jù)庫(kù)層保存采集的數(shù)據(jù),業(yè)務(wù)邏輯層負(fù)責(zé)處理RSSI與地磁數(shù)據(jù)匹配解算等業(yè)務(wù)邏輯,控制層負(fù)責(zé)完成與移動(dòng)端的數(shù)據(jù)通信。
圖1 系統(tǒng)框架
1.1.1交互層
自定義MapImageView:基于安卓開發(fā)平臺(tái),繼承ImageView控件,自定義加載圖片控件MapImageView,該控件重寫屏幕觸摸事件onTouch并添加手勢(shì)探測(cè)器GestureDetector,處理圖片移動(dòng)和縮放,方便用戶采集數(shù)據(jù)時(shí)精確選擇圖上位置點(diǎn)。通過畫布Canvas的drawBitmap函數(shù),在圖中繪制標(biāo)志點(diǎn),為自定義控件MapImageView添加addPoint函數(shù)與drawPosition函數(shù),用于繪制圖上關(guān)鍵點(diǎn)和定位位置。
UI界面實(shí)現(xiàn):通過主界面布局文件添加豎向的LinearLayout線性布局,該布局中添加MapImageView和包含功能按鈕的2個(gè)橫向LinearLayout線性布局組成主界面UI[13]。在主界面MainActivity中注冊(cè)功能按鈕點(diǎn)擊監(jiān)聽器OnClickListener,用于響應(yīng)功能按鈕的點(diǎn)擊事件,處理用戶的操作。
1.1.2業(yè)務(wù)邏輯層
為組成匹配需要的聯(lián)合指紋庫(kù),移動(dòng)端業(yè)務(wù)邏輯層處理采集路徑的關(guān)鍵點(diǎn)、周期性采集的地磁數(shù)據(jù)、WiFi數(shù)據(jù)并分別保存到List集合中。用戶通過點(diǎn)擊下一段功能按鈕,依據(jù)采集數(shù)據(jù)量,通過平均分配平面坐標(biāo)位置x、y,結(jié)合每組的WiFi與地磁數(shù)據(jù)組成聯(lián)合指紋,利用谷歌的Gson插件將聯(lián)合指紋轉(zhuǎn)換成json數(shù)據(jù)傳遞到控制層[14]。定位模式下獲取控制層從服務(wù)器得到的坐標(biāo)數(shù)據(jù),根據(jù)當(dāng)前圖像的縮放比例得到圖上距離,傳遞到交互層。
1.1.3控制層
利用http協(xié)議,移動(dòng)端控制層將采集的數(shù)據(jù)傳輸?shù)椒?wù)器,系統(tǒng)處于定位模式時(shí),將采集的數(shù)據(jù)傳遞給服務(wù)器后獲取最佳匹配位置并傳遞給業(yè)務(wù)邏輯層。本文提出采用okHttp框架,利用okHttpClient的newCall方法傳遞Request參數(shù),Request參數(shù)中包含封裝采集數(shù)據(jù)的RequestBody與服務(wù)器接口信息,并在Callback回調(diào)函數(shù)中處理服務(wù)器返回?cái)?shù)據(jù)。
利用Spring、SpringMVC和Mabatis框架(SSM框架)搭建服務(wù)器開發(fā)環(huán)境。
1.2.1控制層
利用注解@Controller添加控制器IndoorController,利用注解@RequestMapping為控制器IndoorController添加saveindoorData、getPosition兩個(gè)請(qǐng)求映射。通過服務(wù)器端控制層接收移動(dòng)端的服務(wù)請(qǐng)求后,利用請(qǐng)求映射參數(shù)HttpServerletRequest獲取數(shù)據(jù)并傳遞到業(yè)務(wù)邏輯層,利用HttpServerletRespose將業(yè)務(wù)邏輯層的處理結(jié)果返回到移動(dòng)端。
1.2.2業(yè)務(wù)邏輯層
通過接收控制層saveindoorData請(qǐng)求映射中的數(shù)據(jù),利用數(shù)據(jù)庫(kù)層的Dao對(duì)象將采集的聯(lián)合指紋保存到數(shù)據(jù)庫(kù)。定位模式時(shí),接收getPosition請(qǐng)求映射的數(shù)據(jù),利用請(qǐng)求數(shù)據(jù)中的最近BSSID、次最近BSSID篩選數(shù)據(jù)庫(kù)數(shù)據(jù),解算篩選后的地磁數(shù)據(jù)的hausdorff距離進(jìn)行精匹配獲取坐標(biāo)數(shù)據(jù)并返回。
1.2.3數(shù)據(jù)庫(kù)層
依據(jù)SQL語句[15],實(shí)現(xiàn)通過最近與次最近BSSID、模糊查詢等操作函數(shù)對(duì)保存在mysql數(shù)據(jù)庫(kù)的聯(lián)合指紋進(jìn)行查詢并反饋結(jié)果。
為獲取聯(lián)合指紋庫(kù)中的最近與次最近RSSI和WiFi數(shù)據(jù),利用Android系統(tǒng)固有的WiFi模塊采集WiFi信號(hào),基于WiFi信號(hào)強(qiáng)度與傳輸距離成正比的特性,提出利用WiFi信號(hào)強(qiáng)度對(duì)采集的WiFi數(shù)據(jù)進(jìn)行排序。以走廊兩側(cè)WiFi信號(hào)為采集目標(biāo),開啟安卓系統(tǒng)WiFi信號(hào)接收服務(wù),采集WiFi信號(hào)、篩選WiFi的AP地址BSSID、網(wǎng)絡(luò)名稱SSID、信號(hào)強(qiáng)度level過程如下:
① 通過getSystemService(Context.WIFI_ SERVICE)獲取定位管理器WiFiManager,調(diào)用WiFiManager的setWiFiEnabled(true)方法開啟WiFi;
② 利用WiFiManager的startScan()方法掃描WiFi信號(hào);
③ 調(diào)用WiFiManager的getScanResults()方法得到掃描結(jié)果List
④ 通過ScanResult變量得到AP的BSSID、SSID和level的值,結(jié)合平面坐標(biāo)并保存為:
X坐標(biāo):Xn;Y坐標(biāo):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手機(jī)終端固有的地磁傳感器在不同時(shí)刻條件下采集室內(nèi)地磁數(shù)據(jù)如圖2所示。
圖2 地磁場(chǎng)信息比對(duì)
圖2(a)是2次采集數(shù)據(jù)的三維分布;圖2(b)、圖2(c)和圖2(d)分別是x、y、z軸的地磁數(shù)據(jù)分布特征比對(duì),通過分析地磁數(shù)據(jù)特征分布可看出,不同時(shí)刻的地磁場(chǎng)分布特征穩(wěn)定不變,保證利用地磁數(shù)據(jù)進(jìn)行室內(nèi)定位方法的可行性?;贏ndroid平臺(tái)獲取地磁數(shù)據(jù)的過程如下:
① 調(diào)用getSystemService(Context.SENSOR_ SERVICE)方法獲取傳感器管理器SensorManeger,SensorManeger管理安卓平臺(tái)傳感器的操作;
② 調(diào)用SensorManeger的getDefaltSensor(Sensor.TYPE_MAGNETIC_FIELD)獲取地磁傳感器;
③ 調(diào)用SensorManeger的registerListener()方法注冊(cè)地磁數(shù)據(jù)監(jiān)聽器SensorEventLitener,地磁數(shù)據(jù)變化時(shí),系統(tǒng)回調(diào)SensorEventLitener的onSensorChanged()函數(shù);
④ 在onSensorChanged(SensorEvent event)函數(shù)中event的values變量中獲取地磁數(shù)據(jù)。
為避免數(shù)據(jù)采集過程中因手機(jī)搖擺引起的誤差,設(shè)計(jì)將手機(jī)坐標(biāo)系下獲取的地磁數(shù)據(jù)轉(zhuǎn)換到導(dǎo)航坐標(biāo)系。其中,手機(jī)坐標(biāo)系定義為x軸水平指向右、y軸垂直向上、z軸是指向屏幕正面向外[16],如圖3所示。
圖3 手機(jī)坐標(biāo)系
SensorManeger提供getRotationMatrix()方法用于獲取設(shè)備旋轉(zhuǎn)矩陣,通過式(1)完成地磁數(shù)據(jù)到導(dǎo)航坐標(biāo)系的轉(zhuǎn)換。
(1)
式中,magx、magy、magz分別為手機(jī)端采集的三軸地磁數(shù)據(jù);magx′magy′magz′為地磁數(shù)據(jù)在導(dǎo)航坐標(biāo)系的表現(xiàn)形式;R為手機(jī)坐標(biāo)系相對(duì)導(dǎo)航坐標(biāo)系的旋轉(zhuǎn)矩陣。getRotationMatrix()定義的導(dǎo)航坐標(biāo)系如圖4所示[17]。
圖4 導(dǎo)航坐標(biāo)系
圖4中,x軸切向地面設(shè)備當(dāng)前位置指向東、y軸切向地面設(shè)備當(dāng)前位置指向磁北極、z軸垂直當(dāng)?shù)厮矫娌⒅赶蛱臁?/p>
通過分析多種地磁匹配技術(shù)的優(yōu)缺點(diǎn)與適用性[18],確定以Hausdorff距離為度量的地磁數(shù)據(jù)匹配方法,該方法不僅考慮2個(gè)目標(biāo)之間的距離關(guān)系還涉及目標(biāo)之間的形狀差異[19]。針對(duì)Hausdorff距離用于測(cè)量2個(gè)點(diǎn)集的匹配程度并且不強(qiáng)調(diào)配對(duì)點(diǎn),具有很強(qiáng)的抗干擾能力和容錯(cuò)能力。本文提出在建立地磁數(shù)據(jù)庫(kù)時(shí)以每3 s保存一次地磁數(shù)據(jù)并組成點(diǎn)集M,在實(shí)際定位過程中每3 s采集一次地磁數(shù)據(jù)組成點(diǎn)集N(如式(2))。通過計(jì)算點(diǎn)集M、N的Hausdorff距離,以距離越小匹配程度越高為判斷依據(jù)。
(2)
M、N兩個(gè)點(diǎn)集的Hausdorff距離計(jì)算過程為:
H(M,N)=max(h(M,N),h(N,M)),
(3)
(4)
(5)
式中,‖·‖是定義在集合M和N的范數(shù),以兩點(diǎn)間幾何最短距離為判定準(zhǔn)則得到地磁數(shù)據(jù)范數(shù)計(jì)算公式:
(6)
點(diǎn)集M和N之間的Hausdorff距離為M點(diǎn)集所有點(diǎn)到N點(diǎn)集所有點(diǎn)最小距離的最大值maxM與N點(diǎn)集所有點(diǎn)到M點(diǎn)集所有點(diǎn)最小距離的最大值maxN中的最大值,即
H(M,N)=max(maxM,maxN)。
(7)
基于RSSI與地磁定位原理的特征[20],設(shè)計(jì)以當(dāng)前位置所有WiFi數(shù)據(jù)地址BSSID、信號(hào)強(qiáng)度level、網(wǎng)絡(luò)名稱SSID、最近BSSID、次最近BSSID、當(dāng)前位置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)處于定位模式時(shí)的移動(dòng)端向服務(wù)器請(qǐng)求匹配服務(wù),服務(wù)器首先根據(jù)采集的最近和次最近BSSID與篩選數(shù)據(jù)庫(kù)數(shù)據(jù)進(jìn)行粗匹配;其次,以Hausdorff距離為度量對(duì)地磁數(shù)據(jù)進(jìn)行精匹配并得到最佳匹配點(diǎn)坐標(biāo)x、y后返回給移動(dòng)端,完成對(duì)移動(dòng)端用戶位置信息請(qǐng)求的答復(fù)。
基于RSSI與地磁融合定位原理,搭建移動(dòng)端和服務(wù)器端開發(fā)環(huán)境,根據(jù)系統(tǒng)需求設(shè)計(jì)的移動(dòng)端UI界面主要由一個(gè)圖片控件ImageView和功能按鈕組成(路徑、開始、下一段、停止、定位、清除、下一個(gè)點(diǎn))。為驗(yàn)證系統(tǒng)穩(wěn)定性與精度,本文搭建了實(shí)驗(yàn)樓測(cè)試環(huán)境,通過量邊繪制室內(nèi)實(shí)驗(yàn)建筑平面圖并獲取平面位置坐標(biāo),如圖5所示。
圖5 室內(nèi)平面圖
實(shí)驗(yàn)測(cè)試過程如下:
① 拖動(dòng)MapImageView控件加載的室內(nèi)平面圖,以位于MapImageView中央位置不變的小旗子為標(biāo)志點(diǎn),通過拖動(dòng)平面圖并選取小旗對(duì)應(yīng)的位置點(diǎn)為采集路徑的關(guān)鍵點(diǎn)。基于Canvas的drawLine、drawBitmap函數(shù)繪制實(shí)驗(yàn)數(shù)據(jù)采集路線A—B—C—D—C—B—A和關(guān)鍵點(diǎn),如圖6所示。
圖6 選擇路徑
② 手機(jī)平放胸前,在實(shí)驗(yàn)軌跡起始點(diǎn)A處點(diǎn)擊開始按鈕采集數(shù)據(jù),依照計(jì)劃路線勻速行走,到達(dá)B點(diǎn)時(shí)點(diǎn)擊下一段,開始下一段數(shù)據(jù)的采集,依次采集每一路線段,最終返回A點(diǎn)結(jié)束采集。
③ 點(diǎn)擊定位按鈕開啟定位模式,移動(dòng)端控制層將采集的實(shí)時(shí)數(shù)據(jù)傳遞到服務(wù)器端進(jìn)行匹配并獲取待匹配位置點(diǎn)的坐標(biāo)x、y,利用Canvas的drawBitmap函數(shù)繪制到當(dāng)前平面圖上。
圖7 實(shí)驗(yàn)效果
如圖7所示,通過采集實(shí)驗(yàn)樓數(shù)據(jù)搭建指紋庫(kù),選擇定位模式后分別以圖6中的A為起始點(diǎn),途徑B點(diǎn)、實(shí)驗(yàn)樓大廳中央,走到F室的前門后靜止??煽闯霾捎枚ㄎ荒J嚼L制的圖上位置與實(shí)際相符,通過實(shí)際測(cè)量得到系統(tǒng)相對(duì)定位誤差優(yōu)于3 m,能夠滿足個(gè)人室內(nèi)定位需求。
基于Android和javaEE平臺(tái)設(shè)計(jì)并實(shí)現(xiàn)RSSI與地磁融合的室內(nèi)定位系統(tǒng)。通過繪制實(shí)驗(yàn)室平面圖,事先利用移動(dòng)端采集WiFi與地磁數(shù)據(jù)并上傳至服務(wù)器端后建立數(shù)據(jù)匹配指紋庫(kù),通過實(shí)時(shí)定位過程中移動(dòng)端采集的人員運(yùn)動(dòng)信息上傳服務(wù)器后,與建立的數(shù)據(jù)庫(kù)開展粗匹配和精確匹配并獲取最佳位置。設(shè)計(jì)并實(shí)現(xiàn)系統(tǒng)對(duì)移動(dòng)端與服務(wù)器端模塊后搭建測(cè)試環(huán)境,實(shí)驗(yàn)結(jié)果表明系統(tǒng)定位誤差控制在3 m內(nèi),能夠滿足一般室內(nèi)定位精度要求。相對(duì)于其他單一室內(nèi)定位技術(shù)而言,該方法融合了室內(nèi)RSSI和地磁數(shù)據(jù)定位方法的優(yōu)勢(shì)且操作方便、成本低廉且可靠性高,適用于智能手機(jī)的室內(nèi)定位服務(wù)。