Node.js로 iBeacon의 거리를 추정하다

이 글은 mohikanz Advent Calendar 2018째 날이다.
이번에는 제가 현재 대학에서 연구하고 있는 iBeacon을 이용해서 거리 추측을 하고 자신의 지식을 정리하며 잘 쓰고 싶습니다.

iBeacon


아이비콘은 애플이 개발한 BLE(Bluetooth Low Energy)를 활용한 커서 사양 중 하나다.iOS 7 표준으로 탑재돼 아이폰에서 사용할 수 있어 BLE 서비스로 보급되는 기수로 기대되는 커서 규격이다.

거리 추정 매개변수


거리는 TxPower, RSSI를 사용하는 것으로 추정됩니다.

TxPower


는 신호가 dBm 단위로 전송되는 신호 강도를 나타냅니다.iBeacon은 거리 1m의 수신 신호 강도를 이용한다.

RSSI


Received Signal Strength Indication의 약칭은 수신된 전파의 강도를 나타냅니다.단위도 dBm입니다.

거리 추정 계산


거리의 계산은 자유 공간에서 신호를 수신하는 강도와 거리의 제곱이 반비례감소(연잎의 전송 공식)와 같은 전파의 관계를 이용한다.
1m 지점의 수신 신호 출력 $p1[mW]$, r[m]지점에서 수신 신호 출력 $pr[mW]달러를 가정하면 프리스의 전달 공식보다 $p1$、$p_관계는 다음과 같습니다.
$$ p_r =\frac{p_1}{r^2} [mW] $$
RSSI 및 TxPower를 사용하기 위해 단위를 dBm으로 조정합니다.RSSI와 TxPower는 각각 다음과 같이 나타낼 수 있습니다.
$$ RSSI = 10log_{10} p_r$$
$$ TxPower = 10log_{10} p_1$$
위의 공식을 요약하면 RSSI, TxPower, 거리r의 관계는 다음과 같습니다.
$$ RSSI = TxPower - 20 log_{10}r [dBm]$$
이 공식이 변형된 후 거리 r는 RSSI와 TxPower로 다음과 같이 표시할 수 있다.
$$r = 10^{(TxPower - RSSI)/20} [m]$$
상술한 식은 시종 이상적인 공간에서 이루어지는데 실제로는 장애물 유무 등에 따라 전파의 수신 강도가 달라질 수 있다.
이 문제를 고려하려면 거리와 관련된 부분을 변수로 설정하십시오.아무튼 20부분을 10*n으로 바꾸면 됩니다.
이때 n의 뜻은 다음과 같다.
  • n=2.0: 무장애 이상공간
  • n<2.0: 전파가 반사되면서 전파되는 공간
  • n>2.0: 장애물에 흡수되고 쇠퇴하는 동시에 전파되는 공간
  • 나는 개인적으로 n=1.8가 가장 안정적이라고 생각한다.

    Node.js로 실현해 보다


    실제로 이러한 관계 노드를 활용합니다.js로 커서의 전파를 수신하고 커서와 수신기의 거리를 계산하는 스크립트를 써 보십시오.
    이번에는 수신기로 사용RaspberryPi3 ModelB.랩베리피가 아니더라도 BLE 기능을 탑재한 터미널이라면 무엇이든 된다.Node.js의 버전은 9.2.1입니다.
    node-bleacon로 신호를 받습니다.
    지금(2018/12),bleacon은 Node입니다.js 9.x.x에서만 동작합니다. 주의하십시오.
    일단 받아보세요.코드는 다음과 같습니다.
    beacon.js
    const Bleacon = require('bleacon');
    
    //Start Beacon Scanning
    Bleacon.startScanning();
    Bleacon.on("discover", function(bleacon) {
       console.log(bleacon);
    });
    
    이 코드를 실행하면 다음과 같은 내용이 표시됩니다.
    또한 코드를 실행할 때sudo로 실행해야 한다는 것을 주의하십시오.
    { uuid: '81fb2f79e3014973aa78057588a084f0',
      major: 15,
      minor: 23,
      measuredPower: -86,
      rssi: -46,
      accuracy: 0.17663747648877268,
      proximity: 'immediate' }
    { uuid: '81fb2f79e3014973aa78057588a084f0',
      major: 15,
      minor: 23,
      measuredPower: -86,
      rssi: -44,
      accuracy: 0.16197089955104235,
      proximity: 'immediate' }
    { uuid: '81fb2f79e3014973aa78057588a084f0',
      major: 15,
      minor: 23,
      measuredPower: -86,
      rssi: -46,
      accuracy: 0.17663747648877268,
      proximity: 'immediate' }
    
    ...
    
    되돌아오는 대상을 보면 rssi와measuredPower(txPower)가 저장되어 있음을 알 수 있습니다.그럼 이제 이걸로 거리를 계산해 봅시다.
    코드는 다음과 같습니다.
    beacon.js
    const Bleacon = require('bleacon');
    //Start Beacon Scanning
    Bleacon.startScanning();
    Bleacon.on("discover", function(bleacon) {
      const rssi = bleacon.rssi;
      const txPower = bleacon.measuredPower;
    //Distance Calc
      const r = 10**((txPower-rssi)/20);
      console.log(`distance: ${r}[m]`);
    });
    
    
    간단하네.첫 번째 스크립트에만 거리 계산이 추가되었습니다.
    그럼 한번 실험해 봅시다!이번에는 운영 환경의 RasPi에 커서를 추가했습니다.

    이 상태에서 코드를 실행하면 다음과 같은 결과를 얻을 수 있다.
    distance: 0.007943282347242814[m]
    distance: 0.01[m]
    distance: 0.007943282347242814[m]
    distance: 0.008912509381337459[m]
    distance: 0.01[m]
    distance: 0.01[m]
    distance: 0.001995262314968879[m]
    distance: 0.007943282347242814[m]
    distance: 0.01[m]
    distance: 0.001995262314968879[m]
    distance: 0.007943282347242814[m]
    distance: 0.01[m]
    distance: 0.008912509381337459[m]
    distance: 0.008912509381337459[m]
    distance: 0.01[m]
    distance: 0.01[m]
    distance: 0.01[m]
    distance: 0.01[m]
    
    ...
    
    결과적으로 거리를 계산한 것 같다.잘 됐다!

    끝말


    이번에 우리는ibeacon의 위치 추측의 촉각, 신호와 수신기의 거리 추측에 대해 글을 썼다.
    이후 여러 개의 수신기와 커서의 거리 관계를 이용하여 세 가지 측정의 요점에 따라 위치를 추측한다.
    다만, 수신 전파가 매우 불안정하기 때문에 계속 이러면 정밀도가 떨어진다.
    내가 대학에서 연구한 것은 바로 그 문제를 해결할 방법을 생각하는 것이다.
    내일 12일은 @hiroki-chi씨의 안드로이드 P2P는 Nearby로 할게요.입니다.

    참고 자료


    다섯 줄밖에 없어!가장 간단한 iBeacon 전파를 수신하는 방법
    RSSI 및 TxPower에서 커서로 거리 및 근접도 추정

    좋은 웹페이지 즐겨찾기