【STA24】STAシステムへBNO085を組み込んだ<100Hzサンプリング>

BNO085 STAシステムに組み込みました。100Hzで姿勢角が出力できるので、そのままログできるようにプログラム改造しました。5か月ぶりにシステムプログラムいじるので、思い出すのに3日かかりました。
●苦労した点
BNO085の出力100Hzとなると、10msecなので、STA全システムのループを10msec周期に余裕を持たせて回さないといけません。実際は、4-6msecで回ってます。ログしてない時は、1msec以内でSerial受信検知ループしてます。
SDカード書き込み、BlueTooth送信、PC出力などやりながら、Base ,Rover,IMUのデータを受信する仕事があるので、Teensyの能力フルで使わないとできません。ESP32系では絶対できないシステムです。
ESP32系のシリアルは、別コアのバックグランドで動いてますが、WiFiとか無線もバックグランドで動いているので、プログラムが忙しくなるとシリアルがデータ落ちします。そもそもUARTが2本しかありません。

●BNO085 の100Hzデータ受信 UART-RCVモード
①周期が10msecでシステムループで間に合うか?
普通のI2CのIMUと違って、UART-RCVモードは、垂れ流しで送ってきます。ばらつくのでいつ入ってくるのか判りません。システムのメインループで、面倒をみているとデータ落ちしてしまうので、Teensy Hardwareシリアルで、解決できました。ハードバッファが自動的に受信してくれるので、RTKの120msec周期と10msecを独立して受信できます。BNO085の受信部分を備忘録しておきます。
①全部で19バイトを漏れなく読み込まないとバッファが空にならないから、要らないデータでも読み込む。
②ハードバッファサイズは256バイト確保してあるが、19バイトになったら、読み込むので、19バイトしか
使ってない。setup でhard serialのバッファを宣言しておきます。

static uint8_t serialbuffer5[256];//バッファは、static変数配列で宣言しておく。32byteの倍数で確保すること

//Serial3 def BNO085
Serial3.begin(115200);//Rx3(p15)- BNO085 UART-RVC mode
Serial3.addMemoryForRead(serialbuffer5, sizeof(serialbuffer5));//serialbuffer5のメモリーを 256byteバッファ指定

③RTKシステムの1周期120msecあるので、IMU周期10msecで12回分ため込むためにバッファ配列dBuf5[228]
を用意して12回分のデータを保持する。

//====================================================================================================
//===Serial3 BNO085 UART-RCV read=====================================================================
//====================================================================================================
//[0]0xaa,[1]0xaa,[2]index,[3]yawL,[4]yawM,[5]pitchL,[6]pitchM,[7]rollL,[8]roolM,[9]axL,
//[10]axM,[11]ayL,[12]ayM,[13]azL,[14]azM,[15]MI,[16]MR,[17]Rsv,[18]Chcksumif(Serial3.available()>19){ //10msecのデータセット19byte になったら読み込むuint8_t b0=Serial3.read();
uint8_t b1=Serial3.read();
uint8_t b2=Serial3.read();if(b0==0xaa && b1==0xaa)
{
int n=(bn85%12)*19;//0-228
dBuf5[0+n]=b0;
dBuf5[1+n]=b1;
dBuf5[2+n]=b2;
//Serial.printf(“%d,%x,%x,”,bn85%144,b0,b1);
for(i=0;i<16;i++)//12byteずつ読み込み格納12×1
{
dBuf5[i+n+3]=Serial3.read();}
bn85++;;
}//0xaa && 0xaa end}//if serial3.avaialble end
 

④10msecシリアル受信結果
120msecに一回、SDカードにログして、Bluetooth送信で、4-6msec食う場合があって、ロス時間がばらつきます。
ログルーチンを回って、戻ってきたときに、その間のIMUデータを保持しているか、チェックしてみました。
通常時は、[27745][27755] と10msec周期で正確に受信できてますが、[27775]が終わってからログルーチンに入るので
遅延時間が発生します。4-6msecですが、BNO085が正確に出力してくれる保証はありませんので、プログラムが知らない
間に送ってきたものをhardwareシリアルが受信してくれてあって、戻ってきてから一挙に読み込んでます。
[27775]から次にくるのは、[27785]ですが、遅延して[27797][27798][27806]とまとめて受信してます。
[297797]が[27785]のデータ、[27708]が[27795]のデータで消えずに保持されてます。

E8,FF,27,7,3D,3,77,FF,37,1,A1,3,0,0,0,F7,:[27745]
E8,FF,27,7,3D,3,77,FF,37,1,A1,3,0,0,0,F8,:[27755]
E8,FF,27,7,3D,3,77,FF,37,1,A1,3,0,0,0,F9,:[27765]
E8,FF,27,7,3D,3,7B,FF,37,1,A5,3,0,0,0,2,:[27775]BTMon:flagsB=0,pdop=4.79,hacc=126495,numSV=5,miscount=0,relN=0.00,relE=0.00,relD=0.00,relL=0.00
BTMon:mode=m,27796,gycount=0
E8,FF,27,7,3D,3,77,FF,37,1,A5,3,0,0,0,FF,:[27797]
E8,FF,27,7,3D,3,77,FF,37,1,A1,3,0,0,0,FC,:[27798]
E8,FF,27,7,3D,3,7B,FF,37,1,A1,3,0,0,0,1,:[27806]
E8,FF,27,7,3D,3,7B,FF,37,1,A1,3,0,0,0,2,:[27829]

●BlueToothログ結果
120msecに一回 [m]モニター行 [Base]RTKデータ
[BNy]yawデータ12個 [BNp]pitchデータ12個 [BNr]rollデータ12個
と100Hzデータのログができます。これで、RTKの粗い周期の補間ができそうです。


●以後
100Hz周期でログできたのですが、絶対時刻との合わせが必要なので、TimePulseとの同期をして
BNO085のデータにitow時刻を与える機能を追加します。
組込みが終わったら、バーにとりつけて、振り回して、RTK MovingBaseと角度比較実験します。

コメントを残す

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