PIXY(CMUcam5)は、イメージセンサOmnivision OV9715(1/4", 1280x800)とマイクロ・プロセッサNXP LPC4330を搭載したモジュールです。
毎秒50フレームで画像データを処理して対象の物体を検出し、画像内でのその物体の位置、大きさ等の有用な情報のみを出力することができます。それによってマイクロ・コントローラは画像処理の負荷から解放されて他のジョブに処理能力を向けることができます。
PIXYでは、マイクロ・コントローラとの通信用にSPI、I2C、UART、USBのシリアル・インターフェイスが提供されています。Mindstomsのセンサ・ポートはI2Cを使っているので、その上で走るOSであるev3devにはI2Cで接続するデバイスを使うためのAPIが用意されています。PIXYはジェネリックなデバイスとして認識され、下記のSensorクラスを使うようになっています。
Sensor classes — python-ev3dev 2.1.0.post1 documentation
ハードウェアの面で見ると、PIXYのシリアル・ポートは10ピンのIDCコネクタで、一方のMindstormsのセンサ・ポートは6ピンのRJ12コネクタなので、少し細工をする必要があります。
MindstormsのRJ12コネクタはロックの爪が片側に寄った特殊な形をしていて、コネクタのみを入手するのが困難なので、Mindstorms用のケーブルを利用することにします。その片方のRJ12コネクタを切って、爪がついていない側から4本の線を1本ずつ分離して対応するIDCコネクタのピンに接続します。爪がついている側の2本はアナログ用で関係ないので切っておきます。出来上がりはこんな感じです。
ここで、具体的なピン配置は下のようになっています。
MisndtormsとPIXYを接続することができたので、次に、追跡の対象にしたい物体の特徴をPIXYにシグネチャとして登録します。シグネチャは7つまで登録できます。色合いの違うものが区別しやすいので、他とはっきり色合いが違う黄色いテニスボールで試すことにします。下のビデオはその様子を撮影したもので、次のようなステップを実行しています。
- PIXYに給電し、レンズの正面の15~20㎝程度のところにボールを置く。
- 上部のタクトスイッチを押した状態で保持し、下部のLEDが白から赤になったら放す。
- ボールを前後させて、LEDの明るさが変るのを確かめる。明るさが変化すれば、シグネチャの登録は成功している。
- 上部のスイッチをクリックするように押してすぐ離すと、赤が2,3回点滅する。これで対象物の登録が完了する。
上のステップにおいて、2のときにスイッチを押したままにすると、LEDの色が白→赤→オレンジ→黄→緑→シアン→青→紫と順番に変わります。これは、LEDの色によって登録するシグネチャを区別するための仕組みで、7色が
シグネチャ1:赤
シグネチャ2:オレンジ
シグネチャ3:黄
シグネチャ4:緑
シグネチャ5:シアン
シグネチャ6:青
シグネチャ7:紫
と対応しています。シグネチャを区別するための色と対象物の色は関係がなく、例えば、黄色のテニスボールをシグネチャ4として登録することもできます。そのためには、上記のステップでLEDが緑になったときにスイッチを離して登録を開始させます。そしてスイッチをクリックして緑のLEDが点滅すれば、登録が完了したことを確認できます。
シグネチャの登録ができたので、Mindstormsでそれをトラッキングできることを下記のev3devのサイトで紹介されているサンプルを参考にしたプログラムで確かめてみます。
下のデモでは、上記のステップでSignature1として登録した黄色いテニスボールを最初は手で隠しています。それをカメラから見えるようにすると、LCD上に画像内のテニスボールの位置、大きさに合わせた■が表示されます。ボールを適当に動かすと、■はそれに合わせて位置、大きさを変えて表示されます。最後にボールを手で隠すとSignature1が検出されなくなるのでLCDから■の表示は消えます。
なるほど。PIXYを使うと簡単にシグネチャとして登録したものをビデオ上で追いかけることが出来ます。
これを応用すると、ボールを見つけて取って来てくれるロボット、なんていうアイデアが出てきます。