BNO055のキャリブレーションについて - nearfactory/2024-TOINIOT2 GitHub Wiki

概要

9軸センサーモジュール BNO055 の地磁気センサ/加速度センサ/速度センサ のキャリブレーションを行うマニュアル。

プログラム

// 上略

Adafruit_BNO055 bno = Adafruit_BNO055(-1, 0x28, &Wire);

float dir;

// 中略

uint8_t system, gyro, accel, mag = 0;
bno.getCalibration(&system, &gyro, &accel, &mag);
/*
system, gyro, accel, mag はそれぞれ0-3の値が入る
0:   未キャリブレーション
1,2: キャリブレーション中
3:   キャリブレーション完了
*/

// キャリブレーションが完了していなかったら
if (gyro != 3 || mag != 3){
  Serial.println("Calibration is undergoing...");
  return;
}

// オイラー角を取得
imu::Vector<3> euler = bno.getVector(Adafruit_BNO055::VECTOR_EULER);

// クォータニオンを取得(必要ない場合は削除)
imu::Quaternion quat = bno.getQuat();

// オイラー角のx要素を取得(水平方向の回転角度)
dir = euler.x();

//以下略

解説

bno.getCalibration(&system, &gyro, &accel, &mag)

BNO055のキャリブレーション状況を取得する関数。引数にはuint8_tの変数のアドレスを4つ指定する。 順に「system(=方位センサ)」「gyro(=加速度センサ)」「accel(=?)」「mag(=地磁気センサ)」。 それぞれの変数に0-3の値がキャリブレーション状況によって格納される。 0: 未キャリブレーション 1,2: キャリブレーション中 3: キャリブレーション完了

BNO055にはEEPROMが含まれていないため、キャリブレーション値を保存できない。 そのため、電源投入時に毎回キャリブレーションをする必要があることに留意。

オススメの使い方

  • キャリブレーションが完了しているかどうかのフラグ変数をあらかじめ用意しておく(初めはfalse
  • 方位を取得するときにキャリブレーションが完了しているかを確認する
  • 完了していない∧フラグ変数がfalseだったら異常値(9999)のような値を方位として返す(この時に異常値にキャリブレーション状況も組み込めると使いやすい)
  • 完了したらフラグ変数をtrueにして取得した角度を返り値として出力

フラグ変数を使用することで、一度キャリブレーションが完了したら、試合中の急なキャリブレーションを抑制することができる。

実際のキャリブレーション時の注意

  • ロボットを回転させる前にハンドルが固定されているかを確認

固定されていないと最悪ロボットが宙を舞う...

  • ロボットを回転させた後、安定させるために置くのは**「コート上ではなく床」**

コート上だとほかのロボットの動きや人のもたれかかりなどで揺れが生じてキャリブレーションが完了しないため

  • キャリブレーションが完了した後にも±90度ぐらいは水平方向に回転させる

キャリブレーションが完了してからも値が少しの間は変動するため、安定するまで待機(約2-3s)

参考資料