muroyamaのアイコン画像
muroyama 2024年01月31日作成 (2024年01月31日更新)
製作品 製作品 閲覧数 219
muroyama 2024年01月31日作成 (2024年01月31日更新) 製作品 製作品 閲覧数 219

プライバシー対応ToFモーショントラッキングシステム

システム見た目/なぜこれが要るのか

本システムは”人の動作のログをプライバシーを考慮しつつ高い情報密度でとることができること”を最終目標として開発している。パフォーマンス改善、効率的な匠の技の伝承/新人教育、製品モニターなどのため、個人のログを取ることができるシステムの開発・利用は望まれているが、通常のカメラの場合はプライバシー・消費電力・設置場所・コストの問題などがあり、その代替による実現が必要となる。これらに考慮したシステムを実現できるコンセプトを提唱する。
プライバシー対応ToFモーショントラッキングデバイス
最終システムのユースケースは以下の通りである。

  1. ユーザー自身が机に座って仕事をする際、PCを打っている時間が多いのか、書類書きをしている時間が多いのか、電話対応している時間が多いのか、などを把握し、自身や組織のパフォーマンス改善へとつなげることができる。
  2. 工場などで仕事をしている際、どのような動線で動いているのか、立ち作業/座り作業の有無/割合、初心者と熟練者との違い、などを可視化し、労働環境の改善、匠の技のデジタルアーカイブ化、新人教育などの人材育成に利用できる。
  3. 自分の家におけるペットの動きを可視化することができ、ペットのための部屋の環境改善へとつなげることができる。近年、少子高齢化に伴い(高級)ペット市場が急拡大しており、強いニーズとなっている。
  4. 様々な製品の開発を行う際にモニターが効果的であるが、家庭やオフィスなどの日常における各種製品の使い方(頻度、利用する際の姿勢など)の詳細情報を取得することで、開発者と利用者のWIN-WINの新製品開発へとつなげることができる。たとえば、ソファーでは端に座る割合が多い、机では一時的に書類を積み上げる人が多い、などのこれまで自己申告制アンケートなどでは得られなかった実態を把握でき、そのための新しい製品開発方針が得られる可能性がある。

回路図

回路図
基本的に主な部品はボックスに入っています。図が切れている場合は、ポチッと押してもらうと全体が見えます。

部品リスト(使っているものも、これから必要になるものも)

部品名 内容・目的 利用の有無
Spresenseメインボード コア部品であり、各種センサ制御、データ処理などを行う。 利用
BMI160 3軸加速度センサ。設置の際のToFカメラの姿勢の検出に利用。上からの測定なのか、横からの測定なのかを判別する。I2Cにより通信。ジャイロも搭載しているが、ジャイロは未使用。 利用
MM-S50MV改 ToF(Time of Flight)センサであり、高精度な面分布での3D距離測定と高速サンプリングが可能。8×4=32ポイントの測定が可能だが、今回は1ポイントの測定のみ利用。 利用
BLE1507 メインボードに接続し、Bluetooth Low Energyの無線通信によりセンサデータもしくは判断結果(機械学習の結果)を送信。これにより利用の柔軟性を上げることができる。
BMI270+AK09918 加速度・ジャイロ・コンパスの9軸IMU(Inertial Measurement Unit)。すべてのセンサデータを活用すれば、センサデバイスを固定せず移動させて利用しても、正しい動作のロギングができる可能性がある。開発中。
マイクロUSBケーブル Spresense本体と接続するケーブル。PCに接続し開発を行ったり、給電を行ったりすることができる。100均のものを利用。 利用
USB延長ケーブル 天井にセンサデバイスを設置する場合など、長いケーブルが必要となる。100均のものを利用。 利用
モバイルバッテリ 近くに電源がない場合で、比較的短時間の利用の場合は、モバイルバッテリを利用することで利用性が上がる。低消費電力かつ小型な点はSpresenseの売りでもある。今後、消費電力測定を行い、どの程度のモバイルバッテリが必要であるか見積もる予定。

いくつかデバイスの写真を載せます。
Spresense本体上にToFセンサインタフェース、IMU、BLEモジュールをスタック

ToFセンサモジュール

プライバシー対応ToFモーショントラッキングデバイスの中身
デバイス(箱)のサイズは幅70mm×奥行40mm×高さ30mm程度。電子部品が入っていた箱を利用し、穴あけ加工して使っています。カメラ三脚に設置(マウント)できる形状にしている。

ソースコード(道半ば、これから多くのアップデートを予定)

Spresense+1D_ToFセンサ+3軸加速度センサのデータ取得

#include "MM-S50MV.h" // MM-S50MV: ToF sensor #include <BMI160Gen.h> // BMI160: IMU // BMI160 const int select_pin = 10; const int i2c_addr = 0x68; // I2C address int ax_raw, ay_raw, az_raw; // raw accelerometer values float ax, ay, az; // calculated accelerometer values const int coeff = 16384; // gravity coefficient for +-2g range, = 2^14 void setup() { // Serial.begin(9600); Serial.begin(115200); // BMI160 init //BMI160.begin(BMI160GenClass::SPI_MODE, select_pin); BMI160.begin(BMI160GenClass::I2C_MODE, i2c_addr); // MM-S50MV init MMS50MV.begin(); MMS50MV.skip(256); delay(500); MMS50MV.set(MMS50MV_CMD_MODE, MMS50MV_MODE_SYNC); // sync mode. delay(500); MMS50MV.skip(256); MMS50MV.sync(); // sync. MMS50MV.set(MMS50MV_CMD_MODE, MMS50MV_MODE_NOMAL); // normal mode. delay(500); // MMS50MV.set(MMS50MV_RATE_LOW, 0x20); // 32frames/s mode MMS50MV.set(MMS50MV_RATE_LOW, 0x10); // 8frames/s mode delay(500); // MMS50MV.set(MMS50MV_CMD_DISTANCE, MMS50MV_DIST_SHORT); // short distance mode MMS50MV.set(MMS50MV_CMD_DISTANCE, MMS50MV_DIST_LONG); // long distance mode delay(500); MMS50MV.skip(256); } void loop() { // read raw IMU measurements from device //BMI160.readGyro(gx, gy, gz); BMI160.readAccelerometer(ax_raw, ay_raw, az_raw); ax = float(ax_raw) / coeff; ay = float(ay_raw) / coeff; az = float(az_raw) / coeff; // display tab-separated gyro x/y/z values /* Serial.print("g:\t"); Serial.print(gx); Serial.print("\t"); Serial.print(gy); Serial.print("\t"); Serial.print(gz); Serial.println(); Serial.print("a:\t"); Serial.print(ax_raw); Serial.print("\t"); Serial.print(ay_raw); Serial.print("\t"); Serial.print(az_raw); Serial.println(); */ Serial.print("acc[g]: "); Serial.print(ax, 3); Serial.print(", "); Serial.print(ay, 3); Serial.print(", "); Serial.print(az, 3); Serial.println(); // MM-S50MV // 1d distance measurement printf("1d dist[mm]: %d\n",MMS50MV.get1d()); // 3d distance array measurement under development /* static int32_t data[8][4]; int32_t* ptr = (int32_t*)data; MMS50MV.get3d(ptr); for(int j=0;j<8;j++){ for(int i=0;i<4;i++){ printf("array[%d][%d]=%d\n",j,i,data[j][i]); } } */ // usleep(10*1000); delay(1000); }

シリアル出力の例(1D距離+3軸加速度の時系列データ)
プログラムでは、ToFセンサ(MM-S50MV改)と加速度センサ(BMI160)を利用して時系列データを得た。それぞれのライブラリを利用している。MM-S50MV改はSPI通信、BMI160はI2C通信を利用した。ToFセンサは実際はアレイ出力(8×4)も可能だが、今回は出てきた値が異常値だったため、1個の値を利用した。

今後の方針(みんなが使ってくれる魅力的なシステムとなるために)

現在は距離1点、3軸の加速度のデータを取得し、シリアル出力している段階である。長い道のりであるが、以下のことを予定している。

  1. ToFセンサのアレイデータを取得。現在SPI通信では、異常に大きな値が出ている。異常状態確認のための方法(ID比較)も正常であるため、原因が不明である。今後、UART通信を利用し、そのデータに含まれるピクセルごとの有効データチェックを利用して、面分布での距離情報を取得し、動作の解像度を上げる。
  2. 無線通信化(BLE1507を利用)し、PCやスマホへデータを送信しやすくする。データのログを長期保存したり、ダッシュボードを作成したりする。
  3. デバイスを天井に設置したり、横の壁に設置したりしてデータを取る。加速度センサにより、設置状況の把握を行う。
  4. 多くのデータを取得する。人が立っている、座っている、横になっている、不在、などはToFセンサからの情報を用いる。加速度センサからの情報により上から取得したデータなのか、横から取得したデータなのかを判別できる。得られたデータを用いて機械学習モデルを作成し、各種動作の判別を行う。なお、上/横から測定したデータ群ごとに機械学習判別モデルを作成することで、判別精度の向上を狙う。もしかしたら斜めからの測定がよいかもしれない。
  5. カッコいいデバイス、利用しやすいシステム、役に立つシステム・アプリを構築し、みんなに使ってもらう。

現状、様々な困難があるため、ぜひ興味がある皆様と一緒に開発できればと思います。ここまで読んでいただきありがとうございました。

ログインしてコメントを投稿する