Arduino(Genuino)101、6軸センサーからの角度算出をProcessingで可視化してみる

Pocket

 Arduino(Genuino)101の6軸センサーから角度を算出してProcessingで可視化してみました。公式サイトの「Curie IMU Orientation Visualizer」というチュートリアルを参考にしてます。

 

 Genuino101の6軸センサーの取得値をMadgwickのフィルタリングアルゴリズムを通して角度算出します。その角度からProcessingで可視化しているものです。

 

 使い方は簡単です。チュートリアルにあるスケッチをそのまま使用するだけです。ただチュートリアルにあるスケッチをそのまま使用してみましたが動きの追従があまりよくなかったです。Genuino側スケッチのセンサー感度やサンプリング周波数等を調整しました。Processing側のスケッチはほぼそのまま使用してます。

 

 ▲調整後の動画です。いい感じで動きが追従してます。ただ暫く動かしていると、yaw軸(z軸)方向のずれが発生するのと、素早い動きでおかしな動きが発生しました。

 

<スポンサーリンク>

 

 

 外付け部品いっさい無しでここまでできるのはうれしいです。

 

 ▼その他のレポート記事はこちらから▼

Genuino101の加速度センサーを試してみる
Genuino101のジャイロスコープを試してみる
Genuino101の内蔵6軸センサーをMadgwickライブラリから試してみました

 

Pocket

<スポンサーリンク>


この投稿へのコメント

  1. とし said on 2016-09-02 at 03:25

    Genuino側スケッチのセンサー感度やサンプリング周波数等を調整しました。
    と書かれておられますが、いろいろやってみたんですが
    思うように追随しないです

    もし、よろしければ、センサー感度、サンプリング周波数をどんな値にすればよいか、ご教示いただけると
    ありがたいです

    よろしくお願いいたします

    • Gousei said on 2016-09-02 at 06:11

      としさん。こんにちは。コメント有難う御座います。

      修正した箇所ですが、
      ・シリアル通信のボーレートはSerial.begin(9600)に設定。を”115200″(processing側も)にあげる
      ・感度 int factor を“6000”“7500”にする。
      ・サンプリングは加速度、ジャイロをそれぞれ
        CurieIMU.setAccelerometerRate(1600);//1600Hz
        CurieIMU.setGyroRate(3200);//3200Hz
      にして、追記してます。

      投稿内の動画は記憶曖昧ですが、確かこの設定で行ってます。

  2. 匿名 said on 2016-09-03 at 02:40

    ありがとうございます。

    参考にさせていただきます。

    • Gousei said on 2016-09-03 at 23:14

      こんにちは。修正した数値ですがすみません。
      気になって確かめたところ違っておりました。
      修正しましたので再度確認下さい。少しは追随がましだと思います
      参考ですが、Curieライブラリのmadgwickフィルターは動作がいまいちで
      結局私はカルマンフィルター使用して姿勢検出してます。

  3. とし said on 2016-09-04 at 09:57

    修正のご連絡ありがとうございます

    もう一つ質問させてください

    各センサーのレンジは、以下でよろしいので
    しょうか?

    CurieIMU.setGyroRange(250);
    CurieIMU.setAccelerometerRange(2);

    よろしくお願いいたします

    • Gousei said on 2016-09-04 at 10:10

      各センサーのレンジは
      CurieIMU.setGyroRange(250);
      CurieIMU.setAccelerometerRange(2);
      で問題ないと思います。
      ただデフォルトでこの設定かと思いますので
      私はスケッチで記述はしていないです。
      Curieライブラリのmadgwickフィルターはいろいろ癖がありそうです。
      がんばって下さい。

  4. とし said on 2016-09-04 at 11:45

    お返事ありがとうございます

    Curieライブラリのmadgwickフィルターを使って
    いろいろやってみていますが
    yaw pitch rollの値が想定している値より
    20分の1くらいの小さな値しか得られず
    しかも、yawのドリフトが大きく
    使い物になりません

    このライブラリを全く使わずに、カルマンフィルター
    のライブラリのみで、yaw pitch rollの値を得ることが
    できますでしょうか?

    よろしくお願いいたします

    • Gousei said on 2016-09-04 at 12:32

      私も最初madgwickフィルターライブラリをいろいろ弄っておりましたが
      ライブラリの中身が私には難解で断念しております。

      またyaw軸ですが6軸センサー(ジャイロ、加速度)ではドリフト補正は恐らく困難かと思います。
      別途、地磁気センサー等の補正が恐らく必要かと思います。

      madgwickライブラリは使用せずにroll、pitch、yawの値を取得するのは可能です。
      説明が長くなってしまうため、下記にスケッチをアップしておきます。

      roll、pitch軸のみをprosessingでビジュアル化してます、
      CurieIMUのみで実現してます。yawの値も取得はしてますが補正していないためドリフトがすごいです。
      roll、pitchのドリフト補正はカルマンフィルターを使用してます。

      ダウンロード頂き中身をご確認下さい。prosessingスケッチのポートはご自身のポートへ合わせて下さい。

      prosessingスケッチですが私の環境では微妙にレスポンスが悪いです。
      「再生」後、一度「停止」、再度「再生」するとレスポンスよくなります。

      • いろ said on 2016-11-02 at 15:48

        コメント失礼します.
        いつも参考にさせていただいております.
        今回,madgwickライブラリは使用せずにroll、pitch、yawの値を取得しようとがんばっているのですが,うまく角度の算出がされません.
        もしよければ,madgwickライブラリを使用していないスケッチがまだあれば再度アップしていただけないでしょうか.
        また,同時にprosessingスケッチもお願いしたいです.
        よろしくお願い致します.

        • imo said on 2016-11-02 at 19:33

          コメント有難う御座います。
          会社勤めしているため返信が遅くなりました。
          ソースを下記にアップしておきますので確認してみて下さい。暫くupしておきます。

          yaw軸(z軸)の値はジャイロから算出はしてますが補正はしていないためドリフトはすごいです。ビジュアル化はしてません。
          Processingの3D表示がうまくいかない場合は

          void settings() {
          size(1200, 720, P3D);
          }

          void setting()内に記載してあるsize()をvoid setup()内に移動してみて下さい。

          • いろ said on 2016-11-03 at 18:12

            お忙しい中,ご丁寧にありがとうございます.
            参考にさせていただき,解決するよう頑張ります.
            今後とも記事の更新楽しみにしています.
            本当にありがとうございました.

  5. とし said on 2016-09-04 at 12:59

    ありがとうございます

    丁寧に、ソースまでアップいただき
    本当にありがとうございます

    参考にさせていただいて、頑張ってみます

    ちなみにgenuinoにMPU6050を接続して
    DMPのデータを使うとうまくいくのですが
    途中で6050からデータが出なくなって
    断念しました

  6. とし said on 2016-09-04 at 15:14

    スケッチを試させていただきました
    ありがとうございます

    roll、pitchが、角度としてドリフトせずに
    得られました
    ありがとうございます

    yawの値は、いろいろ調べると
    yaw = atan2(ax,ay)*180/M_PI
    と書いてあったり
    複雑なsin cosの関数だったりするのですが
    axとayの関数じゃないかと思うのですが
    よくわかりません
    yawを求める式の参考になるサイトは、
    ありますでしょうか?

    お忙しいところすみません

    お手すきの時間がございましたら
    ご教授いただけると、ありがたいです

    よろしくお願いいたします

    • Gousei said on 2016-09-04 at 17:33

      無事にroll、pitchが取得できたようですね。
      yawに関して、
      加速度センサーから水平面とのなす角は計算できると思います。
      ただyaw軸廻りの回転角ではないため恐らく目的の内容ではないかと思います。
      ジャイロからは積分計算でyaw += gz * dt;で回転角が算出できますが
      ドリフト補正が6軸センサー(加速度、ジャイロ)では困難かと思います。
      Genuino101のみでは困難ではないでしょうか。

      加速度センサーからの角度計算は
      http://www.analog.com/media/jp/technical-documentation/application-notes/AN-1057_jp.pdf
      http://garchiving.com/angle-from-acceleration/

      この辺りを参考にしてはどうでしょうか。
      yaw軸廻り角に関しての補正は一度断念しております。
      もう少し自分でもやってみようと思います。

      うまくできましたら記事に投稿させて頂きます。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL