編集履歴一覧に戻る
muroyamaのアイコン画像

muroyama が 2024年01月31日11時52分30秒 に編集

コメント無し

本文の変更

システム見た目/なぜこれが要るのか - 本システムは”人の動作のログをプライバシーを考慮しつつ高い情報密度でとることができること”を最終目標として開発している。パフォーマンス改善、効率的な匠の技の伝承/新人教育、製品モニターなどのため、個人のログを取ることができるシステムの開発・利用は望まれているが、通常のカメラの場合はプライバシー・消費電力・設置場所・コストの問題などがあり、その代替による実現が必要となる。これらに考慮したシステムを実現できるコンセプトを提唱する。 ![プライバシー対応ToFモーショントラッキングデバイス](https://camo.elchika.com/1f18835ba5d1222a93efc6bb6aae0083511381d2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63613335303531312d323635632d343431332d613836372d3563393437313137363161362f37376239383938642d646539662d343335622d386234352d346331303632353935653065/) 最終システムのユースケースは以下の通りである。 1. ユーザー自身が机に座って仕事をする際、PCを打っている時間が多いのか、書類書きをしている時間が多いのか、電話対応している時間が多いのか、などを把握し、自身や組織のパフォーマンス改善へとつなげることができる。 2. 工場などで仕事をしている際、どのような動線で動いているのか、立ち作業/座り作業の有無/割合、初心者と熟練者との違い、などを可視化し、労働環境の改善、匠の技のデジタルアーカイブ化、新人教育などの人材育成に利用できる。 3. 自分の家におけるペットの動きを可視化することができ、ペットのための部屋の環境改善へとつなげることができる。近年、少子高齢化に伴い(高級)ペット市場が急拡大しており、強いニーズとなっている。 4. 様々な製品の開発を行う際にモニターが効果的であるが、家庭やオフィスなどの日常における各種製品の使い方(頻度、利用する際の姿勢など)の詳細情報を取得することで、開発者と利用者のWIN-WINの新製品開発へとつなげることができる。たとえば、ソファーでは端に座る割合が多い、机では一時的に書類を積み上げる人が多い、などのこれまで自己申告制アンケートなどでは得られなかった実態を把握でき、そのための新しい製品開発方針が得られる可能性がある。 回路図 - ![回路図](https://camo.elchika.com/7ee5def95c1179c649555d7e308e9590274db654/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63613335303531312d323635632d343431332d613836372d3563393437313137363161362f31663136353563392d613263652d346130382d626166622d653465326162323435386237/) 基本的に主な部品はボックスに入っています。図が切れている場合は、ポチッと押してもらうと全体が見えます。 部品リスト(使っているものも、これから必要になるものも) - | 部品名 | 内容・目的 | 利用の有無 | |:---:|:---|:---:| | 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の売りでもある。今後、消費電力測定を行い、どの程度のモバイルバッテリが必要であるか見積もる予定。 | 未 |

いくつかデバイスの写真を載せます。 ![Spresense本体上にToFセンサインタフェース、IMU、BLEモジュールをスタック](https://camo.elchika.com/6bb2f15ec3eca9b45f6dc06b146b85ffe4d70a2a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63613335303531312d323635632d343431332d613836372d3563393437313137363161362f63616431626363302d373539312d346566312d623830342d306664633165366363303533/) ![ToFセンサモジュール](https://camo.elchika.com/d3580973b29da6c4d52501ef982d8bd2a2d1d9c9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63613335303531312d323635632d343431332d613836372d3563393437313137363161362f33616565393531622d373363342d343438332d383662342d666334613032623431363763/) ![プライバシー対応ToFモーショントラッキングデバイスの中身](https://camo.elchika.com/f783e794fce4bd5a29787cf57a9c3cf3a9da38c8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63613335303531312d323635632d343431332d613836372d3563393437313137363161362f62306436643932662d396338622d343266662d626631362d333832663234333766393334/) デバイス(箱)のサイズは幅70mm×奥行40mm×高さ30mm程度。電子部品が入っていた箱を利用し、穴あけ加工して使っています。カメラ三脚に設置(マウント)できる形状にしている。 ソースコード(道半ば、これから多くのアップデートを予定) - ```arduino: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軸加速度の時系列データ)](https://camo.elchika.com/585fbff530fa1e4f6550bd4f4c350f2830549ec0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f63613335303531312d323635632d343431332d613836372d3563393437313137363161362f32386365373863342d643431322d346437662d393233302d356133656432643162353263/) プログラムでは、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. カッコいいデバイス、利用しやすいシステムを構築し、みんなに使ってもらう。 現状、様々な困難があるため、ぜひ興味がある皆様と一緒に開発できればと思います。ここまで読んでいただきありがとうございました。