2015년 2월 10일 화요일

Beacon의 이해



비이컨 기술의 가장 기본적인 사용법은 모바일 디바이스에서 비이컨까지의 거리를 측정하는 것이다. 하지만 비이컨으로 거리를 측정하는걸 해 본 사람들은 누구나 알고 있는 것처럼 거리 추정은 상당히 오차가 크다. 5미터 떨어진 비이컨의 경우 추정 거리는 2미터에서 10미터까지 왔다갔다 한다. 

이렇게 추정 거리가 변하는 이유와 이런 오차를 줄이기 위한 방법은 비이컨에 관해 가장 흔한 질문이다. 추정에 영향을 미치는 요인은 전파 신호의 난반사, 장애물, 휴대폰과 비이컨의 방향등 매우 다양하다. 

하지만 거리 추정에 무었보다 가장 큰 요인은 전파 노이즈이다. 백그라운드 전파 노이즈는 어디에건 존재한다. 강한 전파(즉, SNR이 큰)의 경우 약한전파보다 노이즈는 별로 문제가 되지 않는다. 이런 이유 때문에 비이컨에서 10미터 이상 떨어진 경우보다는 가까운 거리에서는 좀 더 정확한 거리 추정이 가능하다. 

Apple의 권장사항




애플이 iOS7에서 iBeacon 기술을 소개했을 때, 애플의 문서는 거리 추정치를 직접 사용하지 않는걸 권장했다. 비이컨 범위 정보를 제공하는 CLBeacon 클래스는 비이컨과의 거리 추정치를 미터 단위로 제공하는 필드를 가지고 있다. 하지만 이 속성을 distance라고 부르는 대신 애플은 accuracy라고 이름붙였다. 권장하는 사용법은 이 값을 여러 비이컨들 중에 어느것이 가장 가까운가 비교하는 용도로만 사용하는 것이다. 또한 CLBeacon 클래스는 proximity라는 속성을 제공해 거리 추정치를 “immediate”, “near”, “far”로 그룹핑 한다. 이 각 그룹의 정의는 명확하지 않지만, 실험 결과 0.5미터 이내의 거리는 “immediate”, 0.5~3m 정도는 “near”, 그 이상은 “far”로 구분한다고 볼 수 있다.



이런 내용이 비이컨을 사용해 직접적으로 거리를 측정할 수 없다는걸 의미하지는 않는다. 단지 비이컨의 동작 원리와 결과값의 품질에 어떤 한계가 있는지를 먼저 이해할 필요가 있다는걸 의미한다.

Reference Transmitter Power


비이컨 전송은 transmitter power 필드를 포함하고 있어 특정 거리에서 신호 세기가 얼마의 세기가 되어야 하는가를 나타낸다. 예를들어 iBeacon 기술을 사용할 때, 표준 측정값은 비이컨에서 1미터 떨어진 곳에서 iPhone 5S(iOS7이 발표되었을 때 최신 모델)이 측정한 것이다. 비이컨은 표준거리에서 신호레벨(RSSI)을 측정한 후 비이컨이 표준값을 송신하도록 calibrate되어야만 한다.  RSSI 값은 dBm 단위를 사용하고 1미터 거리에서 calibrate 된 비이컨의 통상 RSSI 값은 -59 dBm이다. 각 송신기와 안테나는 서로 다른 세기의 전파를 송신하기 때문에 여러 비이컨의 실제 calibration 값은 서로 다르다. Radius Network의 RadBeacon같은 일부 제품은 출력파워를 조정할 수 있다.

How distance estimates work


모바일 디바이스는 비이컨의 신호레벨을 레퍼런스 신호레벨과 비교함으로서 비이컨과의 거리를 추정할 수 있다. 비이컨이 adv한 패킷이 수신될 때 마다 블루투스 칩은 비이컨의 신호레벨 측정값을 RSSI로 제공한다. 각 비이컨 전송은 위에서 언급한 calibration 값을 포함하고 있기 때문에, 실제 시그널 레벨을 1머터에서 기대되는 시그널 레벨과 비교해서 거리를 추정할 수 있다. 예를들어 비이컨 adv 패킷이 -65 dBm 시그널 레벨로 수신되었고 송신기의 출력 calibration값은 -59 dBm이라고 해 보자. -65 dBm은 -59dBm보다 약한 신호레벨이므로, 즉 비이컨은 1미터보다 먼 거리에 있을 가능성이 크다는걸 의미한다.

거리를 추정하기 위해 이 두 숫자를 공식에 집어넣을 수 있다. 아래 공식은 Android Beacon Library에 사용한 것이다. 공식의 3개의 상수(0.89976, 7.7095, 0.111)는 여러 정해진 거리에서 넥서스4를 사용해 측정한 신호 세기에 기반해 best fit으로 계산한 값이다. 


protected static double calculateDistance(int txPower, double rssi) {
  if (rssi == 0) {
    return -1.0; // if we cannot determine distance, return -1.
  }

  double ratio = rssi*1.0/txPower;
  if (ratio < 1.0) {
    return Math.pow(ratio,10);
  }
  else {
    double accuracy =  (0.89976)*Math.pow(ratio,7.7095) + 0.111;    
    return accuracy;
  }
} 


위의 예제의 경우 txPower에 -65를, rssi에 -59를 넣으면 거리 추정치는 2미터가 된다.

Filtering for noise


신호 노이즈때문에 RSSI 측정치만으로 거리를 추정하는것은 좋은 생각이 아니다. 비이컨 패캣의 RSSI 측정값을 보면 신호 레벨은 여러 곳에서 갑자기 점프하는걸 볼 수 있다. 이 노이즈를 제거하는 가장 간단한 방법은 RSSI 측정치의 running average를 사용해서 노이즈를 부드럽게 변하도록 해 주는 것이다. 또한 데이터 셋에서 이상하게 높거나, 이상하게 낮은 값은 제외해 버리는것도 일반적이다. Android Beacon Library에서 사용한 알고리즘은 20초 샘플링 구간 측정치의 상위 및 하위 10%를 버리고 나머지를 평균한다. 

이 방법의 장점은 거리 추정이 좀 더 정확하고 안정적이라는 것이다. 단점은 모바일 디바이스가 움직이면 거리 추정치가 움직인 위치를 정확히 따라잡는데 20초의 시간이 걸린다는 것이다.

20초 샘플링 구간은 iOS에서 사용하는 방법과 유사하다. 아래 그래프는 아이폰4S가 비이컨에서부터 0.5미터 거리에서 3미터로 빠르게 이동했을 때 (빨간선)  CLBeacon 클래스의 accuracy 필드가 어떻게 변하는가를 보여준다. 그래프에서 볼 수 있는것처럼 디바이스가 이동한 후 거리 추정치(파란선)이 안정화되는데 약 20초가 걸린다.


Device Variations


아이폰 4S, 5, 5S, 6 모델들의 블루투스 회로, 안테나, 케이스 디자인은 큰 변동이 없기 때문에 비이컨 거리 추정은 대부분의 iOS 디바이스에서 일관되게 동작한다. 하지만 항상 그런것은 아니다. 아이팟 터치에서의 거리 추정치는 블루투스 신호 수신 감도를 높이기 위해 안테나를 다른 식으로 배치했기 때문에 일반적으로 좀 더 가깝게  추정된다.

디바이스간의 variation은 안드로이드에서 훨씬 더 큰 문제이다. 각 안드로이드 모델은 완전히 다른 블루투스 칩셋, 안테나, 케이스 디자인을 가질 수 있기 때문이다. 이 모든 요인이 신호 수신 레벨에 영향을 미치므로 거리 추정치에도 영향을 미치게 된다. 넥서스4, 넥서스5와 갤럭시S4 모델은 비이컨과 같은 거리에서 상당히 크게 다른 신호 레벨로 받는다. 이런 이유때문에 Radius Networks는 다양한 안드로이드 디바이스에 대해 거리 공식 DB를 구축하기 시작했다.

Setting Expectations


비이컨에서의 거리를 추정하는게 가능하지만 이 측정치는 말 그대로 ‘추정’치라는걸 잊으면 안된다. 디비아스가 비이컨에서 더 멀어질수록, 이 추정치는 점점 더 정확하지 않게 된다. 비이컨에서 20미터 떨어진 디바이스는 거리 추정치에 +-10미터의 오차를 가지게 된다. 폰이 주머니에 들어있는가 여부, 어느 방향으로 놓여있는가, 간판 뒤쪽에 있는가, 또는 많은 사람들 무리에 막혀있는가등에 따라 비이컨과의 거리 추정치는 크게 영향을 받게 된다. 

그러므로 어떤걸 할 수 없는가를 인식하는게 중요하다.

  • 비이컨이 1미터 떨어져 있는지 아니면 10미터 떨어져 있는지는 쉽게 말할 수 있어도, 10미터 떨어져 있는지 아니면 20미터 떨어져 있는지는 말할 수 있을거라고 기대하면 안된다.
  • 노이즈를 제거하기 위해 running average를 사용하기 때문에 사용자가 움직이면 움직임을 거의 리얼타임으로 추정할 수 있을거라고 생각하면 안된다.
  • 비이컨이 있는 방향을 결정할 수 있을거라고 생각하면 안된다. 비이컨은 보통 전방향 송신기이기 때문에 거리를 추정할 수는 있어도 방향은 추정할 수 없다.
  • 비이컨과의 거리를 추정할 수 있다는것이 모바일 디바이스가 방 안에 정확히 어느 위치에 있는지 결정할 수 없다는걸 이해해야 한다. 비이컨이 실내 위치 시스템에서 구성요소로 사용될 수는 있어도 비이컨 거리 추정만으로는 문제를 해결할 수 없다.
  • 몇개의 비이컨으로 삼각측량법을 사용해 간단한 실내 위치 시스템을 만들수 있을거라고 기대하면 안된다. 거리 추정의 정확도는 거리가 멀어질수록 나뻐지기 때문에 실내에서 위치를 알기 위해 삼각측량을 사용하는건 정확한 위치 추정을 할 수 없다.

하지만 비이컨 거리 추정으로 할 수 있는 유용한 어플리케이션도 많다. 예를 들자면

  • 비이컨이 매우 가까워(5미터 이내)질 때 어떤 동작을 시작
  • 수미터 이내에 있어 신호를 수신할 수 있는 여러 비이컨들중에 어느것이 가장 가까운가를 결정하기 
  • 특정 위치를 찾는 사용자에게 거리 피드백을 제공 (예: 보물찾기)

Best Practices


최대한 정확한 거리 추정치를 얻기 위해서 Radius Networks는 다음의 내용을 권장한다.

  • 비이컨에서 가능한 최대 출력의 송신 레벨을 사용한다. 강한 시그널 레벨은 높은 SNR을 의미하기 때문에 좀 더 정확한 거리 추정이 가능하다.
  • 비이컨의 송신 빈도를 최대한 높여준다. 모바일 디바이스에 advertising 패킷이 더 많이 수신될수록, 노이즈를 제거하기 위해 평균해야 하는 샘플이 많아진다. 
  • 가능한 Radius Networks의 RadBeacon USB같이 외부에서 전원을 공급받는 비이컨을 사용한다. 그래야 배터리 수명을 걱정할 필요 없이 가장 고출력과 빠른 송신 빈도로 패킷을 advertising 할 수 있다.
  • 비이컨을 제대로 보정한다.
  • 명확하게 시야에 들어오는 장소에 비이컨을 설치한다. 사람들이 붐비는 장소라면 바닥보다는 높은 곳에 설치하는게 더 좋다.
  • 특정 안드로이드 모델을 위한 앱을 계획하거나 설치하려고 하면 거리 추정 공식이 해당 모델에 최적화 되어 있는가 확인해야 한다. Radius Networks의 Android Beacon Library는 다양한 안드로이드 모델을 위해 확장 가능한 거리 추정 공식 DB를 제공한다. 

원문은 http://developer.radiusnetworks.com/2014/12/04/fundamentals-of-beacon-ranging.html








댓글 8개:

  1. 아두이노로 비콘을 만들어서 안드로이드 앱과 연동해서 거리측정해보려는데 가능할까요?

    답글삭제
    답글
    1. 라즈베리가 더 쉬우실꺼예요.

      삭제
  2. 라즈베리파이로 비콘의 신호세기를 측정하려고 하는데 c언어 기반으로 짜볼려고 하는데 가능할까요??

    답글삭제
    답글
    1. 불가능하지는 않아도 쉽지는 않습니다. 이 링크를 참고하세요. http://people.csail.mit.edu/albert/bluez-intro/index.html

      삭제
  3. 시중에서 파는 일반적인 완제품 상태의 비콘을 사용하지 않고 라즈베리파이를 비콘 디바이스로 이용하는 이유가 무엇인가요??

    답글삭제
    답글
    1. 라즈베리파이를 비콘으로 쓰는게 아니라 비콘 스케너로 사용합니다.

      삭제
  4. c#을 이용해서 비콘정보를 받아오고 싶은데 방법이있을까요 ?

    답글삭제