キイロイトリらぼ

ぬいぐるみと一緒に生きていきます

Raspberry Piで可視光通信器を作る #2

概要

 
gijin94yobu.hatenablog.jp
この続きをする.
ローリングシャッター現象による画像は取得できたので,この縞模様を波形として切り出すことを目指す.
波形の解析には,pythonを用いた.
また,試行錯誤しやすいようにjupyter notebookで進めている.

結論

  • 送信機のオンオフを波形として切り出すことができた
  • 波形の切り出しはまだ自動化できていない

 

実行したこと

実行環境

【ホストPC】

手順

  • 画像を読み出す.

ここではopencvを使った.

f:id:gijin94yobu:20200719211948p:plain
cv2.imreadで読みだした画像

画像が大きすぎるのでcv2.resizeで調節した.

  • 画像を信号波形に変換する.

ひとまず,グレースケール化する.

f:id:gijin94yobu:20200719212203p:plain
グレースケール化した

現状はまだ,背景光雑音などは考えないようにするために,ざっくり二値化する.
しきい値は今後自動で決定したい.ここではしきい値60.

f:id:gijin94yobu:20200719212237p:plain
二値化した

そして,画像をarray化して積分する.
積分にはnp.sumを使い,画像の縞模様に対して水平に積算する.

f:id:gijin94yobu:20200719212504p:plain
積算した信号波形

これで扱いやすそうな信号になった.

  • 信号の正規化

取得画像からわかるように光源が円形なので,積算すると,中心に近いほど,輝度の大きさが蓄積されるので山なりになっている.これではまだ扱いにくいので,正規化する.
正規化には信号処理分野において様々あるかと思うが,ここではまだ簡易的に,信号の大きさが0以上であれば,1にするようにした.

f:id:gijin94yobu:20200719212744p:plain
0以上を1に正規化した信号

かなり,縞々が波形らしく見えた.オンオフがしっかりと分かる.

  • 信号の切り出し

ここが結構厄介.
本当は自動化したいところであるが,今回の成果としては,手動で切り出した.

f:id:gijin94yobu:20200719212915p:plain
切り出した信号波形

先頭と末尾が汚いが,このあたりも含めてスマートに切り出したいものである.
しかしこれで,Arduinoで送信したLチカの500μsのオンオフが,信号波形として可視化できた.
縞の数はだいたい24個.一山が500μsのため,この画像には24×500 [μs] = 0.0012 sの時間の波形が取得できたということである.

プログラム

作成したプログラムはこちら.
 
github.com

 

あとがき

 これで,ローリングシャッター現象を用いた可視光通信の受信機の大本ができた.まだまだ手動で波形を抽出していたりするので,連続画像を撮った場合や,背景光雑音が混じったとき,光源の大きさが変化したりしたときなど不安要素はたくさんある.しかし,それよりも,実際に意味のある送信データを送信して,復号ができるようにすることをまずは目指したい.現状はサンプリングレートにも相当するオンオフしか送受信していない.ここから,簡単な固定データ,文字列,連続データ,と通信ができるようにしたい.
また,露光時間とLEDのオンオフの関係性はもう少し,関係性を整理できるようにしたい.学術的にはこちらの論文*1で説明されていたりとすでに広く知られたものになっているが,自分で構築したシステムで置き換えられるようにもしたい.

研究室時代はこのような解析をすべてmatlabでしていたが,python jupyter notebookに置き換えている.matlab特有の関数ややり方のほうがまだやりやすいと思いながらも,pythonは無料で調べればすぐに解決策があるのがいい.また,jupyter notebookはmatlabのように使えるので,試行錯誤した形跡も残せるのが気に入っている.

*1:chrome-extension://dnkjinhmoohpidjdgehjbglmgbngnknl/pdf.js/web/viewer.html?file=https%3A%2F%2Fwww.panasonic.com%2Fjp%2Fcorporate%2Ftechnology-design%2Fptj%2Fpdf%2Fv6102%2Fp0110.pdf