Wiimote.pdeにIRセンサー取得を追加
ProcessingでWiiリモコンを使う方法で、WiiFlashを使って加速度などの基本値はとれるようになったけど、 「IRイメージセンサの座標が取れない」との質問。 仕方がないので、WiiFlashのソースコード"Window1.xaml.cs"をざら読み。 ネットワークに取得値を書き込んでいる所のコードを眺めて、 以下のような追加をすればいいことが分かった。
class Wiimote { ...略... void update() { boolean dataHasCome = false; while (client.available() > 80) { if (buffer == null) { buffer = new int[80]; } for (int i = 0; i < 80; i++) { buffer[i] = client.read(); } dataHasCome = true; } if (buffer == null || !dataHasCome) { return; } bufferPos = 1; batteryLevel = (float)readByte() / 0xC8; updateButtons(readShort()); x = readFloat(); y = readFloat(); z = readFloat(); extensionType = readByte(); /** IRセンサー added by T-Saitoh **/ bufferPos += 21 ; ir0 = readByte() ; // 1つ目のIRセンサーが値をとれた ir0x = readFloat() ; // 1つ目のX,Y ir0y = readFloat() ; // (9/15)readShort()->readFloat()修正 ir1 = readByte() ; // 2つ目のIRセンサーが値をとれた ir1x = readFloat() ; // 2つ目のX,Y ir1y = readFloat() ; } ...略... /** 拡張タイプ */ int extensionType; /** 各ボタン */ Button one = new Button(); : 略... Button right = new Button(); /** バッテリーの残量 */ float batteryLevel; /** 加速度 */ float x, y, z; /** IRセンサー added by T-Saitoh **/ int ir0 ; float ir0x , ir0y ; // (9/15)int->float修正 int ir1 ; float ir1x , ir1y ; ...略... }
# 初心者学生さんに、『WiiFlashのコード嫁!!』 とは言えんか…
cvWaitKey(1)がダメとな…
画像処理によるロボット制御のネタで、 学生さんのコードで、OpenCV使っているんだけど、 画像データは取得できているのに、cvShowImage() で画像が表示されない。 訳が解らず、ほとんどのコードをコメントアウトしたのに動かない。 カメラ画像もそれなりにリアルタイムに変化する値もとれている。 Webに載っている cvQueryFrame() + cvShowImage() のサンプルコードなら 簡単に動いた。見比べてみると、画像読み込みループの中の、cvWaitKey()の違いだけ。
cvWaitKey()の引数は、キー入力がタイムアウトするまでの時間[msec]で、 学生さんのコードでは1msecとなっていた。べつに支障が無いと思うのだが、 「ともかく動作検証。動作サンプルが5msecで動いたし」ということで、 cvWaitKey(5)に変更したら動いた…..うーむ….なぜだ….