iBeaconでフィンガープリンティングな屋内測位
この記事はWHITEPLUS Advent Calendar 2017 6日目になります。
こんにちは。株式会社ホワイトプラス、エンジニアインターンの @ksbababa です。
いまさらですが、簡易的にBLEで屋内測位みたいなことをしてみたのでメモを残しておきます。
(文字ばかりになってしまって申し訳無いです……)
この記事ではBLEビーコンとiOSデバイスを用いて屋内測位を行う方法と簡易的なテスト結果を示します。
また、この検証はWHITEPLUSとは一切関係なく行ったものであることを申し添えておきます。
屋内測位とは
今となっては全く珍しい話では無くなりましたが、GPSの使えない屋内でも位置測位をする技術です。
これによって屋外と同じように目的地案内や人の動いた軌跡の記録などが行えるようになります。
手法
BLEに限らず、屋内測位の手法は数多く提案されています。
BLEビーコンに似たものだと音波を用いたビーコンや既存のWifiルータを用いたものがあります。
また、加速度などを利用してスタート地点からの差分を求めるPDRという手法もあります。
もちろんそれぞれの手法には精度や遮蔽物への強さなど利点不利点がありますので、現実的にはそれぞれを組み合わせて精度を上げるのが一般的です。
iBeacon
今回はBLE、つまりBluetooth LEを用いたビーコンの電波強度を利用した測位を行います。
また、位置推定の手法も三点測位的な方法や、場所ごとに記録した電波強度を基に推定を行うフィンガープリンティグ法がありますが、今回はフィンガープリンティグ法を採用しました。
フィンガープリンティグ法を利用して実際に導入された例としてはコレド室町の歩行者ナビゲーションシステムなどがあります。
検証システム
環境
4[m]x6[m]程度の空間で行いました。空間の中央に6[m]の金属棚があり、2[m]x6[m]の空間2つに区切られています。
BLEビーコン送信側
市販品を利用しました。1個1000円程度で、10m程度電波が飛ぶものです。
今回は8個を等間隔に2x4の形で設置しました。
受信側
iOSアプリで受信と位置推定を行いました。
実装については詳しく書かれている方がたくさんいらっしゃるのでそちらを参照ください。
(初心者向け)Swift3.0で初アプリ - ビーコンを検出してみる
(※swift2で書かれているものは一部関数名や引数名が違うものがあります)
CoreBluetoothを利用してビーコンの受信を行っている記事もありますが、CoreLocationを使用しないとmajor, minor値などiBeacon特有の値が取得できない為ご注意ください。
また、CoreLocationを使用する場合、指定したUUIDのビーコンしか受信できませんのでこの点もご注意ください。
(逆にCoreBluetoothを使えばUUIDの指定無しでRSSIの値は取得できるが、iBeacon以外のBluetoothデバイスの電波強度も取得してしまうので恐らく面倒くさい)
準備
フィンガープリンティグ法の場合、位置推定を行う前に各点でのビーコンの電波強度を記録する必要があります。
今回は仕切りとなっている棚からそれぞれ1m離れた地点において、10cmずつ、合計2x60=120点程度で記録を行いました。
各点10回ずつ測定して、その平均値を推定に使っています。
テスト
計測した120点で10回ずつ位置推定を行ってみました。
位置推定は記録した電波強度と受信した電波強度の距離を愚直に計算して用いました。
はじめはユークリッド距離でやっていましたが、cos類似度でも計算してみました。
120点程度だとリアルタイムで問題なく計算できました。(1秒毎)
結果
平均誤差を示しておきます。
計算方法 | 平均誤差[cm] |
---|---|
ユークリッド距離 | 101 |
コサイン類似度 | 85 |
概ね一般的に言われるように1m程度の誤差になりました。
最後に
最初は受信したビーコンの値のうち、強度が低いものを切り捨てたり、上位数個の値のみを使って推定した方が精度が上がるかと思いましたが、今回テストした限りでは全ての値を用いた方が結果的に誤差は小さくなりました。
また、単純な誤差のみで検証しましたが、これだけ単純にやってもそれなりの値が出てくるので、通常ではあり得ない距離の移動を制限したり、PDRと組み合わせたり、推定に機械学習を用いれば誤差はもっと小さくなるだろうと思います。
何かツッコミやアドバイス、疑問点があればコメントお願いします。
#ホワイトプラスではエンジニアを募集しています
ホワイトプラスでは、新しい技術にどんどん挑戦したい!という技術で事業に貢献したいエンジニアを募集しております。