【IMU】BNO085評価その1<UART-RVCモード超簡単で精度良い>

BNO085のAdafruitの解説で、UART-RVCモードをベタ褒めしているので、真っ先にやってみました。
回転治具で1回転で停止位置測定実験やったら、BNO055では10度以上軽くずれるのが、BNO085だと3-4度しかずれません。あきらかに、ドリフト特性も抑えられてますが、時間とともずれていくので、いずれは10度ずれると思いますが、3分間で10回転回してみても3-4度以内なので、私の使い方(RTKのHeading角でリセットする)なら1-2度以内で収められる感触をえました。
リスク覚悟で、DIGIKEYで2個買ったのは正解でした。=>あと数か月使ってみて最終結論だしますが、cevaの掃除機用センサ開発の過程紹介

※2024年4月追記   4か月間スキー滑走計測で使用した結果
BNO085のyaw角精度は、補正しても±5度程度なので、計測用途には向きません。VRゴーグルとかロボット制御など制御目的で作う用途なら、測定誤差を制御系で打ち消すことができると思います。スキー場で実験を繰り返した結果、スキー滑走での必要なyaw角度精度は、±0.6度程度が必要と結論を得たため、IMUでなくRTK MovingBase法(2点のアンテナ間の精密測量技術)で±1度未満の測定をすることにしました。装置が大きくなるのですが計測に必要な精度が得られないので、苦渋の判断でIMUは、補間用センサとして使うことにしました。

【STA24】BootsOn Yaw補正値とSkiOn Heading角との比較<要求精度±0.6度だった>

 

●UART-RVCモードとは
ロボット掃除機用のモードです。各社の掃除機のIMUとして、BNO085は採用されているみたいです。
掃除機メーカーの技術者さんが楽に実装できるようにCEVA社が工夫したモードです。
なんと、出力TX信号のみで、双方向通信は行いません。つまりユーザーは設定をしなくていいモードです。
ですので、ケーブルは、GND,3.3V,SDA(TX)の3本でよいです。
ジャンパP0を半田でショートさせるだけで、UART-RVCモードが走るので、それをSerial受信するだけです。
プログラムは、UART-RVCライブラリを使います。短いデータなので、ライブラリを使わなくても出来るはずです。
●ライブラリー無しのUART-RCVモードの受信方法
バイナリシリアル受信(Serial2.read())して、データを変換する方法は、バイナリーデータを符号付整数に変換するだけです。サンプルPgm  関数 int  bin2int(c0,c1)で変換します。データのヘッダーが0xaa,0xaaをとらえてデータ抽出します。全部で12バイトだけです。
https://gist.github.com/dj1711572002/db3793d7f604045e5dec4629babad413

●CEVA BNO085データシートの21ページに解説があります。
https://www.ceva-dsp.com/wp-content/uploads/2019/10/BNO080_085-Datasheet.pdf


●ArduinoIDE のプログラム
Adafruitの製品ページの随分下のほうにUART-RVCのまとまった解説があります。
https://learn.adafruit.com/adafruit-9-dof-orientation-imu-fusion-breakout-bno085
ライブラリは、#include “Adafruit_BNO08x_RVC.h”をライブラリーをインクルードでインストールできます。
UARTは、ESP32Dの16,17番ピンをSerial1.begin(115200,SERIAL_8N1,16,17);で宣言するだけです。

=>私のArduino ESP32のプログラムは、GISTにあります。BlueToothを使って送信してます。
データはyaw,pitch,rollの浮動小数点%4.2fの3個だけ、20msecで送信してます。
https://gist.github.com/dj1711572002/872715399d810dc6401a403c96edf77e

●私の配線
ボード本体に半田付けをできるだけしたくないので、ジャンパピンP0 1か所だけ半田載せました。

JST SHコネクタをアマゾンで買って、コンタクトの順序を黒赤黄黄で3番目の黄色にSDAを結線します。
テスタでGNDと3.3V間違わないように、何回もチェックします。逆刺しは一瞬でチップ破壊しますので
念には念をいれないといけません。高いチップほど、入念さが必要です。
JST-SHからJST-XHコネクタに変換して、ESP32Dの基板につないでます。ケーブルを短いのと長いのを用意して
実験によって切り替えるためにXHコネクタにしてあります。

●透明箱に実装
  BNO085は、VRゴーグル用に開発されたので、専用のモードが各種用意されてます。そこで、コンパクトな箱に電池付でBlueToothで送信できるように、オールインワンで実装しました。
側壁にBNO-085を貼り付けて、90度単位で姿勢を変えて実験できるようにしました。

通電すると青いLEDが光るので安心です。赤いLEDはESP32Dです。

●動作試験
①90度ずつ箱の姿勢回転
Z軸下向きで、90度ずつ回転させました。
2回回しみましたが、元の姿勢に1-2度以内で戻ってます。

②縦置き X軸下向きで、箱回転
少し反応がだらだらですが、元の位置に1-2度誤差で戻ってます。

③回転治具で、1回転させて静止位置測定を10回繰り返す 3分間くらい Z軸下向き
10回やっても4度しかズレません。しかし、ドリフトが続いているので、そのうち10度になります。
どこかで、リセットしてやる必要があります。掃除ロボットなら、充電ステーションに戻った時にリセットするのだと思います。私のスキーの場合は、左右ターンの間のニュートラルポイントでスキーの方位と合わせます。

④縦置き X軸下向きで1回転静止位置 10回繰り返し 3分間くらい
これも10回で3.3度と少ないドリフトでした。

●感想
BNO055とは雲泥の違いです。同じハードで、ファームを別物にすればここまで改善できるということです。
CEVA社は、用途に絞って、最適化する技術が優れているのではないでしょうか。
BOSCH社は大企業なので。用途絞って最適化するという仕事の仕方は不得意ではないかと思います。
ソフトウェア技術者というよりは、製品企画者の能力で、このような違いがでるのだと思います。
信州MAKERSが提唱しているモノづくりとコト作りのバランスを考えながら開発するということをやれば
用途が不明確な開発でピンぼけの結果をだすことがなくなるのではと考えて提唱してます。

●以後
BNO055と同時測定して、明らかな差をだしてみたいと思います。
モードがたくさんあるのですが、メーカーの技術者向けに用意されていて、なかなか大変そうです。
RVCモードで問題がなければ、このまま使っていたほうが楽でいいので、RVCでしばらくやってみます。

コメントを残す

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