ICM-20948 と BNO086 のコンビネーションで、Mahony の 9軸Fushion。。

ICM-20948 と BNO086 のコンビネーションで、Mahony の 9軸Fushion を試してみる。

MotionCal で、ICM-20948 の Magnetoをキャリブレーションするのは至難の業だと思うので、 ICM-20948 Acc 、Gyro と
BNO086 MagCali(キャリブレーションされた Magneto) を、Mahony または、 Madgwick に通して、9軸Fushion できないか試してみる。

ICM-20948 Acc 、Gyro : 400 - 500[Hz]
BNO086 MagCali: 100[Hz]
でサンプリングして、Mahony または、 Madgwick の 9軸Fushion をしてみる。

MagCali 100[Hz] なので、MagCali が取れていないときは、mx=my=mz=0.0 として、自動的に 6軸Fushion となるようにする。
Madgwick も、Acc、Gyro を 500[Hz] 辺りで与えると、ブルブルも気にならなくなる。
この組み合わせだと、ドリフトがでなくなるのでは? ただし、向きの精度は、最終的には、BNO086 MagCali の精度と同じにるのでは?

1. 最初に、BNO086 MagCali 単体で、
float heading_m = -1.0 * atan2(my,mx); // [rad]
を試してみたが、これが、ぜんぜんリニアではない。
これでは、だめだ!!
やはり、中華製の BNO086 に、問題があるのか? 正規版だとどうなのか?

ここで、この試みは、ストップじゃ!!

どうやら、Magneto のキャリブレーションに関して記述があった。
SparkFun_BNO08x_Arduino_Library/examples/Example_20_CalibrationSettings のコメント欄。

This example shows how to adjust settings of the dynamic calibration of the BNO08x.

The BNO08x allows you to turn on/off dynamic calibration for each sensor in the IMU (accel, gyro, or mag).

Please refer to the BNO08X data sheet Section 3 (page 37) https://docs.sparkfun.com/SparkFun_VR_IMU_Breakout_BNO086_QWIIC/assets/component_documentation/BNO080_085-Datasheet_v1.16.pdf

Note, by default, dynamic calibration is enabled for accel and mag.
Some special use cases may require turning on all or any special combo of sensor dynamic calibration.

// Note, The BNO08X stores updated Dynamic Calibration Data (DCD) to RAM
// frequently (every 5 seconds), so this command may not be necessary
// depending on your application.

なので、少し時間が経つと、自動的にキャリブレーションが為されるようだが、
起動してすぐに正確にデータがほしければ、
予めキャリブレーションを行って、ROM に保存しておけば良いかも。

BNO080_085-Datasheet_v1.16.pdf に記述があった。

3.2 Calibration Steps
Magnetometer: Device should be rotated about 180° and back to the beginning position in each axis (roll, pitch and yaw).
Device should be rotated about 2 seconds on each axis.

自分で、x y z 軸ごとに 2[秒] の間に、180度回転して元に戻すを 各々行うみたい。
ならば、やはり、予め、ROM に保存させておくべきか?

これを信じて、開発を再開する。

BNO08x Library は、 SparkFun を使う
一応プログラムを完成させて、動かしてみる。
注) とりあえず、 Acc 、 Gyro 500[Hz] で、MagCali 100[Hz] で採取する。
注2) mz * -1.0 で反転させるみたい。

ドリフトは、しないみたいじゃ。
しばらくおいておいて、右に 90度、左に 90度 それぞれ動かしてみたが、大体あっているみたい。
しかし、しばらくと言うのが。どれくらいか?
今後、これをどうするか、考えないといかん。

あとは、実機でためしてみるべきか? by nishi 2025.5.11
実機に搭載するとなると、スイッチサイエンスで、Qwiic ケーブルを購入して、ICM-20948 と BNO086 を繋げなければいかん。
中華のBNO086 も無駄にならなければ、ラッキーじゃ。
この中華版 BNO086 は、マグネットには、突発ノイズが入らないみたいじゃ。

逆に言えば、高いが正規版を購入しておけば、こんな苦労はしなくてすんだのかも。

2. 補足。
Wire.write() を使って、直接 IMU のレジスターにアクセスするには、下記が参考になるみたい。将来必要になるかも。
BMX055とESP32でMadgwickフィルタを使う
注) BNO055 で、実際試したが、データは取れなかったので参考程度に。

このブログ記事について

このページは、おんちゃんが2025年5月 7日 13:45に書いたブログ記事です。

ひとつ前のブログ記事は「ポンコツの ICM-20948 DMP を諦めて、BNO086 を試して、結局ICM-20948 Madgwick 6軸 Fusion になった。」です。

次のブログ記事は「ICM-42688 Madgwick、Mahony 6軸 Fusion を試す。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

月別 アーカイブ

ウェブページ

サイトナビ