システム見た目/なぜこれが要るのか
本システムは”人の動作のログをプライバシーを考慮しつつ高い情報密度でとることができること”を最終目標として開発している。パフォーマンス改善、効率的な匠の技の伝承/新人教育、製品モニターなどのため、個人のログを取ることができるシステムの開発・利用は望まれているが、通常のカメラの場合はプライバシー・消費電力・設置場所・コストの問題などがあり、その代替による実現が必要となる。これらに考慮したシステムを実現できるコンセプトを提唱する。
最終システムのユースケースは以下の通りである。
- ユーザー自身が机に座って仕事をする際、PCを打っている時間が多いのか、書類書きをしている時間が多いのか、電話対応している時間が多いのか、などを把握し、自身や組織のパフォーマンス改善へとつなげることができる。
- 工場などで仕事をしている際、どのような動線で動いているのか、立ち作業/座り作業の有無/割合、初心者と熟練者との違い、などを可視化し、労働環境の改善、匠の技のデジタルアーカイブ化、新人教育などの人材育成に利用できる。
- 自分の家におけるペットの動きを可視化することができ、ペットのための部屋の環境改善へとつなげることができる。近年、少子高齢化に伴い(高級)ペット市場が急拡大しており、強いニーズとなっている。
- 様々な製品の開発を行う際にモニターが効果的であるが、家庭やオフィスなどの日常における各種製品の使い方(頻度、利用する際の姿勢など)の詳細情報を取得することで、開発者と利用者の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の売りでもある。今後、消費電力測定を行い、どの程度のモバイルバッテリが必要であるか見積もる予定。 | 未 |
デバイス(箱)のサイズは幅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);
}
プログラムでは、ToFセンサ(MM-S50MV改)と加速度センサ(BMI160)を利用して時系列データを得た。それぞれのライブラリを利用している。MM-S50MV改はSPI通信、BMI160はI2C通信を利用した。ToFセンサは実際はアレイ出力(8×4)も可能だが、今回は出てきた値が異常値だったため、1個の値を利用した。
今後の方針(みんなが使ってくれる魅力的なシステムとなるために)
現在は距離1点、3軸の加速度のデータを取得し、シリアル出力している段階である。長い道のりであるが、以下のことを予定している。
- ToFセンサのアレイデータを取得。現在SPI通信では、異常に大きな値が出ている。異常状態確認のための方法(ID比較)も正常であるため、原因が不明である。今後、UART通信を利用し、そのデータに含まれるピクセルごとの有効データチェックを利用して、面分布での距離情報を取得し、動作の解像度を上げる。
- 無線通信化(BLE1507を利用)し、PCやスマホへデータを送信しやすくする。データのログを長期保存したり、ダッシュボードを作成したりする。
- デバイスを天井に設置したり、横の壁に設置したりしてデータを取る。加速度センサにより、設置状況の把握を行う。
- 多くのデータを取得する。人が立っている、座っている、横になっている、不在、などはToFセンサからの情報を用いる。加速度センサからの情報により上から取得したデータなのか、横から取得したデータなのかを判別できる。得られたデータを用いて機械学習モデルを作成し、各種動作の判別を行う。なお、上/横から測定したデータ群ごとに機械学習判別モデルを作成することで、判別精度の向上を狙う。もしかしたら斜めからの測定がよいかもしれない。
- カッコいいデバイス、利用しやすいシステム、役に立つシステム・アプリを構築し、みんなに使ってもらう。
現状、様々な困難があるため、ぜひ興味がある皆様と一緒に開発できればと思います。ここまで読んでいただきありがとうございました。
-
muroyama
さんが
2024/01/31
に
編集
をしました。
(メッセージ: 初版)
-
muroyama
さんが
2024/01/31
に
編集
をしました。
-
muroyama
さんが
2024/01/31
に
編集
をしました。
-
muroyama
さんが
2024/01/31
に
編集
をしました。
-
muroyama
さんが
2024/01/31
に
編集
をしました。
-
muroyama
さんが
2024/01/31
に
編集
をしました。
-
muroyama
さんが
2024/01/31
に
編集
をしました。
ログインしてコメントを投稿する