2014年6月22日日曜日

加速度+ジャイロのGY-521(MPU-6050)を使ってみた -3- オイラー角?四元数?


加速度+ジャイロセンサーのGY-521(MPU-6050)を使ってみた -1-
加速度+ジャイロセンサーのGY-521(MPU-6050)を使ってみた -2-


前回までのスケッチでは角度に制限がありました。

youtubeの動画などには、MPU-6050を使いグルグル回してもおかしなことになっていないものがあるので、何か方法があるはずと検索。




使ってみた-2- ではMPU-6050のセンサーの値をライブラリが読み出し、XYZ軸の回転角(オイラー角と言うらしい)を送信してボックスを回転させています。
オイラー角とは3次元空間での物体の姿勢表現の方法の一つ。


このライブラリに含まれるteapotデモのarduinoとprocessingのスケッチを見ると、オイラー角を使わず四元数(しげんすう、クォータニオン)というものを使っていました。
どうやらこれを使うと360度グルグル回してもおかしなことにならない!
オイラー角ではジンバルロックが起こり、四元数ではそれを防ぐ事ができるとありますが、前述のおかしなことになっていたのはジンバルロック?

参考:さらばジンバルロック - 書評 - 実例で学ぶゲーム3D数学

映画「アポロ13」のセリフで出てきたのは覚えていますが。
数学的には全く理解できません。



実際にteapotデモを動かしてみました。

ライブラリのページからZIPファイルをダウンロード。

◆arduino側の準備
解凍した中から、最低限 I2CdevとMPU6050のフォルダーをarduinoのライブラリフォルダへコピー。
examples - MPU6050_DMP6 の中の MPU6050_DMP6.inoを編集。
117行目 //#define OUTPUT_TEAPOT の//を削除、有効にしてからarduinoへ書き込み。

◆Processing側の準備
processing側のスケッチは examples - MPU6050_DMP6 - processingの中の MPUTeapot.pde。
71行目の使用シリアルポートを環境に合わせて編集。
processing側ではToxicLibsが必要で、ダウンロードはこちらのtoxiclibs-complete-0020.zip。


arduinoの割り込み0番(D2ピン)が発生するとarduinoから送信を開始します。
ボードの裏からD2を指でチョンチョンって。
追記:GY-521 INT<ー>D2を接続すれば勝手に通信が始まります。

これで動くはず。
最初ToxicLibsのインストールが上手く行かず、processing1.5で試すと起動。
その後processing2でも動きだしたので、動かない時はいろいろ試してください。 (←曖昧な記憶)



加速度センサーのみで出力した時のような振動も無くスムーズに動きます。
フィルターがかかっているのでしょうか?
ソースを見てもわかりませんでした。
MPU-6050は各センサー生データで出力の他に、変換済みの形式で出力する際、DMP(digital motion processor)で計算しそこでフィルターがかけられているのかもしれません。
グルングルン回した後のZ軸のズレは、前回記事の動画ほどではないですが少しずれます。


スケッチ200行目からセンサーのオフセットの設定行があります。
センサーの実際の角度と出力値を一致させるための値ですね。
センサーごとに設定することができるようで、
I2Cdevlib Forums : Arduino Sketch to automatically calculate MPU6050 offsets
このスケッチで測定し、各スケッチでのオフセット値変更に利用するようです。
が、もともとチップに保存されているオフセット値と、計測したオフセット値にはあまり差がなかったので、設定しなくても余り変わらない気もします。
センサーを静止しても数値が動いていく時は計測して、スケッチで設定するといいかもしれません。
自分はオフセット設定部分はコメントアウトしました。


環境:arduinoUNO、arduinoIDE1.0.5、win7(64)、processing2.2.1



0 件のコメント:

コメントを投稿