android 定位蓝牙,Android开发-蓝牙RSSI定位
RSSI(Received Signal Strength Indication)是接收的信號強度指示,用來判定鏈接質量,利用RSSI信號值可以計算主設備和藍牙設備的距離信息。通過至少三個設備的RSSI值即可計算出二維平面內點的相對位置。
轉自lil-Xing的個人博客
RSSI為什么是負值
RSSI的單位是dBm,表示的是藍牙信號的強度,因為無線信號多為mW級別,所以對它進行了極化,轉化為dBm而已,不表示信號是負的,1mW就是0dBm,小于1mW就是負數的dBm數。理想情況下RSSI可以達到最大值0,實際情況下當你將主設備貼著藍牙設備也只能獲取到-50dBm。
獲取RSSI
在上篇藍牙模塊的基礎上,直接在onReceive()方法中通過下面方法獲取RSSI信號強度。注意獲取到的值為負
short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE);
計算主設備與藍牙設備之間的距離
計算公式:d = 10^((abs(RSSI) - A) / (10 * n))
參數含義:
d - 所求距離
RSSI - 信號強度(負值)
A - 發射端和接收端相隔1米時的信號強度
n - 環境衰減因子
因為不同環境下的環境衰減因子不同,所以在每個環境下都要重新計算A和n,先測出發射端和接收端相隔1米時的信號強度A,再隨機取個距離,計算n,需要多次計算取均值。實例如下:
public double getDistance(double Rssi) {
Rssi = (Rssi - 60) / 36.0;
double d= Math.pow(10.0, Rssi);
d = (double) Math.round(d * 100) / 100;
return d;
}
三點定位算法
通過三個藍牙設備的坐標和與主設備的距離計算得到主設備的坐標信息,因為只有三個設備而再增加設備,需要通過最佳匹配得到坐標信息,因此該方法的準確度不高,誤差較大。
指紋法定位算法
指紋法將環境的位置與特定的指紋聯系起來,指紋中存儲一種或多種特征。在實際定位中,通過獲得的多個特征與指紋中的特征匹配,從而獲得適配的指紋的坐標從而定位,在室內定位中,用得最多的特征也就是RSSI定位。指紋定位分為兩個階段:離線階段和在線階段。離線階段將每個位置的坐標記錄并保存該位置的RSSI,收集完所有指紋得到指紋庫。在線階段則通過實際的特征查詢指紋庫獲得定位。當然,實際的特征中不可能剛好和指紋庫中特征相同,這時就需要一定的算法得到最佳適配的指紋,比如KNN最近鄰算法,KNN屬于一種確定型算法,是一種機器學習算法,具體內容后續補充。
Kerman濾波
卡爾曼濾波(Kalman filtering)一種利用線性系統狀態方程,通過系統輸入輸出觀測數據,對系統狀態進行最優估計的算法。由于觀測數據中包括系統中的噪聲和干擾的影響,所以最優估計也可看作是濾波過程。卡爾曼濾波可以有效預測向量的下一次走向,并不斷優化回歸,使預測更精確,即實現“預測+自我調整”。在這里,可以拿來預測室內運動的走向,減少干擾。
總結
以上是生活随笔為你收集整理的android 定位蓝牙,Android开发-蓝牙RSSI定位的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 为什么说用PHP开发大型系统令人不爽
- 下一篇: 环信WebIM 发送图片消息和显示图片