目次
ビーコンの受信強度(RSSI)に誤差がでる理由に対する僕なりの仮説
ビーコンは受信機で受信したときの「受信強度(rssi)」で距離の推定ができるけど、誤差が大きいという話はよく聞きます。
でも「なぜ、誤差がでるのか?」がピンときてませんでした。
そんなとき、たまたま、仕事でビーコンを扱っている友人から、機器の動作確認の時に蓄積した「室内に固定で置いたビーコンの受信データ」をわけてもらうことができたので、これをPandasで解析しながら、自分なりの仮設を考える・・という試みです。
データの確認
CSVデータを読み込んで内容を確認してみます。
データは約2万件ほどありました。
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
tran = pd.read_csv("C:/xxxxxxxxxx/data/beacon/xxxxxxxxx.csv")
tran.head()
実際には、この左側にビーコンのアドレスと受信機IDがあります。
時系列に「受信強度(rssi)」が記録されたデータであることが確認できました。
2時間の範囲で切りとると3つの山ができていた
ビーコンは5m四方の部屋の隅に固定でおかれ、中心のテーブルの上に受信器がおかれた状態で計測されたデータです。
もちろん、部屋には人の出入りが普通にあります。
そんなデータを2時間分きりとってグラフにしてみます。
とはいえ、固定されたビーコンと受信機・・ですから、ある程度の強度のあたりに山ができているグラフを予測していました。
たとえば、こんな感じ。
しかし、実際に同一ビーコン・同一受信機でフィルターして、受信強度(rssi)でグルーピングして適当な項目でカウントしてみると。
tran[filter].groupby(["n_rssi"]).count()"n_battery_level".plot()
こんなグラフになりました。
あれあれ・・山が3つあります。
僕なりの仮説(1)右側が直線距離の電波強度
単位を書いてないのでわかりづらいですが、上記グラフは右が受信強度が強く(-70)、左が弱く(-100)なってます。
三つの山の頂点は右から「-75」「--86」「-94」らへんになってます。
この受信強度の数字の意味合いは、別記事で書いてます。
上記記事の受信強度の計算式にあてはめてみましたが、固定ビーコンと受信機の直線距離で計算すると、だいた「-73から-79」あたりになるはずだという結果になりました。
つまり、今回のグラフでいえば右側(強い方)の山のあたりが「直線距離」・・つまり、距離測定で得たい結果に近い・・を反映していると考えることができます。
じゃあ、残りの2つの山は何なのか?です。
僕なりの仮説(2)残りの2つの山は反射した電波
僕の仮説としては「反射で距離が長くなって到達した電波の受信強度」です。
ビーコンは360度全方位にただ「発信」します。
それが部屋の中に置かれているとしたら、まっすぐ届く電波もあれば、壁・天井・床などに反射して遠回りして届く電波も当然あります。
それらが2つめ、3つめの山ができる原因になっていると考えられます。
イメージを図にするとこんな感じですね。
ビーコン電波の反射が誤差の原因の1つではありそうです
上記仮説があっているとすると・・。
ビーコンを使って「距離測定」とか「エリア内への入退出の把握」なんかをやろうとしたとき、ピンポイントでサンプリングした少数の受信強度(rssi)だけで判断しようとすると、大きく誤差がでるのは当然だと思えます。
だって・・。
今、ここに届いている電波が直線距離できたものか、長い距離を反射しながら来たものかなんて絶対にわからないですから。
その精度をあげるには、ある程度の時間帯の中で集めた「受信強度の集団」の中から、「直線距離に近い形で到着した電波」を識別する方法を考えるしかない気がします。
じゃあ、どうやって識別するか?なんですが。
その集団の一番受信強度の高いグループが「直線的距離」を示している・・と考えたら、なんとなく統計的に判断できんじゃないかな・・とか思うのですけど、こっから先は仕事でかかわることになったら考えよう(笑)と思います。
とりあえず、誤差がでやすい原因についての僕なりの仮説という目的は達したので。
ではでは。