2014年4月20日日曜日

Raspberry Pi と MPU-6050を使ってデータ取得(C++)

CやC++でMPU-6050のデータを取得したい場合は
http://www.raspberrypi.org/forums/viewtopic.php?t=22266
のプログラムを使えばよい。

RaspberryPiのBを使っている場合はリンク先にも書いてあるようにI2Cdev.cppの中の/dev/i2c-0を/dev/i2c-1に書き換えなければならない。

3D fireframeを動かすでもはみていないけど、クォータニオンを使っているようだ。勉強してないので分からんな。

2014年4月19日土曜日

Raspberry Pi と MPU-6050で角度、加速度データを取得する。

ポータブルな角度データ取得装置を作りたかったので、RaspberryPiとMPU-6050で作ってみた。
MPU-6050はSparkfunとかでは$40とかいう値段やけど、アマゾンだと480円であった。

解説はここに乗っているのでAruduinoを使う場合は参考になりそうだ。
今回の用途はデータを記録したいので、記録容量の観点からRaspberryPiを利用してみる。

まずはこのサイトを見ながら接続と動作を確認する。
Pythonでいけるんですねー。
http://blog.bitify.co.uk/2013/11/interfacing-raspberry-pi-and-mpu-6050.html
http://blog.bitify.co.uk/2013/11/reading-data-from-mpu-6050-on-raspberry.html

今売っているのはRevision2なので注意。
この通りにやるとちゃんと動いていそうだ。


Androcitiには5V動作もOKとか書いてあったのではじめはPiの5Vに接続しとったけど、
データシートをみるとそんなことは書いていない…一応まだ動いている。

Pythonスケールするところは、Rawデータを変換する係数らしい。データシートから値が分かる。
リンクのプログラムでは加速度データを整数で割り算している。これは精度の問題で小数点以下が意味を成さないということなのだろう、多分。止めて測っても下一桁は変わっとるし。




2014年4月16日水曜日

エピポーラ幾何

OpenCVでステレオカメラのキャリブレーションを行うと、引数にEssential MatrixやらFundamental Matrixやら出てきてわからなかった。
英語の文献を読むとわかりやすかった。分かれば大したことないかもしれんけど、ぼくみたいな誰かの参考になるようここにメモっておこう。

参考文献: http://www.robots.ox.ac.uk/~vgg/hzbook/hzbook1/HZepipolar.pdf



ではエピポーラ幾何について話す。
下の図のようにカメラが2つあって、どちらにも点Pが写っているとする。

左のカメラから見た点が、右のカメラのどの座標に写っているかが分かれば、
△OlOrPからPの深さが分かる。

しかし、実際はその対応関係がわからない(下図)。
対応付けをするためには、画素を調べて同じ点を探す必要がある。



しかし、2次元画像のすべての画素の対応を調べる必要はない。
2つのカメラの位置関係がわかっていれば、
その探索は1次元(エピポーラライン上)で済む。

ではその理由を数式を用いて探っていく。
△OlOrPの形は定かではないが、
,


は同じ平面上にあるという制約(Epipolar constraint)がある。
よって以下の式が成り立つ。



これを左のカメラの座標で書き直すと



t、Rは右の座標から左の座標へのtranslation vectorとrotation matrix。
ここで外積はベクトル→ベクトルの変換なので等価な行列表記にすると以下のようになる。





このEがEssential Matrixで、Rとt(カメラの外部パラメータ)から成り立っている。

これはフィルム上の点でも成り立つ。つまり



などとフイルム上の座標を表記したとき、



が成り立つ。


Fundamental Matrixはにカメラの内部パラメータも押し込んだ形のものだ。
フィルム座標からピクセル座標への変換はAffine transform matrix以下のように表せる。



これを上の式に代入すると、





Fはカメラの外部パラメータ、内部パラメータをひっくるめたものであることがわかる。

で、ここから何がわかるかだ。

ピクセル座標での直線を考えるよう。直線の方程式は以下のようになる。




とおくと上のFundamental Matrixの式と同じになる。がライン上にあることを示している。はカメラの構成によってのみ決まるので、どちらかのピクセル座標を与えれば、どのライン上にもう片方のピクセルが存在するか決めることができる。


OpenCVに実装されているので、実際に計算することはないと思うけど、意味は知っておきたいですね。