【VRChat】OSCを使ってフィットネスバイクとアバターの移動を連動させてみた
最近ダイエット中なので、楽しく運動しながら痩せる方法が無いかと思い、以前から興味のあったVRChatのOSCを使ってフィットネスバイクとアバターの移動を連動させてみたので、情報を整理してみる。
(動作確認レベルの備忘録)
必要なもの
フィットネスバイク(機種は何でも)
https://www.amazon.co.jp/dp/B079P8KWW2BLE対応のケイデンスセンサー(XOSS X1)
https://www.amazon.co.jp/dp/B0771KJ3H3
システム構成
ケイデンスセンサーからBLEで取得したペダルの回転数(rpm)をVRChatのアバターの移動速度(0~1)に変換してOSC経由でVRChatに送っています。
![](https://assets.st-note.com/img/1652764375341-9VZITw79fB.png?width=1200)
ケイデンスセンサーからペダルの回転数を取得する
フィットネスバイクのペダルの部分にケイデンスセンサー(XOSS X1)を付けることで、ペダル回転数のデータをBLE経由で取得出来るようになります。便利。
XOSS X1はBLEのCycling Speed and Cadenceというプロファイルに対応しています。
仕様については下記を参考にしました。
CSC Measurement characteristic(2A5B)は8bitのフラグと16bitのCumulative Crank Revolutions(回転数)と16bitのLast Crank Event Time(時間情報。単位は1/1024s)から構成されています。速度情報のフィールドもあるのですが今回は使わないので無視。
データを見たところ1~2回転する毎にデータを送信する仕組みになっているようです。
1分あたりのケイデンスは下記の計算式で取得可能です。送信されてくるデータは累積値なので前回のデータを記録しておいてその差分を取得する必要があります。
Cadence(rpm) = 60 * 1024 *(Difference in two successive Cumulative Crank Revolution values) / (Difference in two successive Last Crank Event Time values)
取得したデータをVRChatに送信する
OSCで/input/Verticalに-1~1の値をセットして送信することでVRChatのアバターの移動速度を変更することが可能です。OSCの利用のためにはVRChatのRボタンで表示されるメニューからOSCを有効化する必要があります。
ちなみに原因は不明ですが、0をセットするとアバターが止まらず前に移動するようなので、止めたい時は0.01などの0.1以下のデータをセットするようにしました。
OSCに関する情報はまだあまり無いのでVRChatの公式ドキュメントを頑張って読み解きました。今回はC#でプログラムを書いたので、VRCOscLibというライブラリを使いましたが、非常にお手軽でよかったです。
動作デモ
とりあえずケイデンスが0~1になるように適当に調整して動かしてみました。ひとまず動作確認出来たということで今はここまで。
VRChatのOSCを使ってフィットネスバイクをこいだ速度に応じてアバターが進むようにしてみた。これで無限に歩けるぞ(動画には映ってないけど水面下ではめっちゃこいでる) pic.twitter.com/38F6Bw3SWv
— ないん (@osa9) May 17, 2022
サンプルコード
とりあえず動作を確認したというレベルですが参考に下記に置いておきます。開発環境はVisual Studio 2019 Community + C#です。
https://gist.github.com/osa9/49e7512ee7640c1eaae410701d97fdfc
問題点とTODO
ケイデンス→速度の変換が割と適当(だけど何となくそれっぽく見える)
Cycling Speed and Cadenceで速度データが入ってくることを考慮していない
乗り物に乗ると前に進まない(恐らく乗り物の移動は/input/Verticalでの移動に対応していない気がする)
坂道などへの対応(まだ確認できていないですが、アバターのVerticalデータを取得することが出来れば上下移動などから加減速などの処理を入れられるかも)
この記事が気に入ったらサポートをしてみませんか?