以下の記事の応用です。
やってること
- IMU(慣性計測装置)で姿勢(Quaternion)を求めてBluetoothモジュール経由でBLE notifyで投げる
- BLEで飛んできた姿勢を受けてCubeに反映する
動画
- 任意向きを正面とした回転ができるように変更
* 初期位置の北向きが正面になるらしく(今回の場合)、西向きなので正面が右になってしまっている
コード
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の簡易固定用)
HiLetgo ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード
- 出版社/メーカー: HiLetgo
- メディア: オフィス用品
- この商品を含むブログを見る
Funeshop GY-BNO055 BNO055 3軸加速度センサ + 3軸ジャイロスコープセンサ + 3軸地磁気センサモジュール 9軸センサ
- 出版社/メーカー: Funeshop
- メディア: エレクトロニクス
- この商品を含むブログを見る
開発環境
注意
- 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