10自由度 Mems IMUセンサ モーションセンス基本動作
DFROBOT様より、提供頂いた10自由度 Mems IMUセンサモジュールを試してみました。
目次
10自由度 Mems IMUセンサ
このモジュールには
- ADXL345:3軸加速度センサ
- ITG3200:3軸ジャイロ
- HMC5883L:3軸地磁気センサ
- BMP085:気圧センサ
が搭載されています。3+3+3+1で自由度10のセンサです。モジュールのインターフェースはI2C。
構成
部品
- 10自由度Mems IMUセンサ
- Arduino UNO
モーションセンシング
ここでは同じ加速度、ジャイロ、磁気センサを使った以下のSparkFun製モジュールのチュートリアルを参考に気圧センサ以外の動作確認しました。
ファームウェアダウンロード
以下からファームウェアをダウンロード
https://github.com/Razor-AHRS/razor-9dof-ahrs
ArduinoやProcessingのプログラムが用意されています。Arduinoプログラムよりセンサの姿勢角を算出し、Processingで姿勢角を受けて3Dモデルを動かせます。
Arduinoプログラム
センサをArduinoに接続してダウンロードしたファームウェア内のArduino/Razor_AHRS/Razor_AHRS.inoを書き込みます。
磁気センサ(HMC5883L)型番を指定するために// HARDWARE OPTIONS内161行目のコメントアウトを解除します。
1 |
#define HW__VERSION_CODE 10736 // SparkFun "9DOF Razor IMU" version "SEN-10736" (HMC5883L magnetometer) |
Processingプログラム
ダウンロードしたファームウェア内のProcessing/Razor_AHRS_test/Razor_AHRS_test.pdeを起動し実行します。
ArduinoのポートはRazor_AHRS_test.pde 29行目の数字で指定します(0とか1とか)。
1 |
final static int SERIAL_PORT_NUM = 0; |
動作
動きが安定していません。。。特に首振り方向(Yaw角)が。。
というわけで校正します!
校正(キャリブレーション)
加速度センサ校正
Arduino/Razor_AHRS/Razor_AHRS.inoでシリアルモニタ(57600 bps)を起動し”#oc” と入力し送信します。すると以下のように加速度センサ校正モードに入ります。
加速度センサ校正モードでセンサをゆっくり全方向に動かして3軸の加速度オフセットの最大値/最小値を測ります。余計な加速度が加わらないように衝撃を与えないようにゆっくりセンサを動かして各軸の+方向、-方向を重力方向に向けます。このモジュールでは以下のような値となりました。
1 |
accel x,y,z (min/max) = -310.00/261.00 -277.00/300.00 -330.00/255.00 |
3軸の最小値/最大値が取れたら、Razor_AHRS.ino内// SENSOR CALIBRATIONの216-221行目を取得した値に変更します。
216 217 218 219 220 221 |
#define ACCEL_X_MIN ((float) -310) #define ACCEL_X_MAX ((float) 261) #define ACCEL_Y_MIN ((float) -277) #define ACCEL_Y_MAX ((float) 300) #define ACCEL_Z_MIN ((float) -330) #define ACCEL_Z_MAX ((float) 255) |
ジャイロセンサ校正
次にシリアルモニタより”#on” と入力し送信します。すると地磁気センサ校正モードに入りますが、ここでは別の地磁気センサの校正方法を実施するので再度”#on” と入力、送信しジャイロセンサ校正モードにします。
センサを動かさずに10秒ほどまって値の平均値が安定するのを待ちます。このモジュールでは以下のような値となりました。
1 |
gyro x,y,z (current/average) = -12.00/-13.56 -15.00/-15.13 -10.00/-10.25 |
得られた平均値をRazor_AHRS.ino内// SENSOR CALIBRATIONの240-242行目に記載します。
240 241 242 |
#define GYRO_AVERAGE_OFFSET_X ((float) -13.56) #define GYRO_AVERAGE_OFFSET_Y ((float) -15.13) #define GYRO_AVERAGE_OFFSET_Z ((float) -10.25) |
地磁気センサ校正
Processingプログラムを使用して校正値を導出します。Processing/Magnetometer_calibration/Magnetometer_calibration.pdeを使用しますが、EJML(efficient-java-matrix-library) ライブラリが必要となります。以下でEJMLのjarファイルをダウンロード
https://code.google.com/archive/p/efficient-java-matrix-library/downloads
ダウンロードしたjarファイルを”EJML.jar”にリネームして以下に保存(ProcessingのライブラリフォルダにEJMLフォルダ更に中にlibraryフォルダを作成しjarファイル保存)
libraries/EJML/library/EJML.jar
EJMLライブラリの準備が終わったらMagnetometer_calibration.pdeを起動し実行します(マイコンのポート設定は適宜実施)。地磁気センサ校正画面となります。センサを色々な方向に動かして3次元の地磁気値を取得し、オフセットを導出します。携帯でも8の字描いてコンパスの校正したりしますよね。
動かしまくると上図のようになり、スペースキーを押すとMagnetometer_calibration.pdeのコンソールに以下のような校正値が導出されます。
1 2 3 |
#define CALIBRATION__MAGN_USE_EXTENDED true const float magn_ellipsoid_center[3] = {-114.031, 16.5203, 162.767}; const float magn_ellipsoid_transform[3][3] = {{0.907361, 0.00643178, -0.0204380}, {0.00643178, 0.891493, -0.000794171}, {-0.0204380, -0.000794171, 0.995446}}; |
Razor_AHRS.inoの225-230行目をコメントアウトして、234−236行目のコメントアウトを解除して取得した値を記載します。
以上で加速度、ジャイロ、磁気センサの校正値が揃いましたのでマイコンに各オフセット値を記載したRazor_AHRS.inoを書き込んでRazor_AHRS_test.pdeでモーション動作の再確認しました。
校正後の動作
無事動作が安定しました!わーい 🙂
これで精度良いモーションセンスが可能となったので、応用考えたいと思います!