arduinoでBMX055センサを動かし,加速度・角速度・姿勢を計測する

電子工作

arduinoでBMX055センサを動かして,加速度・角速度・姿勢を計測してみました.このサイトが非常に分かりやすかったので,参考にしています.

BMX055センサは,加速度センサ・角速度センサ・姿勢センサが付いていて1,280円で買える超お手頃センサーです.そして小さい!ドローン界隈だと,MPU9050のセンサの方が有名な気がしますが,こちらは2,000円程度するのと,私が調べた限り秋月さんでは売っていなかったので,今回はBMX055センサを選択しました.

配線

配線は,以下のように行いました.必要な配線は4本だけです.

arduino      BMX055      
5VVcc
GNDGND
A4SDA
A5SCL

上記のように秋月さんの説明書どおりの配線にして,いざサンプルプログラムを動かしてみたのですが,最初動きませんでした.先にも紹介したこちらのサイトに書いてありましたが,JP4, JP5, JP6をショートさせる必要があるそうです.(よく見ると秋月さんのサイトにもしっかり書いてありました…汗)

ArduinoUNO で確認する際は電源選択用の JP6 と I2C プルアップ設定用の JP4,5 をショートします。

9軸センサモジュール

JP4〜JP6をショートさせた写真が以下です.「JP○をショートします.」って文面を見たときどこをショートさせるんだ?って思ったんですけど,対応する金色の部分を導通させるってことですね.初心者だと,経験者が思いもよらぬところでハマってしまいますね…

ソースコード

arduinoでBMX055を使うサンプルコードについては,秋月電商さんが載せてくれているのでこれを使えばある程度基本動作はできるかと思います.BMX055に限らず9軸センサ一般的に言えることなのですが,姿勢は直接センサから読み取れないので,計算する必要があります.今回はMadgwick filterを用いました.Madgwick filterの概要を以下で説明します.

ロール角・ピッチ角・ヨー角の算出にMadgwick filterを使う

Madgwick filterは,加速度センサ・ジャイロセンサ・磁気センサの情報からロール・ピッチ・ヨー角を算出するフィルタで,以下のメリットがあるようです.

  • 計算負荷が小さい
  • 低いサンプリング周波数でも使える
  • 観測システムに応じて,パラメータを変更できる

磁気センサを使わなくてもある程度精度が出そうだったので,磁気センサは使わないことにしました.(磁気センサを使うと,算出されたロール・ピッチ・ヨー角がドリフトし,なかなか思うように計測できませんでした.)

便利なことにarduinoではMadgwickAHRSというライブラリがオープンソースで用意されています.Sketch -> Include Library -> Manage Librariesからインポートして使ってみてください.

Madgwick filterのライブラリは以下のようにして使っています.

    madgwick.updateIMU(xGyro,yGyro,zGyro,xAccl,yAccl,zAccl);
    roll  = madgwick.getRoll();
    pitch = madgwick.getPitch();
    yaw   = madgwick.getYaw();

磁気センサも使う場合は,updateIMUの部分を以下のように変更してください.

madgwick.update(xGyro,yGyro,zGyro,xAccl,yAccl,zAccl,xMag,yMag,zMag);
Madgwick filterの補足

Madgwick filterには,betaというパラメータがあり,下記によるとbetaの値を大きくした方がバイアスの補正をより短い間隔で行え,加速度に対して敏感になるみたいです.arduinoのライブラリでもこの値は変更できます.

As a rule of thumb: increasing beta leads to (a) faster bias corrections, (b) higher sensitiveness to lateral accelerations.

What is the best beta value in Madgwick filter?

計測結果

以下が,サンプリング周波数を100Hzにして姿勢計測した際のグラフです.センサを,まずロール軸周りに傾けて,つぎにピッチ軸周りに傾け,最後にヨー軸回りに傾けています.結構きれいなグラフが出力されています.

ちなみに,arduinoでグラフ表示する際は,以下のコードでPCに計測データを送り,Arduino IDEのSerial Plotterにて出力しています.

void imu_bmx055::print_attitude_data() {
    calculate_attitude();
    Serial.print(roll);
    Serial.print(" ");
    Serial.print(pitch);
    Serial.print(" ");
    Serial.println(yaw);
    delay(sampling_time_ms);
}

参考

コメント