« 非同期クロックのタイミング制約について(迷走中) | トップページ | 超リアルタイムHMD試作に向けた技術検証(中間報告?) »

2018年5月 6日 (日)

Zybo Z7 への Raspberry Pi Camera V2 接続 (1000fps動作)

前回の続きで、Zybo Z7 への Raspberry Pi Camera V2 (Sony IMX219)接続です。
今回はようやく 1000fps の動作に成功しました。

Sonyの公式製品アナウンスで
https://www.sony-semicon.co.jp/products_ja/new_pro/april_2014/imx219_j.html

「1280×720で180frame/sのHD動画撮影も可能です (MIPI 4Lane 使用時)」という文言があります。

 Raspberry Pi Camera V2 モジュールはそもそも 2lane しか出力されていないという心配事はあるのですが、少なくともデバイスとしては上記の性能があるわけです。
ここで、一般的な CMOSイメージセンサであれば、ライン数を削っていけば速度は上がっていくはずです。単純計算なら 720p で180fps出ていれば、129 ラインまで削れば1000fpsが狙えるはずです。

 筆者の所有するXeperiaもですが、最近Sonyは高速度撮影に力を入れているようで、ピクセルビニングなどの機能を含めて高速撮影に使える設計が強化されているようです。ローリングシャッターなのでマシンビジョンなどの画像認識系にはあまり向かないと思いますが、人間の視覚に対する効果(AR/VR用途)を探るのに使う場合は、むしろローリングシャッターの方が、素直にいろいろなことが出来そうに思っています。

元々はこちらのRaspberryPi のフォーラムでも 640x120 で 960fps の話が出ていたのを見かけて、構想を練っていた次第です。
https://www.raspberrypi.org/forums/viewtopic.php?t=109137&start=375

なお、実際に動作させてみた結論から言うと、ラインのうちの640しか転送しなかったこともあってか 2lane でもちゃんと1000fps通ったようですし、単純計算よりもややマージンを詰めて 640x132@1009fpsで動いたように見受けられます。

下記は、Zybo上で受信したRAWをそのまま 10bit => 16bit にシフトして、4フレーム連続で DDR3-SDRAM にワンショット記録したものを OpenCV の CV_16UC1 の形式で cv::imshow したものです。結構早く手を振っても変化が少ないスローモーション撮影を確認できます。

Highspeed

ZyboでLinux環境があるおかげで、こういう風に映像を見ながら、cv::createTrackbar で値を弄りながらデバッグできるのはとても快適です。

環境を作るにあたって、Twitterその他で、筆者の素人質問に快く答えていただいた皆様に改めてこの場をお借りして御礼申し上げます。

さて、映像は露光時間も 1ms未満になってきますのでとても暗いものになりますので、天井の照明を撮っているわけですが、映像自体は照明カバーに文字があるのも認識できる程度ですのでさすがSonyといったところでしょうか。

なお、ちゃんと1000fps出ているかの確認に、古いシンクロスコープですが、FrameStartでトグルする信号を作って入力してみました。

Dsc_0466

ちゃんと1ms周期でトグルしているのがわかります。

ILAで覗いてもおかしなところは見受けられないので、狙い通り動いている予感です。

 露光時間不足自体は、枚数の増えたフレームを重ね合わせれば回復できますので、解像度を犠牲にした替わりに超HDRな撮影環境を作ったとも言えます。空間方向ではなく時間方向の画像処理がいろいろ出来る余地が出来ましたので、映像としても料理の仕方がいろいろありそうです。

 私の場合はリアルタイム屋ですので、将来的に以前から取り組み中の1000fps級のOLEDに接続して、遅延レスのHMDを作って、人間の視覚のハッキング(超AR/VR)がやりたいというのが目標です。まだまだ先が長いですが、デバイス的な課題はだいぶ目処が立ってきたように思います。

 なお、同じ事をする人がいるかどうかは謎ですが、前回からの更新でカメラ設定のポイントだけ書いておきますと

0x0174 <- 0x03  : H方向のx2-analog (special) binning
0x0175 <- 0x03  : V方向のx2-analog (special) binning

でアナログでのピクセルビニングを有効にします(特に垂直方向が重要)。

 これで、フレームレートを決める 0x0161 番地 のFRM_LENGTH の換算が 2Lines単位に替わって、速度が一気に倍になるようです。
これだけでも単純にライン数を減らせばそれだけでかなり高速動作が出来るようです。

次に、さらに攻めるならピクセルクロック自体の増加設定が必要なようです。
Raspberry Pi 用の設定だと、MIPI の 2lane にあわせて、91.2MHz × 2ch がピクセルクロックのようですが、ここは4lane時は 140MHz まで上げることが許されているようです(0x1130番地にMAX値がReadOnlyレジスタとして存在する模様)。
PLLの倍率は 0x0307 番地で設定できるようです。RaspberryPIから解析した値は57(91.2MHz)でしたが、今回は87(139.2MHz)にしています。

 ちなみにINCKは24MHzのようです。RaspberryPIが行っている設定値も24MHzですし、カメラ基板上のオシレータをルーペで見ても24.0の刻印が見えたのでおそらくあっていると思います。24MHzが一度3分周されて8MHzになったものが、PLLで 57倍に逓倍され、456MHzとなったものがさらに5分周されて91.2MHzというのが最初の設定値だったようです。

 実際は 139.2MHz まで上げると、2lane ではフル出力しようとすると溢れるので、読み出し範囲を絞る設定をせずに単純にここを弄って、壊れた絵が出てくるのも体験しましたが、H方向の読み出し範囲を640などに限定すれば左右をカットした分で帯域に余裕が出るようで、無事に絵が出てきてくれました。Sonyセンサーの内部設計が良く出来ているのだと思います。

ソースコードなどはgithubに入れています。
該当プロジェクトは projects/zybo_z7_imx219/ 以下にあるので、興味のある方はどうぞ(まだかなり汚いコードですが)。

GW明けるとまたまとまって弄る時間がしばらく取れなくなると思いますが、コツコツ作業できればと思います。

RaspberryPiではなくZybo(FPGA)に直結できているというところがポイントでして、I/Oと演算器が直結できるFPGAの良さを生かして、FPGAならではの面白いシステムにしたいなと考えております。

« 非同期クロックのタイミング制約について(迷走中) | トップページ | 超リアルタイムHMD試作に向けた技術検証(中間報告?) »

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: Zybo Z7 への Raspberry Pi Camera V2 接続 (1000fps動作):

« 非同期クロックのタイミング制約について(迷走中) | トップページ | 超リアルタイムHMD試作に向けた技術検証(中間報告?) »