こんにちは。星野です。
今日は、IMUユニットの動作確認を行っていこうと思います。
用意するもの
①前回制作した機体
②Atom Motion キット
③IMUユニット
・パソコン
IMUユニットの動作確認
加速度、ジャイロの値を表示させる
①IMUユニットのコネクタをATOM Motion キットのPORT.Bに接続します。
②以下のプログラムを書き込みます。
#include "M5Atom.h"
float accX = 0, accY = 0, accZ = 0;
float gyroX = 0, gyroY = 0, gyroZ = 0;
void setup(){
M5.begin(true, false, true);
Serial.begin(115200);
M5.IMU.Init();
M5.IMU.SetGyroFsr(M5.IMU.GFS_2000DPS); //ジャイロのレンジを設定 250,500,1000,2000DPSから選択可能
M5.IMU.SetAccelFsr(M5.IMU.AFS_2G); //加速度のレンジを設定 2,4,8,16Gから選択可能
}
void loop(){
M5.IMU.getGyroData(&gyroX, &gyroY, &gyroZ);// ジャイロの値を取得
M5.IMU.getAccelData(&accX, &accY, &accZ);// 加速度の値を取得
Serial.printf("%.2f,%.2f,%.2f,%.2f,%.2f,%.2f\r\n", accX, accY, accZ, gyroX, gyroY, gyroZ);
delay(100);
}
③動かしてみる
IMUユニットに軸の向きを書いたシールが貼ってあるので、それを元に各軸の値を見てみます。
Z軸を上向きにし、シリアルモニタで確認したところ、加速度X、Yの値が0付近で、Z軸は1G付近の値を取得できました。
姿勢の計算
カメラ撮影でブレを少なくするために、機体の姿勢を知る必要があります。
IMUユニットから姿勢データを取得してみましょう。
①カメラマウントにIMUユニットを載せます。
Y軸が機体の正面にくるようにIMUユニットを載せ、両面テープで固定します。
②下記のプログラムを書き込みます。
#include "M5Atom.h"
float roll, pitch, yaw;
void setup() {
M5.begin(true, true, true);
M5.IMU.Init();
M5.IMU.SetGyroFsr(M5.IMU.GFS_2000DPS); //ジャイロのレンジを設定 250,500,1000,2000DPSから選択可能
M5.IMU.SetAccelFsr(M5.IMU.AFS_2G); //加速度のレンジを設定 2,4,8,16Gから選択可能
}
void loop() {
M5.IMU.getAhrsData(&pitch,&roll,&yaw); //ロール、ピッチ、ヨーの値を取得
Serial.printf("%.2f,%.2f,%.2f\n", roll, pitch, yaw); //ロール、ピッチ、ヨーの値を表示
delay(5);
}
このプログラムでは、「getAhrsData」という関数で加速度、ジャイロからロール、ピッチ、ヨーの値を取得しています。
「getAhrsData」関数の中では、「Madgwick Filter」を組み込みフィルターをかけているみたいです。
Madgwick Filterの詳しい内容を知りたい方は、こちらが参考になるかと思います。
https://qiita.com/fumiya_sato/items/df28dff5ccc653183235
③カメラマウントを手で動かしてみる
機体のロール、ピッチ、ヨー
IMUユニットを水平に置いた時に、ロール、ピッチ共に大体0付近の値を取得できました。
ロール、ピッチは精度よく値が取れていますが、ヨーの値はカメラマウントを動かしていなくても変化してしまいます。
ヨーの精度を良くするために補正が必要ですが、補正の話については、今度触れていきたいと思っています。
カメラマウントを上下左右に動かすと、大体 -90~90の範囲の値が取得できます。
これにより各軸の回転した角度が分かり、機体の姿勢が分かるようになりました。
おわりに
今日は機体の姿勢を知るために、IMUユニットから姿勢データを取得しました。
次回はIMUユニットの姿勢データを元にカメラマウントを動かしていこうと思います。
次回の更新予定日10/11です。お楽しみに!