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,Bluetooth,Java)