takashiskiのブログ

覚書の殴り書き

IMUのデータをBLE notifyで受けてCubeを回す

以下の記事の応用です。

takashiski.hatenablog.com

やってること

  • IMU(慣性計測装置)で姿勢(Quaternion)を求めてBluetoothモジュール経由でBLE notifyで投げる
  • BLEで飛んできた姿勢を受けてCubeに反映する

動画

  • 任意向きを正面とした回転ができるように変更

www.youtube.com

* 初期位置の北向きが正面になるらしく(今回の場合)、西向きなので正面が右になってしまっている

www.youtube.com

コード

github.com

Unity側

  • android8.0でのみ動作確認済み
  • Bluetooth LEを利用しているため、EditorやUnity remoteでは通信部の動作確認不可
  • ストアアセット"Bluetooth LE for tvOS, iOS, android"を利用

ESP32側

機材

  • Feather ESP32(ESP-WROOM-32)
    • LiPo用PH2端子と充電回路が載っている
    • Devkit-Cでも可
  • GY-BNO055(BNO055)
    • bno055が載っていればなんでもよい
    • 処理を書き換えれば別のIMU(MPU6050など)でも可能
  • ブレッドボード
  • ジャンパ線
  • LiPo電池
  • マスキングテープ(LiPoの簡易固定用)

開発環境

  • Arduino core for ESP32 WiFi chipsを使用
  • 導入は過去記事参照

github.com

takashiski.hatenablog.com

注意

  • ESP32にヒートシンクを追加するか、使用していないときは電源を落とすこと
    • BLEのadvertizeやnotifyが実行されたままだとESP32が発熱する
    • 冷えるまで動作が不安定になることがある

課題

[解決]姿勢の基本向き設定

  • 座標系がちょっと違う。今回はIMU:(x,y,z,w)->Unity:(x,z,y,-w)と変換した。
  • ある時点のIMUの逆回転を保存しておいて、最初に反映させると 、任意の向きを(0,0,0,1)にすることができる。 * 上記座標系変換をした場合、姿勢が北向き基準になる。
  • 単純に逆回転のQuaternionを掛ければ基準向き変えれるかな?と思ったけどうまくいかなかった。

IMU以外のデータ送信

  • ボタンのオンオフはbit立てることで実現できそう
  • 追加で数値送るのは厳しいかもしれない

データ送信長

  • BLE notifyの送信可能データ長はデフォルトが実質20octetsだそう。
  • Quaternionを送る場合は16octets占有されるのであと4octetsしか空きがない。
  • ネイティブコード側で設定を変更すれば拡張できそう
    • 送信時間長くなるから何か影響がある気がする...

https://qiita.com/hituziando/items/50c7ba7fb9f8917e1ebfqiita.com