2017-12-19 2 views
1

iBeacon 범위 지정 프로세스 (CoreLocation에서 제공됨)는 iBeacon에서 iPhone의 원활한 이동 거리를 제공하지 않고 너무 큰 변동 값을 제공합니다. 나 또한 가중 평균을 사용하려고했지만 원하는 결과를 얻지 못했습니다. 나는 신호로부터 잡음을 제거하기 위해 Kalman Filter의 사용법을 설명한 link을 보았습니다. 나는 또한 필터를 구현 한 swift framework을 발견했다. 내 질문은 칼만 필터 로직을 적용하여 iBeacon으로부터 원활한 거리를 얻는 방법이다. 나는 현재 아래의 코드를 사용하여 거리를 계산하고 있지만 칼만 필터를 적용하는 방법을 알지 못합니다.iOS Swift : RSSI로부터의 거리 계산

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 레인 징 때 didRangeBeacons 각 콜백 [비콘] 오브젝트의 배열을 포함하고, 각 요소는 RSSI 파라미터 beacon.rssi을 갖는다 -74

답변

0

로 전달되고있다.

각 비콘에 대한 최신 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 

당신은 다음 filteredRssi를 얻을 수 recentRSSIs 이러한 수치를 기반으로 칼만 필터 알고리즘을 적용 할 수 있습니다. 마지막으로 filteredRssi를 거리 알고리즘에 연결합니다. 내 대답보기 :

Understanding ibeacon distancing