【STA23】BNO Gyro積分回転精度測定<IMUモードでFUSION無しで使う>

yaw角の代替対策としてGyroを積分して角度を得る方法の精度測定をしました。
yaw角を使わないということはMagnetセンサを使わないということですので、NDOFモードで
なくて、IMUモードでMagnetセンサをキャリブレーションから除外したほうが精度がよいだろうということで、IMUモードとNDOFモードでの1回転360度でのGyro積分角度精度測定しました。
*************************************************************************************************
※その後2023年11月にBNO055に代わるIMU BNO085を入手しては、BNO055は、お役御免となりました。
BNO055は、キャリブレーションアルゴリズムにバグがあります。頻繁にキャリブレーションをしすぎるので、Fusionが意図せず狂います。補正であるはずのキャリブレーションが過剰な補正で、データを壊してしまっています。これは、BOSCH社が製品を回収しなければならないのが筋ですがBOSH社は、BNOの開発を撤退して、CEVA社に開発を移譲しました。
CEVA社は、IMUのノウハウをもっているHillCrest研究所を傘下にもっているので、BNO08xシリーズで、BOSHのファームウエアを全部入れ替えて、BNO055よりはまともなファームに乗せ換えたので、安物IMUで本来あるべき精度(yaw角±5度)が確保されてます。ということで、バグをもっているBNO055を買ってFUSION無しで使うか、捨ててBNO08xシリーズを買い替えるかとなります。
*********************************************************************************************************************

—————-※その後7月にはいって、IMUモードでのいろいろな測定をしてきました。—————————————-
BNO055の特徴であるFusion計算機能がIMUモードでは、yaw,pitch,rollとQuarternionの値が出鱈目になることが判明しました。
NDOFモードで磁気センサが狂うのでIMUモードに変更したのですが、どちらも狂うということで回転治具のような高角速度領域(200dps以上)ではFUSIONは使えない結果となりました。
現象としては、回転治具で1周360度通過点でエンコード信号いれてみてみると Gyro積分では、毎回370度±4度程度で一定値をたもちますが、yawとQuarternion値は、1周通過点でも360度にならずに、20度くらいオーバーしてから360度になります、更に回転速度が遅くなるとどんどん遅延して、最後は100度くらいずれてしまうというとんでもないデータを吐き出してきます。IMUモードでは、FUSIONのyawとQuarterionが使えないので、結局普通のIMUと同様に、自分でセンサ座標と絶対座標の変換計算をしないといけなくなりました。1つだけ良い点は、Fusion計算のうちlinearAccとGravityAccの値は正確にでているみたいなので、普通のIMUよりは、機能が良いということです。BNOを何年も使い続ける気がなくなったので、もっと、MEMSでセンサノイズの少ないデバイスを探す活動を続けていきます。
————————————————————————————
Gyro初めて使うので、水平と傾斜での違いも測定しました。水平で電源オンして、キャリブレーションさせた後 45度傾斜させたまま回転させる測定と水平のままで回転させる条件2水準をN=5とモード2種類で、20回測定しました。1回20回転以上なので、1条件で120回転分のデータがでるので、平均と3σで比較します。

 


■Gyroの積分プログラム
元プログラムは。AdafruitのライブラリーのExampleでread_all_data.inoを改造してます。回転治具で回すので無線です。ESP32のBlueToothでデータをPCへ飛ばしてます。
gistにあります。https://gist.github.com/dj1711572002/407159fd909ce474d9b89b25fb33719c

50Hz(20msec)での台形積分です。出力値がRadianなので、print時に Degreeに変換してます。

gx_1=gx;
gy_1=gy;
gz_1=gz;
tg_1=tg;
tg=millis();
gx = event->gyro.x;
gy = event->gyro.y;
gz = event->gyro.z;
gxsum=gxsum+(gx+gx_1)/2*(tg-tg_1)/1000;
gysum=gysum+(gy+gy_1)/2*(tg-tg_1)/1000;
gzsum=gzsum+(gz+gz_1)/2*(tg-tg_1)/1000;

磁気エンコーダーのピン割り込み関数内で積分sum値をゼロリセットすることで1回転360度毎の回転角度を確定してます。

//MAG PIN intgerrupt
void magin()
{
tmag=millis();
magflag=1;
gxsum=0;
gysum=0;
gzsum=0;}

 

■IMUモードへの変更
①BNO055のモード表

datasheetの21ページにあります。Fusionモードを使わないとBNOのメリットがでませんが、Adafruitのライブラリーのデフォルトは、NDOFモードになってます。Acc Mag Gyro 全9軸をフルでFusion計算するモードですが、
Magを使うと激しい動きで精度悪化しますので、Mag無しで使うことにしました。

 

②IMUモードへの変更方法
Mag無しなら、IMUモードならFusionをAccとGyroでやってくれるので、精度も良くなるはずということで
ライブラリーにパッチをあてて、モード変更しました。
Aruduinoフォルダー内にあるlibrariesフォルダーにAdafruit_BNO055フォルダーがあるので、その中の
Adafruit_BNO055.hをTextEditorで開いて、285行目のモード設定行を変更します。

デフォルトでは、NDOFモード指定になっています。
bool begin(adafruit_bno055_opmode_t mode = OPERATION_MODE_NDOF);

これを下記のIMUモードへ変更します。

bool begin(adafruit_bno055_opmode_t mode =OPERATION_MODE_IMUPLUS);
//Change OPERATION_MODE_IMUPLUS 2023/6/23に変更

これで、プログラムをコンパイルするとIMUモードに変更されます。

 

●実験結果
電源オンするときの姿勢でキャリブレーション値が変わりますので、条件としては重要です。
更に、回転姿勢を変えることで、キャリブレーションの良しあしがFusion精度にでてきます。回転させかたは、手でいきおいよく回して停止するまで自由回転させます。磁気エンコーダを1点だけ設置してあるので、その点を通過すると360度ぴったりになるはずですが、
Gyroの積分値が360度からどれだけ離れて、平均値とばらつき3σを測定します。
N=5回で、回転数は、合計120回転の平均と3σです。

電源オン姿勢 回転姿勢 NDOFモード IMUモード
水平 水平 372度±8.4度 360度±8.5度
水平 傾斜45度 368度±17度 370度±7.9度

結果1:水平オン水平回転では、NDOFモードとIMUモードの差がでません。
結果2:水平ンオン傾斜45度回転では、NDOFモードが±17度もばらつきますが、
     IMUモードは、水平の時と変わりありません。
ということで、GyroとAccしか使わない場合は、IMUモードでFusion計算させたほうが精度良いです。

結果3:ばらつきが±8度というのは悪いという感じですが、MEMS IMUの360度積分値で
     3sigma 8度なら、半回転だと±4度、120度回転なら±2.6度なので、RTKの補間
    に使えるレベルになります。RTK側のBNOと同期させるリセットポイントは、120度から180度
    で使う予定です。


 

 

 

●以後
天気がよくなったら、庭でタープ下で、RTKとの比較実験をして、補間プログラムを作っていきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です