にほんブログ村 その他趣味ブログ 電子工作へ

2010年08月13日

TCM8240MD を使用したカメラモジュール

モッパーです。

 「お父さんだって夏休みの自由研究がしたい!」第一弾です。すみませんが、長文です。
ちなみに第二弾は多分ありません。だって一人で自由になれる夏休みはあと1日もないんだもん(笑)。

8bitマイコンと廉価なカメラモジュールによるサッカーゴール認識が出来るかも ? というモジュールをやっと見つけましたのでテストしてみました。
モジュールを作成された fenrir 様のご厚意により、こちらをお借りすることが出来ましたので、RCJ サッカーに使えるか Arduino を使ってちょっとやってみました。 

モジュールの本来の目的は「猫カメラ」だそうで MicroSD・GPS・Bluetooth・加速度センサ等も搭載出来るようです。sparkfunのTCM8240MDと Altera の FPGA を使用して実装されたようですが、「私も人生で一回で良いからこういうものが自作出来るようになりたい!!!」という素晴らしい出来のモジュールです。またも FPGA に対する興味がフツフツと...私は多分スキル的に死ぬまで無理でしょうけど(泣)。
P8125247.JPG

で、本題に入ります。モジュール自体は 15fps で画像をサンプリング出来ますので、画像の品質と言う意味ではロボットのスピードへの追従はまずまずいけるレベルかと思います。問題は I2C による転送時間ですが、fenrir 様作成の WireExt を使用すると 1Mbps(beginReception(hoge,0)) まで転送レートを上げることが出来ます。

CCD の性能から見るとひどく贅沢な使い方ですが、転送時間を短縮するために最低の解像度である subCIF(128 x 96) でやって見ましたが、ケーブル長やいい加減な試行環境によるものか、667Kbps (beginReception(hoge,1)) が精一杯でした。これでも 1.4 fps 程度の転送が可能でしたので、1Mbps出来れば 2fps くらいはいけるかも知れませんし、もっと解像度落とせればより高速な転送できるはずです。。
現時点で達成できている転送レートだと、フルスピードで走行しながらの姿勢制御は無理で、ボールを確実に捕捉した後の動作等に適しているレベルと思います。ただし、カラーセンサーと違って一発読めばゴール中心を割り出せますので、対象と出来る用途は広がるはずです。

あと、この CCD はかなり厄介者で、データシートを見ても設定パラメータに何を設定したら良いのか分からないという問題があります。sparkfun さんのこちらの掲示板をじっくり読んでみましたが、皆苦労しているというのが分かっただけ...

色々パラメータ調整して見ましたがピンクが強くなる傾向は取り除けず、fenrir 様のこちらのパラメータ例にまい戻ってしまいました。多分、パラメータ調整でなんとかなるはずなんですが...今後やってみます。どなたかうまくいけば教えて下さい。以下のサンプル画像はごく簡単な整数演算で出来るレベルで弱い補正をかけたものです。まだかなりピンク入ってます(泣)。でも結果的に黄色と青色なら救えそうなところがまた RCJ サッカー向きかと...(笑)

以下、45cm 先のゴールの画像です。多分ゴールの幅の 80% 程度まで撮影出来てます。
45cm.jpg 

以下、100cm 先のゴールの画像です。
100cm.jpg

以下、160cm 先のゴールの画像です。背景は恥ずかしすぎるので見ないようにしてね(笑)。
160cm.jpg

もうちょっと光学系が広角だったらベストなんですけどね。

で、ここからが重要ですが、Arduino の SRAM には 1 フレーム分の画像情報は入りませんので、1 フレーム取り込んでからのんびり画像処理することなんて出来ません。画像データを読み取りながら逐次的処理で画像を処理する必要があります。実際にちょっとやってみましたが、出来そうです。でも、これ以上書くと今後トライするチームにとって面白くなくなるので、詳しくは書きません。ヒント : 二次元的な動きしかしない RCJ サッカーのロボットの前面に位置するカメラでは二次元画像は必要なく、一次元で十分と考えます。

このモジュールは、今後スイッチサイエンスさんやFPGA-Cafeさんで購入できるようにしたいとのことです。もし数千円で販売されれば、ロボカッパー達にとって選択肢の一つになると思います。

テストは Arduino と Processing (私として今回初めてのトライ!!!) で行いました。テストに使用したソースコードは拾い物も混ざってますので公開OKか確認の上、今後出来る限りの範囲で公開したいと思います。 


8/14 以下追記しました。もちろん画像処理させる Arduino はそれ専用になりますし、I2C バスは画像転送で専有されてしまうので、他の手段でメインの CPU と通信することが必要になります。また、カメラモジュール自体の I2C ポートは 10Mbps までの転送が出来るそうなので特に Arduino にこだわる必要はなく、より高速な I2C ポートを持っている CPU のほうが良いと思います。(そんなものあるのかどうか知りませんけど)

モジュールで使用されているのは Altera MAXII なので、正確には FPGA ではなく CPLD ですね。
簡単な画像処理なら FPGA や CPLD でも十分処理できるはずですし、多分そのほうが適しています。このモジュールからは JTAG 端子も出せますし設計データが公開されているので、CPLD 扱える方なら MAXII 書き換えたほうが早いと思います。(私には出来ませんけど)

以下、テストに使用したArduino のソースコードです。ほとんど Fenrir様のこちらのソースコードのパクリです。尚、画像処理部分は含まれていません。
camera_example_comunicate_processing.pde
以下、Processing 側です。初めての Processing なのでこんなコードで良いのかさっぱり分かりません(汗)。 
CatCamera_fin.pde
posted by モッパー at 22:16| Comment(2) | TrackBack(0) | 画像処理・カラーセンサ
この記事へのコメント
モッパー様

す、すごいです。
カメラモジュール単体は見たことありますが、とても使いこなせそうなものじゃない、と思って手を出していませんでした。
画像処理は中学生にはきついかな〜とも思いますが、こんなモジュールがあれば、ちょっと工夫するとなんとかなるもんなのですね。(ちょっとなんだろうか?)

Processing使うとPC側で画像処理もできそうですし、いっそのこと軽いPC積んじゃう方が手っ取り早いか、と考えたことあります。

どちらも、今のうちのチームには縁遠いですが。メインの制御系、駆動系の開発が進んでないようなので。

また、いろいろなチャレンジ(第2弾)お待ちしてます。
Posted by Reverse父 at 2010年08月14日 00:24
Reverse 父様

モッパーです。

>Processing使うとPC側で画像処理もできそうですし、いっそのこと軽いPC積んじゃう方が手っ取り早いか、と考えたことあります。

埼玉ノードで画像処理の口頭プレゼンをされた IPRIS さんがまさにモバイルPC+Processing+Arduino でした。PC の重量を考えると、画像処理がそれに見合った価値があるか ? 他の搭載したい機能とどちらを優先するか ? が考えどころですね。

画像処理の件、私も最初「形状認識させるためには OpenCV みたいな画像処理ライブラリ必要だよな」とか「照明環境の違いに耐えるロバストな処理モデルを作るためには...」とか大人の発想で色々考えてしまいましたが、「CCD は単にカラーセンサがいっぱい並んでいるだけ。ゴールの形状と大きさは最初から決まっていて大して変わらない。色の違いはその場で調整すれば良い。」からスタートして考えれば良いことだと IPRIS さんの口頭プレゼンを聞いていて気付かされました。実は子供達のほうが柔軟な発想で大人が考えもつかないことを発明してしまいそうに思います。IPRIS さん(子供達というのは大変失礼で、既に立派な技術者の方々ですが)、ありがとうございました。

「うちのチーム」は現時点では存在しないので...これはあくまで私の趣味の範囲です、とりあえず。
Posted by モッパー at 2010年08月14日 20:38
コメントを書く
お名前: [必須入力]

メールアドレス: [必須入力]

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/40142757
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック
にほんブログ村 その他趣味ブログ 電子工作へ