LoginSignup
0
0

More than 3 years have passed since last update.

【Android】altbeaconでBeaconからの距離(Proximity)を測りたかった話

Posted at

前回 Macから無事Beaconを発射できるようになった。

Beaconの仕様を知らないまま、BeaconからAndroid端末の距離って測れるよね?と軽い気持ちで試してみようとした記録とメモを兼ねて。。。。

結論から言うと

色々調べてみると、どうやら電波強度や建物の干渉などで正確な距離は測れないみたい。

一応 BeaconManager#addRangeNotifier で受け取れるbeaconに生えてるdistance(メートル単位)があるけど
本当にメートル???ってなるくらい誤差がひどかった。

どうやったか

ググラーエンジニアなのでこのQiitaを発見。
RSSI と TxPower からビーコンとの距離および近接度(Proximity)を推定する
この記事によると

RSSI と TxPower から推定距離を計算する

自由空間では受信信号強度は距離の二乗に反比例して減衰していく(フリスの伝達公式)ので、RSSI と TxPower と距離(d)の関係は次のようになります。

RSSI = TxPower - 20 * lg(d)

(lg は底を 10 とする常用対数)

というわけで、距離 d の計算式は以下のようになります。

d = 10 ^ ((TxPower - RSSI) / 20)

なんかすごい物理法則的なアレを加味して計算しないといけないっぽかった。(語彙力)
先人の知恵を頂戴して、Kotlinで便利そうな関数を作る。

Sample.kt
fun beaconDistance(txPower: Int, rssi: Int): Double = 10.0.pow((txPower - rssi) / 20.0)

実際に観測してログに出すだけのコードはこちら

Sample.kt
    override fun onBeaconServiceConnect() {
         ~  ~

        beaconManager?.addRangeNotifier { beacons, region ->
            beacons
               .map {
                   "Distance:"+beaconDistance(it.txPower, it.rssi)
                   // it.distanceもあったけど誤差がやばい(私的見解)
               }
               .forEach { Log.d(TAG, it) }
        }
         ~  ~
    }

測ってみてどうだった?

端末持ってウロウロしてみたけど外の交通量やノイズ?や建物の作りでまあまあ誤差がでるみたい。
beacon.distance 使えないな〜、もうちょっと正確なのがいいな。
くらいの時に目安に使うのならいいかもね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0