----------------------------------------------------------------------
　　　　Interface2024年12月号
　　　　特集　Pythonで動かして学ぶ線形代数
　　　　第1章　重回帰分析を使った磁気センサ校正
　　　　第2章　慣性センサで姿勢推定実験
　　　　ダウンロード・データ
　　　　IF2412_chapter1_chapter2
　　　　Interface編集部
　　　　CQ出版(株)
　　　　公開：2024年10月25日
----------------------------------------------------------------------

====================================
ダウンロード・サービスご利用者各位
====================================
　毎度，小誌ご愛読を賜り，誠にありがとうございます．
　このたびはダウンロード・サービスをご利用いただき，誠にありがとうございます．
　筆者のご厚意により，本記事の関連データをこのアーカイブに収録しました．

================
概要
================
　このアーカイブには，表題の記事の中で作成したプログラム・ファイルやデータ・ファイルが収録されています．
　詳しくは該当記事を参照してください．
　アーカイブは，ZIP形式によって圧縮されています．

================
動作確認
================
　プログラムは筆者の元で動作を確認済みです．
　Windows11 , Raspberry Pi4 で確認しています. (Mac は未確認です.)
　但し、Raspberry Pi は環境設定によって、BLE通信が不安定でお勧めしません。
BLE通信ライブラリ bleak との相性によるものです. 

=================
アーカイブの内容
=================
1) imu_base : M5Stack ATOMS3 用のArduinoプログラム
       |--- imu_base.ino : 本体プログラム
       |--- NewMPU6886.h : 自作IMUライブラリ
       |--- NewMPU6886.cpp : 自作IMUライブラリ

2) imu_base_bin : M5Stack ATOMS3 用のコンパイル済バイナリファイル + 書き込みバッチファイル
       |--- imu_base.ino.bin
       |--- imu_base.ino.bootloader.bin
       |--- imu_base.ino.partitions.bin
       |--- boot_app0.bin
       |--- write.bat : 書き込みバッチファイル。環境により書き換えが必要。

3) acc_calibration : 加速度センサの校正用プロジェクト
       |--- BleUart.py : BLE通信ライブラリ
       |--- sample_one.py : 6軸慣性センサをサンプリングし、データをファイル保存する
       |--- fitting.py : ファイル保存された6軸慣性センサ出力データから、加速度センサを校正する
       |--- sample_one.npy : 筆者の機体でサンプリングしたデータ


4) case1_python
       |--- cq_quaternion.py : クオータニオン演算する独自開発ライブラリ
       |--- BleUart.py :  BLE通信 Nordic UARTサービスのデータ送受信する独自開発ライブラリ
       |--- sampling.py : 10秒間の6軸慣性センサをサンプリングしてファイル保存する
       |--- print_euler.py : ファイル保存されたデータから、オイラー角を表示する
       |--- sampling.npy : 筆者の実験でサンプリングしたデータ

5) case2_python
       |--- cq_quaternion.py : クオータニオン演算する独自開発ライブラリ
       |--- BleUart.py :  BLE通信 Nordic UARTサービスのデータ送受信する独自開発ライブラリ
       |--- real_rotation.py : 角速度センサのみを使った、リアルタイム姿勢表示プログラム
       |--- real_madgwick.py : Madgwickフィルタによるセンサフュージョン技術で、リアルタイム姿勢表示プログラム

=================
内容物の補足1) imu_base
=================
開発環境 :
	Arduino IDE 2.3.2
ボードマネージャ :
	M5Stack Arduino 2.0.7 (M5Stack-ATOMS3)
ライブラリマネージャ:
	NimBLE-Arduino 1.4.2
	NuS-NimBLE-Sereal 2.0.4

全ての作例で共通して使う、M5Stack ATOMS3 用のArduinoプログラムです。
ATOMS3 内蔵の 6軸慣性センサ  MPU6886 で取得したデータを、
BLE通信 Nordic UART Service でPCに無線送信します。
演算処理は、PC側で行います。

センサは 100Hz サンプリング周期で、1回のサンプリング12バイトのバイナリデータです。
データは 符号付 16bit リトルエンディアンで、6軸分のデータになります。
データ順は、x,y,z軸加速度、x,y,z角速度データの順番です。
加速度のレンジは±2gフルレンジで、角速度のレンジは±250度/secフルレンジです。

PCからの1バイト文字を受けて、データ取得モードを制御します。

1) ASCII文字 s : 1回だけデータ取得モード
　一回分の12バイトの6軸慣性センサ出力データを返します。

2) ASCII文字 b : 以降連続してデータ取得モード
　以降、100Hz 間隔でサンプリングされたデータを、連続して送り続けます。
ASCII文字 e を受けるまで続きます。M5Stack ATOMS3 のディスプレイ部の
ボタンを長押ししても、同じモードになります。

3) ASCII文字 e : 連続したデータ取得を停止して、スタンバイするモード
　前述のデータの連続送信を止めます。M5Stack ATOMS3 のディスプレイ部の
ボタンを長押ししても、同じモードになります。
　データ送信の最後に、全データが 0 の12バイトのデータを送ります。
終端データとしての識別に利用します。


=================
内容物の補足2) imu_base_bin
=================
　Arduino環境によるコンパイル済のバイナリです。Arduino環境構築が困難な場合は、
このバイナリファイル 4点を使って、M5Stack ATOM-S3 マイコンにプログラムを書き込みます。

　単独でインストール出来るツール esptool を別途インストールの上、直接マイコンに書き込みます。
windows PC を使った場合の、書込み用バッチファイルは、write.bat を参考にしてください。
--port オプションの COM番号は環境により異なりますので、書き換えます。
書込むバイナリファイルはコマンド後尾に記述されています。パスが異なる場合は、書き換えます。

=================
内容物の補足3) acc_calibration
=================
　M5Stack ATOM-S3 から 6軸慣性出力データをサンプリングして、データをファイル保存します。
　保存されたデータから、加速度センサを校正します。

A) M5Stack ATOM-S3 電源を投入します。
B) コンソールから、コマンド  python  sample_one.py  で、データサンプリングプログラムを起動します。
C) コンソールにプロンプトが現れます。リターンキーを押すと、その時点のデータが蓄積されます。
     M5Stack ATOM-S3 をまんべんなく回転させながら、静置状態で、データを多点取得します。
     取得終える時には、プロンプトに1文字以上キー入力した後、リターンキーを押します。
     sample_one.npy に numpy バイナリファイルが保存されます。
D) コンソールから、コマンド  python  fitting.py  で、校正結果を表示します。

加速度 [m/sec^2] = ゲイン x ( バイナリ値 - オフセット )


=================
内容物の補足4) case1_python
=================
　本文の実験1 「取得済データから機体のオイラー角表示」のプロジェクトファイルです。
10秒間の6軸慣性出力データをサンプリングして、データをファイル保存します。
サンプリング間隔は 10[msec] = 100[Hz] です。
　取得したデータを元に、オイラー角を表示します。

A) M5Stack ATOM-S3 電源を投入します。
B) M5Stack ATOM-S3 はディスプレイを上向きに、地表水平面に置きます。
C) コンソールから、コマンド  python  sampling.py  で、データサンプリングプログラムを起動します。
D) コンソールにプロンプトが現れます。リターン・キーを押すと、そこから10秒間データを取得します。
     最初は静置状態から動かし始めてください。リターン・キー押して一呼吸おいてから動かし始めます。
E) 取得データは、sampling.npy に numpyバイナリ形式で保存されます。
F) コンソールから、コマンド  python  print_euler.py  で、取得データからオイラー角を表示します。


=================
内容物の補足5) case2_python
=================
　本文の実験2) 「回転する機体の姿勢角をリアルタイムに表示」のプロジェクトファイルです。
リアルタイムに姿勢計算して、3Dグラフ上に機体の姿勢を表示し続けます。 M5Stack ATOM-S3
のディスプレイ部のボタンを長押しすると、表示が停止します。

A) M5Stack ATOM-S3 電源を投入します。
B) コンソールから、コマンド  python  real_rotation.py  と打ちます。
C) しばらく静置しておき、画面に3Dグラフが現れたら、M5Stack ATOM-S3 を自由に回転します。
     動きに応じて、3Dグラフがリアルタイムに表示されます。終了時には、ディスプレイ部のボタンを長押しします。
D) Madgwick フィルタの適用した版は、コマンド  python  real_madgwick.py  です。


※初期の姿勢は不問ですが、出来ればディスプレイを上向きにした、水平面に置いてください。
　 x, y 軸は最初の向きに固定されます。3Dグラフの向きと合わせたい場合は、グラフをマウス
　 ドラッグで軸回転させるか、初期の M5Stack ATOM-S3 の置き位置を回転させてください。

============
免責
============
(1)プログラムやデータの使用により，使用者に損失が生じたとしても，著作権者とＣＱ出版(株)は，その責任を負いません．
(2)プログラムやデータにバグや欠陥があったとしても，著作権者とＣＱ出版(株)は，修正や改良の義務を負いません．


===========
著作権
===========
　収録したプログラム，データおよびドキュメントなどの著作権は，各著作権者（すなわち筆者）にあります．
　Copyright (C) 2024　Tadashi Kato