iOS Swift:计算与 RSSI 的距离

Posted

技术标签:

【中文标题】iOS Swift:计算与 RSSI 的距离【英文标题】:iOS Swift: Calculate distance from RSSI 【发布时间】:2017-12-19 09:13:46 【问题描述】:

iBeacon 测距过程(可从 CoreLocation 获得)不能提供 iPhone 与 iBeacon 的平稳运行距离,而是提供了太多的波动值。我也尝试使用加权平均值,但它没有给出预期的结果。我遇到了link,它解释了使用卡尔曼滤波器去除信号中的噪声。我还遇到了一个实现了过滤器的swift framework。我的问题是如何应用卡尔曼滤波器逻辑来获得与 iBeacon 的平滑距离?我目前正在使用下面的代码来计算距离,但我不知道如何对其应用卡尔曼滤波器。

func calculateNewDistance(txCalibratedPower: Int, rssi: Int) -> Double
        if rssi == 0
            return -1
        
        let ratio = Double(exactly:rssi)!/Double(txCalibratedPower)
        if ratio < 1.0
            return pow(10.0, ratio)
        else
            let accuracy = 0.89976 * pow(ratio, 7.7095) + 0.111
            return accuracy
        

    

这里 txCalibratedPower 被传递为 -74

【问题讨论】:

【参考方案1】:

测距时,对didRangeBeacons的每个回调都包含一个[Beacon]对象数组,每个元素都有一个rssi参数beacon.rssi。

您需要创建一个字典或其他一些数据结构来存储每个信标的最新 rssi 读数。为方便起见,我经常使用基于信标标识符的字典键:

var recentRssiDict: [String:[Double]] = [:]

...

// inside didRangeBeacons
let dictKey = "\(beacon.uuid) \(beacon.major) \(beacon.minor)"
var recentRssis = recentRssiDict[dictKey] && []
recentRssis.append(beacon.rssi)
recentRssiDict[dictKey] = recentRssis
// TODO: delete old elements depending on how many you want to track

然后,您可以根据最近RSSI 中的这些读数应用卡尔曼滤波器算法来获得过滤后的Rssi。最后,将过滤后的 Rssi 插入距离算法。在这里查看我的答案:

Understanding ibeacon distancing

【讨论】:

以上是关于iOS Swift:计算与 RSSI 的距离的主要内容,如果未能解决你的问题,请参考以下文章

从 iBeacon RSSI 信号中获取位置

Android Developer -- Bluetooth篇 开发实例之六 蓝牙RSSI计算距离

React Native、IBECONS、RSSI 值到距离的转换

在android中使用Wifi计算位置和距离

基于RSSI定位算法的matlab仿真

计算我的位置和 Swift 上的 MapKit 引脚之间的距离