はじめに
三菱総研DCSのAI・IoTエンジニアの桃井です。
昨今、テレワークの推進やオフィスのフリーアドレス化に伴い、社員が今どこにいるのかを把握できるソリューションのニーズが高まっています。私たちのチームでは、社員にBLE[1]ビーコンを所持してもらうことで、オフィスのどこにいるのかをリアルタイムで検出するWebアプリの作成を行いました。また、それに加え、AWSを用いたIoTシステムの管理・運用保守に関する検証を実施しました。
その実装方法や使用機器などについて、全2回でご紹介したいと思います。第1回では全体の構成や処理方式、物理デバイス周りの仕様について、第2回ではAWSを用いたバックエンドの処理やシステムの運用について説明します。
[1] BLE:Bluetoothの規格の1つである「Bluetooth Low Energy」の略。低消費電力での通信が可能。
システムの概要
位置測位は一般に、端末から発せられる電波(BLEビーコン、Wi-Fi)や光、磁気などのデータを用いて位置を算出します。中でも電波を使った方式は、スマートフォンやビーコンなど対応デバイスが豊富なことや、Bluetooth5.1やUWB(Ultra Wide Band)対応製品の普及による今後の精度向上の見込みがあることから今回はBLEビーコンを使った手法を採用しました。
システムの構成
全体のシステム構成は図1の通りです。
図1.システム構成図
社員一人一人にはBLEビーコン、あるいは専用アプリを入れたiPhoneを所持してもらいます。加えて、オフィス内にESP32を複数設置し、それらと社員の所持するビーコンとの間の電波強度を収集します。この際、BLEビーコンの場合はビーコンを発信機、ESP32を受信機として、データをゲートウェイデバイスに集約してAWSに送信します。一方、iPhoneの場合はESP32を発信機、iPhoneを受信機として、iPhoneから直接AWSに送信します。AWSに送信されたデータはWebアプリケーションを通して可視化します。
使用機器
次に、使用機器について説明します。
・カード型BLEビーコン MM-BLEBC8
https://www.sanwa.co.jp/product/syohin.asp?code=MM-BLEBC8
社員が所持するビーコンです。電波到達距離や発信インターバルを設定できるものを選びました。特に電波到達距離は強すぎても弱すぎても精度が悪くなるため、設置環境に応じた調整は必須です。
・ATOM Lite
https://www.switch-science.com/catalog/6262/
ESP-32-PICOを内蔵したマイコンです。小型ながらCPUがデュアルコアになっており、マルチタスクでの実行が可能です。今回、オフィス内に設置するマイコンにはBLEの送信・受信の両方の役割を持たせる必要があったため、それぞれ別のコアで実行させました。
・Raspberry Pi 4 Model B
複数のATOM Liteからの通信を集約し、AWSにデータを送信するためのゲートウェイデバイスとして使います。運用の効率化のため、AWS Greengrassを導入しています。(第2回で説明)
フロアへの機器の設置イメージは図2のようになります。
図2.機器の設置イメージ
Webアプリ
作成したWebアプリのイメージは図3のようになります。フロアマップや社員名などの情報を掲載できない都合、実際の画面とは異なります。
ある区画において検出された人数を赤い丸の中の数字で表し、社員の内訳を横に表示しています。
図3.Webアプリのイメージ
位置測位手法
ビーコンを用いた位置測定のための代表的なアルゴリズムとして以下の3つの方式が挙げられます。
①近接性方式
設置されたビーコンのうち、どのビーコンに最も近いかを測定する。大まかな位置の特定には適する。
図4.近接性方式
②三点測量方式
座標を定めた複数個のビーコンを設置し、それらのビーコンとの電波強度を元に三点測量を行う。細かい座標まで求まるが電波状況により精度が左右される。
図5.三点測量方式
③フィンガープリント方式
エリアを複数の区画に分割し、区画ごとにビーコンからの電波強度を事前計測しておく(フィンガープリント)。その中から、測定値と強度特性が最も類似した場所を求めることで座標を得る。導入に際し事前計測の手間がかかる。
図6.フィンガープリント方式
本検証では、近接性方式よりも粒度の高い位置情報を求めたかったことと、受信電波強度のブレが大きく三点測量が難しいことから、フィンガープリント方式を採用しました。
実装における工夫
ESP32では常時BLEの送信と受信を行います。社員の所持するビーコンからの電波を受信し、そのUUIDとRSSI(電波強度)を取得します。そのデータをさらにBLEで送信することで、どのESP32がどのビーコンから、どの程度の強さの電波を受信したのかをゲートウェイデバイスに知らせます。
ATOM Liteはマルチコアのため、送信と受信は別々のコアで実行し、その間のデータの授受はキューを介して行いました。コードの一部を以下に記します。ESP32ではFreeRTOSを使うことでマルチタスクを実装できます。xTaskCreate()でタスクを生成し、第1引数に指定したメソッドを実行させることができます。また、キューインスタンスはxQueueCreate()で生成し、xQueueSend()、xQueueReceive()でそれぞれエンキュー、デキューを行うことができます。
#include "M5Atom.h"
#include "freertos/task.h"
// キューでやり取りするデータ構造を定義
typedef struct {
char uuid[37];
int major;
int minor;
int rssi;
int advertiseTime;
}ble_data;
// BLE受信用のメソッド 処理は一部省略
void receiveBLE() {
while(1) {
ble_data bdata;
// 省略
xQueueSend(xQueue,&bdata,0); // キューに格納
}
vTaskDelete(NULL);
}
// BLE送信用のメソッド 処理は一部省略
void sendBLE() {
BaseType_t xStatus;
const TickType_t xTicksToWait=500U;
ble_data bdata;
while(1) {
xStatus = xQueueReceive(xQueue, &bdata, xTicksToWait); // キューからデータ取り出し
if (xStatus == pdPASS){ // 取り出せたら
// 省略
}
}
vTaskDelete(NULL);
}
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
// キューの作成
// 格納する要素数とバイトサイズを引数で指定
xQueue=xQueueCreate(20,sizeof(ble_data));
// タスクの作成
// 実行するメソッドを第1引数で指定
xTaskCreate(receiveBLE,"receiveBLE",8192, NULL, 1, (TaskHandle_t *) NULL);
xTaskCreate(sendBLE,"sendBLE",8192, NULL, 1, (TaskHandle_t *) NULL);
}
void loop() {
// 各スレッドで実行するメソッド内でループさせているため、このループ内は記述不要
}
iPhoneアプリを用いた検証
市販のBLEビーコンを用いる場合、当然導入コストがかかってしまいます。BLE通信はスマートフォンでも可能なため、私物や会社貸与の機器が使えるのであれば、それで代用することでコストの削減になります。今回はiPhone専用アプリを作成し、ビーコンの場合と同様の動作が可能かを検証しました。アプリの仕様は、ビーコンの場合と同様にESP32とのRSSIを取得し、そのデータを収集するものになります。
検証の結果、アプリをバックグラウンドで実行した場合、IOSの制約によりデータの計測が一定時間で中断されてしまいました(図7)。ただし、これはRSSIを取得する処理を行う場合に限り、単純にビーコンへの近接判定を行う処理であればバックグラウンドでも動作し続けることが分かりました。そのため、近接性方式による測位を行うのであればiPhoneの利用は可能であると考えられます。
図7.iPhoneでの稼働時間
まとめ
今回は位置測位のシステムの概要とシステム構成、物理デバイスの仕様を紹介しました。次回はバックエンドとなるAWS側を中心に説明します。
※SORACOM は、株式会社ソラコムの登録商標または商標です。