AdSense

2020年1月19日日曜日

3DセンシングデータにBlenderで骨格をいれてUnityで動かした記録

先日の勉強会でStructure Sensorというipadにつけるだけで高精度な3Dモデルを作ることができるスキャナを使い、全身の3Dスキャンデータをもらいました。

Structure Sensor:


短時間で高精度なモデルができたことに驚きです。


これをUnityで動かすことができればVRChatやUnityのいろんなコンテンツで使えるので、骨格(ボーン)を入れることにしました。

ボーンを入れるツールはBlenderを使用します。

やり方は参考書として下記を購入して学びます。



ステップバイステップで大変わかりやすい本でしたが、関節を一つ一つ入れる手順になっているので、もっと簡単な方法を探します。

どうやら自動的に骨格を入れてくれるBlenderのプラグインがある模様。
今回使用したのはUnity公式の「Rigify」です。

Blender Rigifyでググるといろいろ手順が出てくるので手順は割愛しますが、全身だけでなく顔まで骨が入ります。

個別にやったのは、ボーンがもとのモデルからはみ出ないようにモデルの形とサイズ感の調整をしたくらいです。
ただし、撮影時に指を広げていれば指の骨もいい感じで分けれたことを悔やむ。




Blenderでいろいろな形式にエクスポートできますが、Unityで使いやすそうなfbx形式でエクスポート。

次にUnityにとりこみます。



fbsデータをUnity空間に配置し、Standard Assetsを参考に、Third Person Motion Controllerをつけます。

注意すべき点は、下記のパラメータ。これを調整しないと、膝を曲げて中に浮いたままになります。

私の場合は下記値でした。

・Capsule ColliderのCenterのYと、Heightの値

 Center:0 -> 1

    Height:1 -> 2

・Third Person CharacterのGround Check Distance

 0.1 -> 0,2



・Unity Japan Officeに配置して走り回る姿


 

受付する姿

無事動きました。


2019年12月1日日曜日

MAiX BITに自分で学習させたモデルを使うまでの記録

前回折角MAiX BITが動いたので、自分で学習させたくなる。

でも全然AI界隈がわからないので環境構築から。

で、Docker検討したりAnaconda入れたりするが、環境構築がデリケートなことを学ぶ。
一応TensorFlowが動くとこまできたが、どうやらもっとスマートなやり方があるらしい。

で、試したのが、グーグルコラボというクラウド環境。
https://www.tdi.co.jp/miso/google-colaboratory-gpu

速攻で苦労した環境できて愕然とする。

参考にさせて頂いたサイト:
https://www.tdi.co.jp/miso/google-colaboratory-gpu

・実行環境作成
・実行環境のスペック確認
・ライブラリの確認
・TensorFlowの動作確認
・MNISTの確認


ここから、自分でトレーニングする方法を探す。
が、MAiX BITで探すと情報がぜんぜんない。
しかしM5Stick-Vとして探すと、結構出てくる。

どうやら、V-Trainingというのが簡単ぽい。

参考にさせて頂いたサイト:
http://setsubi.no-mania.com/m5stickv/v-training%E3%81%A7m%EF%BC%95stickv%E7%94%A8%E5%AD%A6%E7%BF%92%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E4%BD%9C%E3%81%A3%E3%81%9F%E8%A9%B1

2019年10月21日月曜日

MAiX BITを購入してSampleを動かした記録

勉強会でMAiX BITを見かけて面白そうだったのでAliでポチって動かした記録

ことはじめ

MAiX BITとは、K210というM5Stick-Vと同じKPU(Knowldge Processing UnitというNNアクセラレータ)が乗っている、これだけでTensorFlowの機会学習モデルが動くすごいやつで、カメラとLCD付きで超低価格。
Aliだと3000円を切っていた。
なお、読み方はマックスビットらしい。アイは口にしてはいけない。


面白そうだったので購入してみたが、なかなか動くまで苦労したのでその記録。

Windows環境だったので使い方は下記などを参考にさせて頂いた。
https://qiita.com/tomitomi3/items/d1b675957238f9b7f965

SDKは公式から入手
https://wiki.sipeed.com/en/maix/board/bit.html

FWと学習データ書き込みツールはK-FLASHを使用。

戸惑ったったところは3つ

・1つ目は、SDKのダウンロード。
最新版v0.2.4は、そのフォルダ名ではなく「_」の下にある
http://dl.sipeed.com/MAIX/MaixPy/ide/_/v0.2.4
で、右クリックで保存しても壊れたファイルになるので、ちゃんとクリックして表示された文字列を入力しないとだめ。

・2つ目はUSBドライバ
USBドライバが古いやつはCH340で、新しいやつはCH552だと公式に書かれていた。
私のはどうやらCH552。ぐぐるとCH552がかなり特殊な感じだして戸惑ったが、
結局これ用にドライバを入れることなく、普通にWindowsは認識した。COMポート2つ。
なんで2つかわからないが一方を115200指定で通信できることを確認。

・3つ目はK-FLASH
FWと学習データの書き込みツールだが、初期表示はBaudRateが2000000になっている。
で、これで書き込むと失敗した。115200にすると時間はかかるが書き込みOK
あと、実機の書き込み時は、実機のbootボタンを押しっぱなしにして起動する必要がある。書き込み完了するまで押しっぱなしで書き込みできた。


無事、起動してサンプルプログラムを書き込み、顔認証できた。















丸裸なので、3Dプリンタでケースを出力。データはThingiverseでいい感じのを入手。
http://www.thingiverse.com/





2019年2月3日日曜日

生体センサー(心拍、心電、眼電位)を計測した記録

様々なセンシングデバイスを使って生体データを計測した記録。

●生体データセンサー3つ

・心拍センサー


Arduinoで心拍数が取得できます。
指との接触部分に隙間ができるとノイズがはいるので、
これ以外にも指に巻くためのテープやがあると良いです。
URLの手順通りで簡単に心拍数とれました。
Arduinoのサンプルソースもたくさんあります。
processingと組み合わせると、見た目が良い感じになります。
それもサンプルソースが難なく動きました。
aliexpressだと200円くらい


・心電センサー


心拍センサーと同じようにArduinoで簡単に使えました。
ジェルパッドの分だけ接着が良いのか、
心拍センサーよりはるかにノイズが少なかったです。
接続方法は公式サイトの通りで難なくOK。
こちらもArduinoとProcessingのソースが一緒にGitHubにあり難なく動きました。
サンプルソースでBPMがすぐにわかります。
自律神経を知るためにRRI間隔を取りたかったのですがサンプルソースでは動かず。
aliexpressだと500円くらい

Arduinoと接続

体につける部分はジェルになっています

・眼電位

眼電位から、見ている方向や瞬きを取得し、
加速度とジャイロセンサと組み合わせることで集中度や疲労を推定することができるデバイス。
公式サイトにSDKとサンプルソースが配布されています。
アプリの実行にはIDとPASSが必要で、こちらは開発者サイトのチュートリアル通り、メールアドレスを登録すると使用できます。
 「3.アプリIDとアプリSecretの取得」の部分です。
Android版を動かしたところ、IDの設定だけですんなり動きました。

メガネです。スマホとBTで接続します。
電位は鼻を支える部分からとってるようでした。
メガネメーカー製のため、重さは非常に軽く、
普通のメガネとして日常的に使えそうです。

SDKサンプルアプリのリアルタイムモード
リアルタイムのモニタリングデータが参照できる

SDKサンプルアプリのスタンダードモード
1分間分の集計データが取得できる

考察

・心拍センサ、心電センサともに、動くとノイズが入るので、ノイズ除去のアルゴリズムが必要な見込み
・眼電位は、公式アプリの場合はキャリブレーションするので、複数人で使い回す場合はキャリブレーションが必要と思われます。特に、眼の方向は上下左右の4方向で5段階なので、精度はアプリの向上が必要な見込み。こちらについては論文ありました。


2019年1月27日日曜日

Roomba 980をraspberry piで動かしてみた

Roomba980を手にいてたので、任意の操作を試した記録。

REST APIでスマホ代わりに動かした記事は結構見つかったけども、直接ホイールなどのレベルで制御した記事は見つからず。
500シリーズはシリアルポートを制御した記事が結構あるが、900シリーズはあまりない。

ということで、900シリーズである980を直接制御してみた。

500シリーズはシリアルポートがあり、USBシリアルで制御するが、980はMicroUSBポートがあり、そこをシリアルポートとして使う。

場所はここ。カバーは簡単に外れる。

ここにあるMicroUSBにケーブルを挿す。
初めはWindowsPCで試すが、iRobot Roombaと認識するがCOMポートとは認識せず。
どうやらドライバが必要の模様。しかしドライバを見つけられず。

しばらくググると、Raspberry piならば何もせずともttyACM0として認識するとの記事を発見し、試すと確かにUSB挿すだけでttyACM0として認識する。

ここまでいけば、あとはROIの通りにコマンド送るだけで良いはず。

ROI(500 series)

しかし、なぜか私の環境ではコマンド送っても反応せず。
おもむろに下記のスクリプト流すとすんなり動きました。

ただし、COMポートだけはソース修正必要です。

https://github.com/martinschaef/roomba

この部分
 ROOMBA_PORT = "/dev/tty.usbserial-DA017V6X"
  ↓
 ROOMBA_PORT = "/dev/ttyACM0"

game.pyもstarwards.pyも無事動きました。





下記記事参考にさせていただきました
https://qiita.com/ozwk/items/7ed89479cf4931970edd





2018年5月23日水曜日

家の間取りを図面から3Dモデルに起こしてみた

家の間取りを検討することになり、ハウスメーカーさんが3Dで見せてくれるわけですが、3Dデータをもらえなかったので、自分で3DCGに起こしてみました。

元にしたのは、間取りの設計図面です。

使うツール:

・Sweet Home 3D

無料の間取り作成ツールです。
 SketchUpなどと迷いましたが、私はこれが一番使いやすかったです。

ざっくりしたやり方:

1. Sweet Home 3Dをインストールする
2. 間取り図面を元に床を配置する
3. 壁を配置する
4. ドアと窓をつける
5. 家具をおく

※外部データのインポートもできます

6. 床や壁にテクスチャをはりつける

※テクスチャはGoogle画像検索で取得

1Fの間取り

2Fの間取り

3F(屋根)
外壁も、タイル柄のテクスチャをググって取得して貼り付けました。

3Dビューモードにて、住民視点で内覧できます。

歩き回ることもできます。

家具の寸法も指定して配置できるので、使いたい家具や、引っ越しで持っていって良い家具のサイズを考慮したりと、詳細まで間取りのシミュレーションができた点が一番よかったです。

なお、3Dビューのタブから「OBJ形式でエクスポート」を選択することで、OBJファイルとしてエクスポートできます。

つまり、この3DモデルをUnityに取り込んだり、3Dプリントすることができます。

次回は、外構含めた周囲の環境をUnityで作成し、3Dの家をヘッドマウントディスプレイをつけてVR空間で歩き回りたいと思います。


2018年1月2日火曜日

Nature RemoとGoogle Homeで家電を音声で動かした記録

Nature Remoとスマートスピーカーを繋げて、音声でエアコンなどの家電を制御した。

動かした機器は以下。全部赤外線リモコンの製品。
・エアコン
・テレビ
・HDDレコーダー

テレビ側がhdmiでの電源制御に対応していればgoogle home+chrome castでテレビの電源On/Offはできるそうだが、我が家のテレビは古くて未対応だった。
なので、今回Nature Remoがきたおかげでようやく制御できた。

使ったもの:

・Google Home(Amazon echoでもOK)

 
もちろんgoogle home miniやEcho dotでもOK

・Nature Remo


 Amazonでは3万超えてますが、公式から15000程度で購入。

・赤外線機器(エアコン、テレビ、HDDレコーダー)

既存の家電たち

構築方法と気づいたこと:

・Remoの設定はアプリのガイドに従って特に迷うことなく設定OK。
・スマートスピーカーと連携させるためにIFTTTにていくつかコントロールを追加
  テレビ電源や、レコーダーの電源などをIFTTTで追加。
・google homeの予約語(テレビをON/OFF/つけて/けして)はgoogle home側のサービス(chrome cast制御)に使われるようでIFTTTで登録してもダメだった。
 「テレビをつけて」はNG。「テレビの電源」ならOK。
・Remo経由でエアコンの電源ONすると、タイマー設定が消えた。
 おそらく、リモコンだと電源ON時に毎回タイマー設定を送っていたのが、Remoだとタイマー設定を送っていない。
 なので、タイマーを使いたい場合は、Remoで電源を入れた後に、エアコンのリモコンでタイマー設定をやり直す必要があり面倒くさい。
 Remoのアプリで、位置情報による制御はできるが、現時点(2018/1/2)ではタイマー機能は未対応なので、早急なアプリ対応が望まれる。というか、タイマー設定消えるなら、Remo側でやれないと話にならない。
・テレビやレコーダーの電源制御はリモコンの電源ボタンの置き換えでしかないので、電源ON/OFFの区別はできない。
 つまり、「レコーダーの電源をON」でも「レコーダーの電源をOFF」でも同じ赤外線信号を飛ばすしかない。このため、IFTTTで複数機器制御(「全部けして」「おやすみ」などで、全部の機器をOFFにする)を登録しても、全ての機器の電源がONだったり、OFFだったりとそろってなければ、同時にOFFやONすることはできない。
・テレビの入力切り替えをIFTTTに登録して音声でやってみたが、テレビリモコンのUI的に、何度も入力切り替えを押す必要がある。このため何度も「OK Google、テレビの入力切り替え」を言う必要があり、大変面倒くさい。というか普段使いは非現実的。
 
我が家の家電が古いためかもしれないが、最後の2点あたりが赤外線I/Fの限界と感じた。
ユーザが直接フィードバッグを受けることを前提とした赤外線リモコンではなく、ユーザの遠隔制御を前提とした家電側のインタフェースが整わないとスマート化は難しい気がする。

ただ、連続制御については、IFTTTではなくAction on Google(Dialogflow)などでやると上手い方法あるかも。

後半は辛口レビューみたいになったが、Remoのおかげでかなり未来を感じることができた。
Remoについては、アプリもファームも今後どんどん更新されていくと思うので今後が楽しみだ。