STA23では、メインのセンシングは、GNSS RTK技術で位置精度±3cm 方角精度±1度でてます。
スキー板の絶対位置をBase(F9P)のRTKで基線長位置を求めます。
スキー板の姿勢をRover(F9PかF9H)のMovingBaseでmmオーダーの相対座標を求めます。
スキーの傾き(角付け角)は、IMUを使って脛のレガースの姿勢で、pitch,rollを求めます。
=>pitch rollは、精度が2度以内で出ているのですが、更に欲張ってIMUでyaw角が±3度以内になれば、Roverが不要になるので、システムが半分のサイズになるのでIMUでHeading角(yaw角)の精度がでるものを探してます。BNO055は、キャリブレーションのアルゴリズムの出来が悪い感じがします。使い勝手を十分評価して、アルゴリズムにフィードバックして改良すればいいのですが、BOSCH社でなくCEVA社が引き継いでファームを新規にした点で、BOSCHの担当エンジニアは残念だったろうと思います。
技術分野としては、デバイスのハード性能を改良するわけでなく、ユーザーの使い勝手に合わせたソフトウェア開発ですので、用途を絞って実験評価していくという開発ですので、大手企業でなくても出来る点で、BOSCH社でなく小回りのきくCEVA社のほうが適しているのかもしれません。
=>信州MAKERSでは、スキー板の方角の精度が±1度でRTK技術で計測しているので、IMUのyaw角の精度解析ができますが、一般ユーザーは、RTK MovingBaseシステムなど持ちようがないので、IMUのyaw角の精度解析は、
回転体にロータリーエンコーダーを取り付けて、エンコーダーの正確な角度とIMUのyaw角を比較解析しないといけませんので、精度検証をやりたい方は、ロータリーエンコーダーとIMUの同期システムを制作してください、
※2024年7月5日 RTK GPS基準で解析したyaw角補正結果 約±3.5度レンジ(2σレベル)で収まりました。これ以上安物IMUをいじっても改善は無理とあきらめました。
しかし、RTKで±1度を得るために7-8万円かけているので、4千円で±3.5度なら、BNO085は、コスパは良いと思います。BNO055は、20度とか突然狂うので論外でした。
=>いろいろPythonで補正して、最後にyaw角誤差の周期をローパスフィルターで潰して、誤差を減らしました。
データを解析するには、ExcelでなくPython のpandas,matplot,scipy,scikitlearnなど使わないと
良い結果が得られませんので、これからは、データ解析はPython使うことにしました。
【STA24】BNO085yaw角補正結局ローパスフィルタで潰した<力ずくで終わらせた>
※考察:NO085は、cortexーM0を搭載していると記憶してます。磁気センサの傾斜補正は、円近似計算しながら、補正していくので、演算速度厳しいモードになります。
ですので、速い傾斜運動があると演算が間に合わないのではないかと推測します。もっと高性能のCPUを積載していれば、時期傾斜補正の処理速度が上がると期待します。
●BNO055卒業して、Adafruit BNO085へ乗り換えます。評価結果下記に追加していきます。
◎3週間後の感想:
BNO055から乗り換えて良かった。使える精度なので、スキー計測システムに組み込むことにしました。
◎4か月後の状況 IMUはサブとします。
スキー滑走データをPython pandasとmatplotlibで解析してます。いろいろな滑走データをみてみると、へたくそな斜滑降でまっすぐで滑っているつもりでも数cm蛇行していることがわかりました。そのような滑り方を計測するためには、数cmの滑走軌跡の変動をセンシングできなければいけないということが判りました。スキー滑走での人間の操縦感覚は素晴らしく高精度のセンサで
制御をしているということだと思います。3σで±3cm精度がでるRTKだからこそ計測できる運動ですので、IMUは、RTKの補助として使っていく方針とします。とても、数度の誤差がでるIMU単独ではスキーヤーの感覚をセンシングしてくれないので、複数種類のセンサを組み合わせていかないと人間の感覚をセンシングできないと実感しました。
超高級IMUのメーカーのちらし見たら、1個100万円のIMUの凄さにRTKは負けてます。コストが5万円で勝ってますが。
2023/12/1【STA24】BNO085yaw回転精度をRTK Heading角基準で測定<2σで5度以内>
2023/11/23【IMU】BNO055とBNO085の繰り返し精度比較<ドリフト精度倍以上違う>
2023/11/22【IMU】BNO085評価その1<UART-RVCモード超簡単で精度良い>
※SparkfunにBNO086もあるのですが、DIGIKEYで扱いが無いので、今回はBNO085にしました。違いは、Interactive Calibration がついているかどうかです。
CEVAのファームは、年々進化しているので、待っていれば性能が良くなるのですが、いつまで待っているのかということになります。
※2023年11月追記 【IMU】BNO085は、BNO055のファーム改良品<Adafruit版BNO085ゲット>
安いMEMS IMUでもyaw精度±5度以内がでるはずですが、BNO055は、民生用IMUのyaw精度の相場である±5度以内が出ないので
bno-055のfirmが改良されたCEVAのBNo085を試します。
参考 https://www.analog.com/jp/thought-leadership/high-performance-inertial-sensing-solutions.html
。
=>静電気が原理のMEMSセンサは環境と経時ドリフトから逃げられないので、ファームで何とかするかの手段しかありません。
RTKは、動きに弱いのとかさばる欠点があるので、それを補完する目的でもう少しマシな手頃なMEMSセンサないのか探し続けてます。安物でハード性能は大差なくファームの差で良しあしが決まってくると思います。
VRトラッキング分野が市場が大きいので、その関連で、IMUの開発が進んでいるのを検索で知りました。VRトラッカーで検索してIMUさがしました。
BoschのセンサをCEVA社がFUSIONファームを開発してBNO08xの製品化しているそうです。
CEVA社の開発の進歩しだいで、IMUが良くなっていきます。 CEVA社
BNO055は、ダメで、BNO085のほうがマシだとのブログあります。BNO055のyaw精度が全然ダメなことは、体験済みなのでなので
BNO055は、人間の緩慢な動作用ですが、BNO08xシリーズは、VR用のIMUなので、Fusionでのドリフト対策もそれなりに出来ていると期待してます。
方角精度3.5-4.5度と記載されてるのは、BNO055と同レベルですが、急激な姿勢変化でBNO055が破綻するので、それが無ければラッキーです。cevaのロボット掃除機センサ開発の動画元々はhillcrest研究所というところが20年にわたって研究していたらしい
仕様書;Boschではなく、CEVAというメーカーですが、BoschからOEMしているメーカーです。BNO08xシリーズでまとめた仕様書です。
https://www.ceva-dsp.com/wp-content/uploads/2019/10/BNO080_085-Datasheet.pdf
未だ、あまり読んでませんが、磁気センサの周波数100Hzなので、BNO055の20Hzより相当良いです。
BNO086が今夏に発売されましたが、085と大差なく同じ仕様書です。Sparkfun製よりAdafruit製が安いです。これで、2024年もスキーと機械学習で遊べます。
●Adafruit BNO085との違い
こちらのページをご覧ください。【IMU】BNO085は、BNO055のファーム改良品<Adafruit版BNO085ゲット>
ハードが同じで、ファームを新規にしただけで、どれだけ変わるのか、楽しみです。
今週中に届くので、11月末までである程度わかると思います。
①Adafruit BNO085ボードHP
Adafruit 9-DOF Orientation IMU Fusion Breakout – BNO085
②CEVA社BNO08xシリーズチップ(SIP)のHP
https://www.ceva-dsp.com/product/bno-9-axis-imu/
CEVA社の紹介動画 世界の大手電子機器メーカーに納入しているみたいです。
https://youtu.be/WOWrXT_3ubk
③購入したDIGIKEYページ
DIGIKEY販売ページ https://www.digikey.jp/ja/products/detail/adafruit-industries-llc/4754/13426653
私は中国通販は使わないので、DIGIKEYへ2個発注しました。DIGIKEYは、6000円以上で、送料無料なので、2個買うと国内の電子部品通販より、円レートが150円/$でも30%も安く入手できます。関税もDIGIKEY負担なので、送料、関税無料で、製品価格のまま購入できて米国個人輸入のほうが安いし、UPSで4-5日で届くので、便利でお得です。
※2023年11月追記 IMUを機械学習させて、BNO055の訳の分からない現象を解明することのトライはじめました。
現象「回転治具で1回転(360度)回して停止させる実験をしていると、数回試行で、20度もくるって380度近くになってしまいます。」感触的には、1回転の回す速度とか加速によって、発生する現象のようなのですが。BNO055のどのパラメータが絡んで発生する現象なのか、複雑すぎてわからないまま6か月過ぎてます。そこで、回転治具1回転実験を機械学習させて、9軸の全パラメータと1回転での大きな誤差との相関を解析したいと思います。更に、IMUを使った機械学習で、スキーなど人間の運動をIMUで検出する新たなは活用方法も開発したいです。、Pythonを学習しながら、実験と論文調査してます。9軸のデータから、統計値を何種類もとって、機械学習で分類させることで、その人がどういう行動をしているか判定できるようになってます。スマホとかスマートウォッチに仕込まれているアルゴリズムの論文ありました。
【Python】IMUのScikit-Learn SVM分類ミスの解析<Pgmと論文学習>
この論文を参考にして、機械学習させたらIMUの振った方向の判別を賢くしてくれるようになりました。いろいろな動作のビッグデータとして集めれば性能の悪いIMUでも役立つかと思います。
【Python】IMU値を統計値にして機械学習させたら賢くなった<特徴量は分散が良い>
※BNO055のFUSION出力でいじってみたことの備忘録
①磁気センサを含めた9軸Fusionモード(NDOF)は、速度が20Hzしかでないし、磁気センサの精度悪くて、急なカーブを高速で走ると進行方向の方位が20度くらい狂います。
②水平状態で、電源オンして自動キャリブレーションされて、z軸(yaw)回転運動120度させてyaw角が120度付近でるのを確認した後に、z軸45度傾けて傾け軸周りの回転120度すると、yaw角が130~150度に狂います。傾け状態でキャリブレーションしても、120度回転が137度と大きくずれた値になって使えません。Euler出力でも、Quarternion出力でも NDOFモードでもIMUモードでもダメなので、キャリブレーション時に設定した座標変換アルゴリズムに欠陥があると思います。ちなみに、GYRO生データを台形積分すれば、120度近辺の値がでるので、BNO055のキャリブレーションとFUSIONのアルゴリズムがおかしいということだと思います。
③水平に近い姿勢から±30度程度のpitcht rollでゆっくりとした角速度変化で測定すると±5度以内でできますので、そういう用途向きです。BOSCHのパンフレットでも、人間の動作測定用と書いてありますので、乗り物など速度が速いものは無理っぽいです。
④>BNO055で信頼のおけるデータは、FUSIONを介さない普通の6軸IMUとしての出力ですので、FUSION付の意味が無いです。
⑤私のようなIMU初心者には、学習教材として良いモノで、FUSIONの出力の基礎学習に触りながら理解できる点で、優れた教材だと思います。しかし、スキー滑走の計測ではギリギリ使えるか使えないかの速度ですので、2024シーズンでGNSSで補正して使います。
※低価格MEMS IMU yaw角測定結論=>スマホ等で使われているMEMS IMUを9軸FUSIONアルゴリズムで使う場合、回転角速度が速くて変化が激しい場合yaw角が17度~23度くらいばらつくことがあります。これは、BNO055でもiPhoneでも同じです。数千円のMEMS IMUの実力みたいです10万円以上のMEMSセンサなら、yaw精度は±数度とかでます。
ということで、BNO055の磁気センサを使うことは止めて、6軸のIMUモードで、yaw角だけは、Gyroの角速度を積分して角度位置を得て、RTK式GPSの正確な方位角と比較しながら、使ってます。Gyroの積分値の誤差は、360度で±8度(3sigma)でます。yaw角補正は、GNSS RTK技術を使って±1度で測定してその値でBNO05のyaw角を補正して使います。回転治具による360度回転測定実験例
pitch,rollでは、十分精度がよいので、使えます。FUSIONアルゴリズムを過信しないことです。FUSION付IMUの解説記事
※効率の良い学習方法その1
基礎学習は、ExcelでGyro角速度台形積分した姿勢角から回転行列を代入して逆行列にしてオイラー角を得る体験が良いです。
BNO055のFUSION出力と自分の計算値を比較してみるといいです。オイラー角を追求するとハマるので、回転行列をいじって体験した、次にQuarternionの学習を始めたほうがいいです。Quarternionが世の中の主流の姿勢角表現方法なので、WEB検索で膨大な解説記事各種応用例がでてきて、プログラムもたくさんありますが、オイラー角での連続回転は、扱っている人が少なくしかも、間違い易くて素人には不向きです。
※2週間回転行列とオイラー角の基礎学習してみたのですが、ハマってしまって進まないので、転進してQuarternion学習に変更してみることにしました、いずれも素人の甘い学習ですので、完全な理解にはほど遠いですが、さわりだけでも手間が相当かかります。 結果として、回転行列とオイラー角で積の順序で迷っているより、Quarternionのほうが手っ取り早いし、判り易いと世間で言われている通りかもしれないと実感してます。しかし、回転行列は、全ての基本なので、知ってないとIMUの角度はいじれないので2週間は無駄ではなかったです。
【IMU】回転行列とオイラー角表現ハマった <JAXAの論文で学習し直し>
【IMU】回転座標変換の基礎学習開始その0<座標回転体験マクロ作った
【IMU】回転行列からオイラー角へ その1<回転方法で迷う>
月23日 BNO055のpitch roll値を音声で読み上げてくれるププログラム作りました。動画はこちら 結構 便利です。
●BNO055採用理由
pitchとrollだけなら、6軸のIMUでも、カルマンフィルター処理すればそこそこの精度で、姿勢角が得られます。
しかし、YAW角は、磁気センサと加速度、ジャイロセンサの9軸センサフュージョン計算をしないと、求められません。特に、磁気センサの傾斜補正が精度よくでないため、RTK MovingBaseを採用してきた経緯があります。
6か月後=>やはり、BNOの磁気センサFUSIONのyaw角が激しい運動でダメでした。多分、センサ座標から絶対座標への変換計算(FUSION)で、誤差が発生するのだと思います。センサ座標内ではそれなりの精度がでてました。そこで、センサ座標内で繰り返し誤差が安定しているGyro角速度を積分して使ってます。磁気センサを使うと20Hzまで遅くなりますが、Gyroを積分して使えば100Hzまで高速に使えます。Gyro積分での回転精度実験結果IMUモードに変更したほうが良いです。
。【STA23】BNO Gyro積分回転精度測定<IMUモードが良い>
磁気傾斜補正で失敗した記事(2020年1月)は下記です。
【L-RTK】IMU磁気方位センシング傾斜補正でこけた<スキーならRTK技術が有利>
※2023年8月9日 傾斜角度の精度検証と計算方法
【STA23】BNO055で傾斜角の精度確認<GravityからRoll-Pitch計算>
※2023年7月15日 私の用途はRTK基準でBNO055のyaw角はおまけなので何とか使えますが、BNOだけだと厳しいと感じました。
【STA23】Fusion付IMUよりMEMS性能の良いIMUが欲しい<AnalogDeviceの解説>
■RTK MovingBaseのおかげで、HEADING角精度±1度で、スキーの姿勢を得られて、正確な横滑り角を測定することができました。しかし、RTK MovingBase法だと、スキー場に行ってから、滑走測定するまでに1時間以上かかって準備しないといけませんので、システムが複雑で配線がからみあっていて、日常のスキー遊びに使うには、不適です。2023年からは、スキーアナライザでなく、実用的なスキートレーシングシステムを開発して、日常のスキー遊びでも楽しく使えるシステムを検討してます。
そこで、3年経過した今から、IMUの補正が全部入っているSensor FusionチップBNO055を採用して、
姿勢角のうちYAW方向がMovingBaseと比較してそこそこ使えるレベルになるかを実験することにしました。
センサFUSIONの各種フィルターのプログラムを動作させる手間を考えると、アルゴリズム内臓の
BNO055は御の字です。
※本記事から3週間後ようやくRTKシステムにBNO055を組み込みました。
相当苦労しました。記事はこちら
※2023年2月16日 スキー滑走を測定しました。
BNO055は、使えます。RTKよりは、最悪5度くらい外れている場合がありますが、普段は、1-2度で合ってました。その代り、RTKより小型で実装性が抜群に良いので、実用的です。詳細は記事をご覧ください。スキーには、BNO055おすすめです。
※2024年4月追記 4か月間スキー滑走計測でBNO085を使用した結果
BNO085のyaw角精度は、補正しても±5度程度なので、計測用途には向きません。VRゴーグルとかロボット制御など制御目的で作う用途なら、測定誤差を制御系で打ち消すことができると思います。スキー場で実験を繰り返した結果、スキー滑走での必要なyaw角度精度は、±0.6度程度が必要と結論を得たため、IMUでなくRTK MovingBase法(2点のアンテナ間の精密測量技術)で±1度未満の測定をすることにしました。装置が大きくなるのですが計測に必要な精度が得られないので、苦渋の判断でIMUは、補間用センサとして使うことにしました。
【STA24】BootsOn Yaw補正値とSkiOn Heading角との比較<要求精度±0.6度だった>
●高性能IMUの仕様比較しました。 個人では入手不可能なことも判りました。(軍事利用を防ぐため、メーカー側がリスク管理で顧客管理が厳しいです)
安物と高級品の差は、BIASにあります。ミサイルに搭載するようなIMUのBIAS性能は、桁違いで物凄いです。
【STA24】高性能IMUの仕様比較と仕様学習<個人では入手できない>
※2023年4月25日 BNO055のサンプリング方式をハードウェアタイマーにしたらハマりました。
正解は、内部タイマーでなく外付けタイマーを取り付けて、ピン割り込みでBNOを測定することでした。
何しろ、変換速度が遅いのが欠点で、ライブラリーのBNOの読み取り関数を一連で読むと5mecかかってしまうのでいろいろなことをやっているプログラムだと割り込みタイマーとよそのスレッドがぶつかって、変数化けしたり、データが飛んだりして大変なことになりました。無理やり内部タイマー使っても所詮マイコンのクロック精度の12ppm程度なので、30分も回せば、30-40msecズレてしまいますので、労多くして結果が良くないプログラムでした。
【STA23】BNO055測定 Interval Timerではまった<Priorityと現合調整>
外付けタイマーの威力が絶大です。
【パワーメーター2019】割り込みタイマー精度測定結果<TCXOは計測の必需品>
※2023年2月10日追記 RTKシステムに組み込んで、精度実験始めました。
とりあえず、RTKのYAW精度に対して、±2~3度で追従してます。
EULER角出力では、姿勢の制限があるので、QuarternionからEuler角を計算することで
制限がなくなって、高精度になりました。
【STA23】レガースに組み込んで試運転してみた<無事動作できた>
※2023年3月2日 追記、測定データを流れるグラフプログラムを作って、全データを眺めてみたら、静止状態が続いた後にBNO055のデータがドリフトすることを発見しました。
波形は、RTKの波形に似ているので、単純に下駄はいたドリフトでした。これは、自動キャリブレーションが静止時に働いて、ゼロ点が変化したからだと思います。そこで、プログラムで、補正をかけることにしました。スキーの場合、NUTRALポイント通過時点で、スキー板の方向と速度ベクトルの方向が一致するので、その瞬間にBNO055の角度の補正値を計算して、次のNUTRALポイントまでその補正値で角度を補正する方法です。これでやると、RTKの角度に対してで5度以内の誤差でおさまります。しかし、BNOのYAWは、5度以内の場合もあれば10度もずれてしまうことがありますので、RTKなしでは、使えないと感じてます。±1度のheading角精度を普通に得られるRTKは偉大です。関連記事はこちら
※2023年3月4日追記 スキーコースのフォールラインの求め方の検討で、RTKの強みがでました。
※3月11日追記 2回目のスキー場での測定で、BNO055ではFallLineが見れないことがわかりました。
やはりYAW角の精度が10度もずれる点で、全データがずれてしまっているのが課題です。
RTKで全データを補正できるか検討してみます。その間は、MovingBaseメインで測定していきます。
●秋月のAE-BNO055ーB0が手頃です。スキーで使うので2個買いました。
Adfruitなど海外製は、円安で非常に価格が上がっているので、国内在庫があるお店が安いです。
■一個壊してギリギリ修理した(ジャンパ小さすぎて半田付け難しい)
私の場合、推奨設定でつかわないでシリアル設定にするために、ジャンパ5をカットして、ジャンパ3に半田をのせて、シリアルで動作させようとしたのですが、いかんせん、AdafruitのライブラリーがI2Cのみだったので、ジャンパ5に半田でつないで、ジャンパ3の半田を除去しました。I2Cの初期動作を確認して本記事を書いて、いざ実装基板に組み込んだのですが、実装基板に半田付けする
時に半田ごてをジャンパ5に近づけてしまったらしく、ジャンパ5が不通になってました。この状態でI2Cを使うとSDAが2段階の電圧波形になって、I2Cが動作しない故障になってしまいました。壊したかと思って、4M変動をチェックして、ジャンパ5が不通になっていました。UEW線載せて引っ張ったらパッド自体が剥がれてしまいました。しょうがないので、回路図をみて、残った片側のパッドをGNDに結線して無事I2Cモードになって動作できました。
●組付け
①シリアルはやめたほうが良いらしい
届いたら、取説をみるとI2Cとシリアルが使えると書いてあるので、シリアルでやろうと思ったのですが、
シリアルだとライブラリーが無いし、安定動作しないというadafruitForumに解説があったので、I2Cにしました。https://forums.adafruit.com/viewtopic.php?f=25&t=186990
②I2C配線
秋月の基板は、I2C用電圧レベル変換チップFXMA2102LBXを使ってあって、プルアップもBNO055との間にR1R2でしてあるので、ユーザーがプルアップ抵抗を取り付けなくてもよくて便利です。
但し、Teensyの場合は、Teensy側にプルアップをつけないと安定動作しないというWEBコメントがあります。
私は、STA22用基板にプルアップがもともとついていたので、そのまま使いました。後で、プルアップ抵抗外したら、データサンプリングが歯抜けになってしまったので、Teensyでは、プルアップ必須です。
●ケーブルでハマった=>I2Cも40cm長になるとこけやすいです。
母艦からセンサFUSIONボードまで1本のケーブルにまとめて接続したのですが、なんとI2Cが動作不良になりました。シリアルRXTX+I2C2本+3.3v+GNDの6本を6芯のロボットケーブルにまとめて接続したら、
データ転送はしているのですが、ゼロデータになってしまいました。オシロで見ると、SDA波形が鈍ってました。そこで、シールド無しの4芯にして、I2C線だけだと正常に通信できましたが、不安定さがあって、時々データゼロになることがあるので、やはり、正しい使い方である片GNDにおとしたシールド線を使うことが必須です。シールドフリーにすると全然だめでした。
シールド付きの4芯でシールドフリーにしたら、時々不通が発生しました。シールドをGND線につないで浮かせた片シールドにすると正常に動作しました。T
TeensyのI2Cが速すぎるのではないかと思います。Adafruitライブラリーの設定からTeensyのI2Cが
他のCPUとは、違うためにシールド線まで気を使わないといけなくなります。
UARTなら混在していても問題ないのですが、I2Cは、クロックが速い分だけ、うるさいです。私は、そんなに速度いらない用途なので、シリアルで十分なのですが、I2Cしかライブラリが無かったから、I2Cにしたのですが、将来的にはBNO055もシリアル制御で動作させたほうが、システムが組みやすいと思います。
※注意:BNO055のAdafruitライブラリのフルパラメータの測定では、変換速度が5msecかかるので、測定時刻がその間ということで、センサとしては、時間精度が悪いです。加速度測定で、5msecも取得時間がかかっていては、使えない用途がたくさんあるので、BNO055の用途は遅い現象専用です。私の場合は、人間の運動なので、遅くてもよいですが、自動車、機械などの動作だと厳しいと思います。
③Arduino IDEでAdfruit BNO055libraryをインストール
スケッチ>ライブラリーのインクルード>ライブラリーの管理 WINDOWをだして
BNO055と入力すれば、しばらくすると3個くらいライブラリーがでてきますので、
Adfruit BNO055 をインストールします。今回は、ver1.6.1を使ってます。
●基礎知識
基本は、クオータニオン出力なのですが、学習して計算するのが面倒なので、ライブラリーが
計算してくれる結果だけいただくことにしました。
クォータニオンはWEBでたくさんありますが、なかなか簡単で分かりやすいのがないです。
その中でも、とっつきやすかったのは昔の文献
http://icb-lab.naist.jp/members/yoshi/ics_lecture/multi_media/3d_programming/Enter_the_3D_Programming.pdf
あとは、QIITAで現役のエンジニア様が解説している記事がたくさんあります。
https://qiita.com/search?q=%E3%82%AF%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%8B%E3%82%AA%E3%83%B3
姿勢角としてオイラー角について詳細に解説されているのは、スポーツセンシング社様で感謝です。
https://www.sports-sensing.com/brands/labss/motionmeasurement/motion_biomechanics/euler_angle_expression.html
●プログラム作り
注意)BNO055のオイラー角は、範囲の制限がpitch,rollにあって、それを外れると角度がでなくなってしまうらしいので、オイラー角は、使わないで、Quarternion出力からオイラー角を計算しないと正しいオイラー角が得られないことをこのサイト様が解説されています。非常に感謝です。
https://rokuen.work/bv/101/2017/06/
webserial_3d.inoというAdafruiteサンプルプログラムを使いました。そこから得られたQuarternion データを上記ブログ様の教えてくれた計算式を丸ごとコピペして使わせいただいて、Euler角を得る方法でプログラム組みました。void bnoread(int no)の中でやってます。GISTにあります。
https://gist.github.com/dj1711572002/a95b6944ce5ccb60faecd0a3edfcf9df
◆コピペしたQuarternionからEuler角への計算部分は下記です。各データはログ用に配列[no]にしてあります。
//Quartenion Copy from https://nobita-rx7.hatenablog.com/entry/27642606
imu::Quaternion quat = bno.getQuat();
qW[no]=(float)quat.w();
qX[no]=(float)quat.x();
qY[no]=(float)quat.y();
qZ[no]=(float)quat.z();
//time pulse millis
tst[no]=tp;
//Calc Euler from Quaternion
double w=qW[no];
double x=qX[no];
double y=qY[no];
double z=qZ[no];
double ysqr = y * y;
// roll (x-axis rotation)
double t0 = +2.0 * (w * x + y * z);
double t1 = +1.0 – 2.0 * (x * x + ysqr);
roll = atan2(t0, t1);
// pitch (y-axis rotation)
double t2 = +2.0 * (w * y – z * x);
t2 = t2 > 1.0 ? 1.0 : t2;
t2 = t2 < -1.0 ? -1.0 : t2;
pitch = asin(t2);
// yaw (z-axis rotation)
double t3 = +2.0 * (w * z + x * y);
double t4 = +1.0 – 2.0 * (ysqr + z * z);
//rad->deg
yaw = atan2(t3, t4);
roll *= 57.2957795131;
pitch *= 57.2957795131;
yaw *= 57.2957795131;
if(yaw<0)
{
yaw=360+yaw;
}
yaw=360-yaw;
//——————————
eX[no]=yaw;
eY[no]=pitch;
eZ[no]=roll;
●簡単に姿勢角をみたいので、3次元の姿勢角を出力してくれるプログラム例
(上記QurternionからEULER角計算ではなくBNO055のEULER角です)
ファイル>スケッチ例>カスタムライブラリーのスケッチ例(一番下)の
Adafruit BNO055>をクリックするとwebserial_3dがあります。
このプログラムのPrintを変更して、CPLTでグラフにするように改造したプログラムがこれです。
https://gist.github.com/dj1711572002/82216217b96c8abc2d62b5c6d122bf87
====================================
以下は、その後実験して精度に関するメモ書きです。
yaw角を使いたい場合注意が必要です。Fusionアルゴリズムは、ゆっくりした運動に使ったほうが
精度が良いです。運動が速くなって、急激な角速度変化が増えると精度が落ちてきます。
■yaw角を使う場合の注意:
datasheet の24ページに、Fusionモードの注意書きがあります。人間の動作専用に設定されたFusionアルゴリズムなので、高いGと高速回転運動の場合大きな誤差が発生する場合があります。私の実験では、遠心力G1.5G以上、角速度1000deg/sec以上になるとyaw角の誤差が大きくなります。おとなしい運動だと±5度以内ですが、上記の速い運動だと±20度以上に誤差が拡大されます。yaw角以外のpitch,roll,gyroなどは、速い運動と遅い運動でも大きな差はでません。yaw角だけは、おとなしい運動専用であることを注意すれば、便利に使えるセンサです。
。対策記事 yaw角の代わりにgyroの角速度を積分して角度変化とGPSデータから方位をもとめる方法を開発してます。 yaw角だけ何故悪いのかというと磁気センサを使って方位をだしてるからです。磁気センサが曲者です。
※2023年5月から回転治具でのBNO基礎評価 RTKの補間センサとして使う開発はじめました。
【STA23】往復運動でのRTK-IMUデータの観察1<headMot意味理解した>
【STA23】BNO Gyro積分回転精度測定<IMUモードが良い>
【STA23】BNO Yaw使わずにGyroで行く<50Hz補間>
【STA23】回転治具によるBNO055実験<停止位置iPhoneと比較> iphoneより若干悪い
【STA23】回転治具磁気エンコーダー位置精度その2<補間計算手間取った>
【STA23】磁気エンコーダ回転治具試運転その1<RTK精度良い、BNO劣る>
【STA23】BNO055回転データの統計処理方法<回転角を積算する>
【RTK23】回転治具でBNO055とRTK Heading角基礎実験その0<角度合わせ>
=>2023/6/21 追記 NDOFモードでのEulerのyaw角だけ精度が無茶苦茶悪いことが判明したので、yawは使わないで、GyroでRTKと組み合わせた方位角を得ることにしました。GYROの積分精度でさえyaw角のばらつきよりは小さい感触がありますので、磁気センサのFUSIONがいかに難しいかが分りました。yaw角のカルマンフィルターは、高角速度、高Gでは、ばらつきが非常に大きくなる感触があります。
■いろいろ調べてみると、海外でヨットのコンパスとしてBNO055を使っている方がAdafruitのForumで相談してますが、やはり20度くらいyaw角が狂うそうです。キャリブレーションが狂ってくるとか言ってます。小型のヨットの回転弧はR数mなので、センサにとっては、厳しいです。自動車のほうがR数百mなので、センサにとっては、優しいアプリになります。
イメージとして、横G1.5G以上で角速度1000dps以上の運動だとセンサFUSIONのyaw角が狂う感じです。
https://forums.adafruit.com/viewtopic.php?p=451389
■BOSCHのアルゴリズムが悪いのかと思い。iphoneと一緒に回転させてBNOの停止精度を比較測定しました。iPhoneのアプリでも停止位置ばらつきはは17度でますのでMEMSのIMU自体のyaw角精度は、こんな程度と思ったほうがいいです。pitch、rollは高精度で出るので、それらをメインで使うということです。
●RTK MovingBase法だとミリオーダーで相対位置精度がでるので、アンテナ間距離を1m以上にすればHEADING角度は、±1度未満の高精度になります。その高精度のRTKのHEADING角とBNO055のYAW角を比較実験をします。実験は、3月から5月にかけてスキー滑走実験で行います。データを収集して、夏までに、総合的な精度評価を行って、MovingBaseの代替としてBNO055をスキーのHEADING用途で使えることを立証できれば、本テーマは成功ということになります。
◆3回目のスキー測定状況:データをまとめてみました。右スキーのBNOは、RTK MovingBase Heading角と波形が似てます。左は全然なので、グラフ以前の話しで、何か理由がありそうです。似ているグラフはこちらでご覧ください。
◆2回目のスキー測定状況:右スキーBNOのシールド線を片GNDに落として、正常動作できました。右左スキー靴から脛にかけて縦置きでとりつけました。右と左でBNOの姿勢が90度回転した姿勢でとりつけました。結果は、右はRTKのHEADING角に追従してますが、左は全然違う波形になりました。何故こんなに差がでるのか、解析してみます。右側のデータならRTK MovingBaseの代替えに検討できるレベルでした。左側がなぜ悪いのか明確にします。
◆1回目のスキー測定状況:
左スキーのBNO055のYAW角は、5-10度範囲の精度で出ます。動きによっては、1-2度精度になったり、10度になったりTPOで精度が大きく異なりますので、使い方を工夫すれば、5度以内で使えるとおもいます。右スキーのBNOは、シールド線を片GNDに落としてなかったので、不安定でNGでした。
●キャリブレーション
通常の磁気センサだと、起動時に八の字を描いて、キャリブレーションしないといけないのですが
BOSCHのQUICK START GUIDEでもやはり八の字をやれと書いてありました。動画例
のように電源オン直後に、八の字で3回くらい振り回すとMagのkyライブレーション値が3となります。
3=フルキャリブレーションOK状態、2=センサーFUSION動作OK、1=8の字モーションが必要。
となってます。
※Calibrationについて仕様書に記述がありました。やはり動かさないとダメみたいです。
常時キャリブレーションが動いていて、データを蓄積しているアルゴリズムだそうです。
https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bno055-ds000.pdf
その代り起動時にセンサがむいてる方角を0度(360度)と定義してします。
実使用じには、RTKと方向角を補正しないといけません。
丁度、RTKのFIXと基線長解析時間と同じくらいで、キャリブレーションできるので、その結果を
RTKと補正してから本測定がはじめられます。
●YAW方角実験 方角は一定にして、センサの傾斜角を変化させた場合
磁気センサは、傾斜補正精度がネックになるので、そこをまず最初にみました。
戸建て古屋だと、地磁気の影響が少ないみたいで、室内こたつで実験ができました。RTKでは考えられない手軽さです。姿勢角の正確さは、なかなかだせないので、プラスチックケースにBNO055を貼り付けて、ケースの姿勢を縦と水平で90度ずつ変化させて、データをみてみました。
方向は、手前から奥の方向が現在の方角になります。
①電源オン 水平置き 方角は、手前向き
Orientation.x=-0.06度,y=-0.9度,z=-3.1度
②鉛直に立てた 方角は手前向きで同じで、z軸が90度傾斜した場合
Orientation.x=2.87度,y=2.375度,z=-91.17度
度2.87度xがずれてます。ケースの精度と置く精度があるので、全てセンサの誤差ではありません。
③方角を左斜め方向へ変えて、電源オンしなおした場合、
Orientation.x=359.75度,y=-0.812度,z=-2.5度
④ ③を垂直に立てた場合
Orientation.x=1.25度,y=?度,z=-2.8度
1度ずれた。
●結果
キャリブレーションをどうやって、管理するかが課題です。レガースを八の字に振り回すことにします。
姿勢差が90度変化してもYAW角が1-3度程度で収まっているのは優秀です。
ただし静的な実験なので、動的にはいろいろな振動成分を拾うので、どこまで精度がでるかですので
静的な精度最高精度とみれば、良くて、1-3度で、動的ならさらに悪化するのは、予想できます。
RTKの±1度には、追いつけませんが、3度以内に収まってくれれば、遊びで使う分には使えるのでは
と思います。
●以後
STA22システムに組み込んで、実際のスキー場で測定してRTKの進行方向データと比較してみます。