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 で、実際試したが、データは取れなかったので参考程度に。