👏

VRChatがOSCに対応したので、M5StackのUIFLowでライブラリなしのOSC通信してみた

2022/03/04に公開

前回

https://zenn.dev/tkyko13/articles/0c16ea15530e6e

VRChatでOSCが使えるまでの設定をしておきます

今回

Node.jsで同じPC内でVRChat内のアバターをジャンプさせることができましたが、今回はM5StackCore2でやりますので、必然的に別マシンから遠隔(同LAN内)操作になります

さらに、M5StackでOSC通信しようとするとArduinoでのプログラミングが必要になりますが、M5StackのUIFlowを使ってOSC通信を目指してみます

OSC通信のフォーマットとかもちょっと学べました

できた様子

Image from Gyazo

https://twitter.com/tkyko13/status/1497917716472426499

  • M5StackCore2の左ボタンでTrueを送り、ジャンプボタンを押し込んだような動作をさせ、アバターが実際にジャンプ
  • M5StackCore2の真ん中ボタンでFalseを送り、ジャンプボタンを離したような動作をさせることによって、もう一度ジャンプボタンを押して、ジャンプできるようにする(押し込んだまんまだともう一度押せないので)

UIFlow

Image from Gyazo

こんな感じです

別のマシンにOSC通信

同じLAN内で、別のマシン(今回の場合はVRChatが立ち上がっているWinPC)のIPアドレスを使います

OSCフォーマット

OSCは、UDPのSocket通信で送っているメッセージのルールということなので、UIFlow内のUDPのSocket通信でできました!

ですが、/, で区切るだけかと思いきや NULLコード(\u0000) やデータ型を示す TF も必要でした

Open Sound Control (OSC) 1.0 仕様 [日本語訳] http://veritas-vos-liberabit.com/trans/OSC/OSC-spec-1_0.html

他もいろいろさせてみる

  • ジャンプできた
    • udpsocket.send("/input/Jump\u0000,T")
    • udpsocket.send("/input/Jump\u0000,F")
    • TとFで開始と終了を送る
  • 拍手
    • VRChat内でできるClapという動作を当てはめてみる(ドキュメントにはないけど)
    • udpsocket.send("/input/Clap\u0000,T")
    • 動かず
  • 前進
    • udpsocket.send("/input/MoveForward\u0000,T")
    • udpsocket.send("/input/MoveForward\u0000,F")
    • 前進開始とストップができた!
  • Verticalで前進
    • udpsocket.send("/input/Vertical\u0000,i\u00001")
    • udpsocket.send("/input/Vertical\u0000,i\u0000-1")
    • 上記のジャンプと前進はドキュメントのカテゴリ的にはButtonsだが、これはAxesというカテゴリ
    • 前進はできて、止まらない… -1 が特殊なのかな
    • ちなみにNode.jsの 「node-osc」 を使って-1を送っても止まらず…てか止まっている状態から-1送ったら前進するという現象
    • 0を送っても止まらない

結果と今後

  • UIFlowで送信はなんとなくできそう
  • けど、今後逆にVRChatからのアバターの変更情報を受け取るときとかはもしかしたら面倒なのかも
  • UIFlowでMicroPythonのライブラリ使ってカスタムブロック作れないか調べていきたい
  • あわよくばUIFlowでVRChat用のカスタムブロック作っていきたい!

Discussion