iOS Swift:计算与RSSI的距离

问题描述 投票:1回答:1

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

ios swift ibeacon kalman-filter
1个回答
0
投票

在测距时,每个回调到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中应用基于这些读数的卡尔曼滤波算法来获得filteredRssi。最后,将filteredRssi插入距离算法。在这里看到我的答案:

Understanding ibeacon distancing

© www.soinside.com 2019 - 2024. All rights reserved.