はじめに
「角速度から回転行列を求める - 理論編」の続きです。前回は角速度から回転行列を求める方法を説明しました。今回はそれをC++で実装し、Processingで可視化していきます。
コード
スマートフォンの姿勢推定を行い、可視化するサンプルコードです。角速度から回転行列を求めるプログラムをC++で実装し、可視化をProcessingで行っています。角速度の収集はHASC Loggerというセンシングアプリを使う前提で実装してあります。スマートフォンとC++とProcessingはソケット通信を用いてデータをやりとりしています。
環境
macOS Catalina 10.15.7
Apple clang version 12.0.0
HASC Logger 1.5.7
Processingライブラリ UDP 0.1
準備
はじめにリポジトリをクローンします。
git clone https://github.com/yakiimo121/imu_simple_filter
demo.cpp
をコンパイルします。
cd imu_simple_filter/src/
g++ demo.cpp -o demo -std=c++11
Processingをインストールします。私は以下の記事を参考にさせていただきました。
また、ProcesssingにUDPのライブラリをインストールする必要があります。
Processingを起動して、スケッチ
-> ライブラリをインポート...
-> ライブラリを追加...
の順で進み、UDPをインストールしてください。
スマートフォンにHASC Loggerをインストールします。Apple Storeからインストールできます。2021/06/15現在、Android版がGoogle Playから消えているのでiOS端末でしか動作確認できません。
HASC Loggerの設定を行います。
HASC Loggerを起動します。New Log > Settingsで設定画面に行きます。
角速度をセンシングできるように設定します。サンプリングレートは任意ですが、今回は100Hzにします。
UDPでデータを送信する設定にします。
xxx.xxx.xxx.xxx
はホストのIPです。PORT番号は4001です。Use Hasc Log Formatをオンにしてください。
HASC Loggerの設定は以上です。
実行
スマートフォンから角速度を受信して、角速度から回転行列を求め、プロセッシングに回転行列を送信するデモ用のプログラムを実行します。
./demo
Processingを起動します。imu_simple_filter/visualize/visualize.pde
を実行してください。
Processingにスマートフォンの姿勢がリアルタイムで表示されます。
角速度を用いてスマートフォンの姿勢推定をしてみました。相補フィルターを使わないシンプルなアルゴリズムです。序盤は正確にトラッキングできていますが、時間とともにオフセット誤差が増加します。 pic.twitter.com/RdN5wB2nEm
— yakiimo121 (@yakiimo121) June 17, 2021
参考
- https://qiita.com/greatnekochan/items/010237ab3313757d0b0b
- https://nobita-rx7.hatenablog.com/entry/28514197
- https://github.com/arduino-libraries/MadgwickAHRS
- https://qiita.com/srs/items/c9286b5cff99e741b993
- https://nekodigi.hatenablog.com/entry/2019/10/31/%E3%80%909%E8%BB%B8%E3%82%BB%E3%83%B3%E3%82%B5%E3%83%BC%C3%97Processing%E3%80%91%E5%82%BE%E3%81%8D%E3%82%92Socket%E9%80%9A%E4%BF%A1%E3%81%A7%E9%A3%9B%E3%81%B0%E3%81%97%E3%81%A6%E3%80%81Processing