HaritoraX Wireless は Bluetooth を使って通信をします。その際、1 つの BD ドングルに対して 6 台のクライアントを接続し、100FPS でデータを送りつけるのでたとえ 6 台接続できたとしてもとても不安定になります。通信が不安定なだけならまだ問題はないのですが、Windows の Bluetooth 周りも巻き込んでおかしくなってしまうことが多いため使っていてあまり気分がいいものではありません。
また、HaritoraConfigurator 自体が落ちることもあるため安心して使えません。
ので、SlimeVR のトラッカーとして使えるようにブリッジを作ることにしました。
とりあえず中身を見たいので分解します。
SoC: nRF52832
IMU: BMI055
MAG: MMC5603NJ
BMIC: BQ25170
Windows ではBTPを使用することで、Bluetooth パケットをキャプチャして Wireshark で見れるようになります
UUID: ef84369a-90a9-11ed-a1eb-0242ac120002
ef844202-90a9-11ed-a1eb-0242ac120002
01 | 02 |
---|---|
FPS 50 | FPS 100 |
ef8443f6-90a9-11ed-a1eb-0242ac120002
00 | 01 |
---|---|
ToF OFF | ToF ON |
ef8445c2-90a9-11ed-a1eb-0242ac120002
05 | 08 |
---|---|
Type 1 | Type 2 |
ef84c300-90a9-11ed-a1eb-0242ac120002
00 | 01 |
---|---|
Bluetooth | Exclusive |
ef84c301-90a9-11ed-a1eb-0242ac120002
1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|
CHEST | KNEE L | Ankle L | KNEE R | Ankle R | HIP |
ef84c305-90a9-11ed-a1eb-0242ac120002
Default 1
None -> 0
true -> +1
true -> +2
true -> +4
UUID: 00dbec3a-90aa-11ed-a1eb-0242ac120002
00dbf1c6-90aa-11ed-a1eb-0242ac120002
14Bytes(ToF ありなら 16Bytes)のデータが送られてきます
LittleEndian です
Accel は 128 倍されています
1-2 | 3-4 | 5-6 | 7-8 | 9-10 | 11-12 | 13-14 | 15-16 |
---|---|---|---|---|---|---|---|
Rot X | Rot Y | Rot Z | Rot W | Acc X | Acc Y | Acc Z | ToF |
00dbf306-90aa-11ed-a1eb-0242ac120002
00dbf450-90aa-11ed-a1eb-0242ac120002
00dbf586-90aa-11ed-a1eb-0242ac120002
マルチプラットフォームで動作してほしいので、Rust で作ることにしました。
いい感じのマルチプラットフォームの Bluetooth ライブラリを探したところ、btleplugというものがありましたのでこれを使うことにしました
SlimeVR のパケットフォーマットはSlimeVR-Tracker-ESPを見て実装しました
電池残量をSlimeVRに送るとSteamVRにも送ってくれることが判明したので、XSOverrayの手首の表示から電池残量を確認することができるようになりました。嬉しい誤算です
SlimeVRにすることで補完処理が早くなったのか、本家HaritoraConfiguratorよりもキビキビと追従するようになりました
HaritoraX Wirelessからは重力を含んだ重力加速度計のデータが送られてきており、回転から重力加速度を計算してセンサーのデータから重力を除去し、加速度のみにする必要があります。数学をさぼってきたつけが回ってきました。
SlimeVRの姿勢推定が優秀なので回転のみでもほぼ問題なく使えますが、やっぱり加速度もほしいので、もうちょっとソフトウェアを改善していきたいです。
もうちょっとまともになったらオープンソースにしたいと思います。