なんでこんなことを思いついたんでしょう。
最近、ZEDステレオカメラのソフトをかじっていて、画像の遠近をポイントクラウドで表現する参考プログラムを見ていたからなんです。
ZEDステレオカメラのサンプルアプリ。右側がポイントクラウド。カメラからの距離が3Dで確認できる。
温度分布をポイントクラウドで表現すれば、平面的な色で表現するよりぐっと認識しやすくなります。つまり一目で温度差が確認できるんじゃないか。ムフフフ。方針さえ決まれば、ワクワクの時間です。ZEDステレオカメラは、あくまでも詳細な距離測定が目玉ですから、コンピュータが表現しなくとも人間は物体の遠近を認識できるので、3Dにする意味をあまり感じませんが、これがLEPTONサーモカメラで測定した温度となるとどうか。
こうなります。Z軸方向が測定した温度に対応しています。一応キーボード入力で、カラーマップの選択、ワイヤーフレームの有無、ポイント自体の大きさ変更が可能。サーモカメラで取り込んだデータの動きはどうでしょうか?。ポイントクラウドの操作はサクサクです。
今回はESP32をLEPTONサーモカメラ(画像上部赤い袴をはいたPIカメラみたいなやつ)データ送信専用として使い、後ろのiMacでデータを受信。OpenFrameworksで加工して表示させました。
メガネ部分は温度が低くなるので。目の部分がえぐれてます。キモチ悪り〜
数年前Kinectで再現していたポイントクラウドとは別の意味で結構衝撃なのですが。私だけかな。
当然ながら温度の高いところは山が高くなるわけで。うちのワンコを写してみたら目が飛び出てしまいました。それを見た本人(本犬)がキャンキャン騒ぐので掲載中止。
この画像を見て、ESP32が鍵を握ってるなんて信じられます?。(複雑な処理は全てiMacですけど。)取得した画像の温度差がそのまま高低差で表現されます。
実行させるには動画のフレームレートと解像度をできるだけ上げることが必須。
元々は、WROOM02に表示機器をダイレクトに取り付けても、画像表示は実用レベルじゃないんじゃないか?という仮定のもと、LEPTONで読み取ったサーモグラフィー画像をWIFIとOSCを組み合わせて、iMacやiPhoneに表示させてしまおうという発想でした。色々な条件が一致して、なんとかサーモグラフィーになりましたが、画像の荒さはしょうがないとして、スピードがいまいち。WROOM02の能力以外にも、私のソフト作成能力にも問題があるような....。
そこで、今回は巷で噂の WROOM02の2倍は早いんじゃないかというESP32を使って、とりあえず今の私の実力でどんだけ早く画像が再現できるかも追求。
大まかな処理の流れは、
- LEPTON赤外線カメラから、SPIの垂れ流し信号をESP32で読み取る。
- 80x60の14bitグレースケール画像を256色すなわち8bitグレースケールに変更。ついでにセンサー温度、最高最低温度を摂氏に変換。
- 80個のグレースケールデータを1行ずつStringにして60回に分けてOSC送信。
- ついでに読み取った温度もOSC送信。ここまではESP32で実行。
- MAC側OSCでデータを受け取り、グレースケールデータ60x80から317x237 に補間-->カラー化-->VBOで3D変換。
- VBO表示は自由に拡大縮小、回転できるが触ってるうちに場所がわからなくなるので、念のため読み取り画像の小さな表示もつけて....。
って感じです。今回はiPhoneでの画像再現ではなく、作成の簡単なiMacで動かしてみます。テストなのでOSC通信は、一方通行ESP32-->iMac だけにしました。
ESP32側
以前WROOM02を使ったLEPTONの赤外線画像送信を試みました。今回は以前のカクカクスピードを改善する目的でESP32を採用。WROOM02のOSC送信プログラムがそのまま使えれば苦労しないのですが、そんな訳ありませんよね。
LEPTON+ESP32でのOSC通信を実現するには、以下の過程が必要です。
ESP32の入手
技適付き。ESP8266環境向上委員会 辻直弘さん情報 送料込み3,000円前後。7日で届きました。
色々情報がありますが、iMac上で以下のコマンドを入力するだけ。
mkdir -p ~/Documents/Arduino/hardware/espressif && \ cd ~/Documents/Arduino/hardware/espressif && \ git clone https://github.com/espressif/arduino-esp32.git esp32 && \ cd esp32/tools/ && \ python get.py
参考:MacでESP32のLチカ(Arduino IDE版) - Qiita
- ESP8266 OSC 通信ライブラリダウンロード及び修正
OSCライブラリは以下から、お礼を言いながらダウンロード。ARDUINOのliblalyフォルダに入れる。ESP32の場合、このままではエラーになるので、以下の2点を修正。(やはりすんなり実行できない)
- OSCData.h 94行目以下のようにコメントを入れる。
#endif
//OSCData (int32_t);
#ifndef ESP8266
OSCData (int);
oscData.c
- OSCData.c 30行付近 6行についてコメントを入れるか、消す。
/*
OSCData::OSCData(int32_t i){
error = OSC_OK;
type = 'i';
bytes = 4;
data.i = i;
}
*/
- SPI他
SPIは 以前のWROOM02専用の特殊ライブラリではなく、ESP32 ARDUINO IDEの標準ライブラリを使用。以前とコマンド内容が違うので、やはりLEPTONから出力される信号の同期を取るのが、最大の難関でしたが、いつもの様にトライアンドゴー。コンパイルを100回以上繰り返してやっと繋げることができました。結果は、WIFIで信号を流している割には速度が良好。スピード的に理想に近いRaspberry PI環境でのLEPTON再生動画と、あまり変わらないものになりました。LEPTONの画像データはせいぜい9FPS程度とのこと(トランジスタ技術12月号)前回WROOM02+iPhoneでは2FPSくらいなので、大幅にスピードアップしました。これはソース上で、各所に存在していたdelay待ち時間を最小にしても動いたことが大きな理由です。
LEPTONサーモカメラは、温度計算やチップ制御を実行するために、さらにi2Cの接続が必要というめんどくさいセンサーなのですが、こちらの方は問題なく接続できました。
- ピンの接続
LEPTON ESP32
CS -------------->D5
MOSI------------->D23
MISO------------->D19
CLK ------------->D18
GND ------------->GND
VIN ------------->3V3
SDA ------------->D21
SCL ------------->D22
- 今回のESP32側ソースは以下からダウンロードしてください。
id:TAKEsan の LEPTON-WROOM32TEST.ino
たまにシステムダウンすることがありますが、このままの設定で1時間以上動くので許容範囲としました。頻繁にESP32がダウンする場合は、read_lepton_flame の最初の方に入れているdeleyの数値を調節する必要があります。
Mac 側Openframeworks
前回までは画面のチラツキがあり、かなり不満でした。原因はESP32から送られる画像データが1行ずつなので、1行送られるたびに画像表示していたから。今回は60行分送られた時点で画像表示するよう改良したので、チラツキが全くなくなりました。
チラツキさえなくなれば、VBOを使って画像を3D化(ポイントクラウド)できます。ただし、以前は2倍に補間して画像を比較的滑らかに表示してましたが、3D化する場合は画素数が不足します。今回は4倍に補間したデータを使いました。実験なので単純な平均値です。ofxCVを利用してバイキュービック補間すればベターですが、そこまでしなくても結果は見ての通りGoodでした。
今回作ったOpenFrameworksソースは以下からダウンロードしてください。
VBOについてはOFの大御所。多摩美術大学「田所先生」の例題を応用させていただきました。
openFrameworks 3Dグラフィクス、OpenGL | yoppa org
当然ながら
OFをインストールしたTX1でも動くわけで、ZEDステレオカメラと組み合わせたら距離と対象物の温度が同時に...。デープラーニングなんか使わなくとも人間と動物くらい簡単に認識できちゃうかも。
Jetson TX1で以前作ったZEDアプリと今回の3Dサーモグラフィーアプリを同時に実行しているところ。多分OFで組み合わせた場合マルチスレッド化可能。両者のフォーカスを合わせればどんなことができるんでしょうか?ワクワクしてきました。
では また。