255 Views
December 14, 25
スライド概要
ニソコンVRサミット(2025/12/13)開催の資料です。
アーカイブはこちらになります。
https://www.youtube.com/live/k8BLLA81tcY?si=dX-doxnO2eVM9UYt
ロボット&VRクリエーター #ロボトラ #ファイバリオン #だみとら
仮想と現実の接続点 2025/12/13 ニソコンVRサミットLT資料 みっちー Copyright ©2025, Micchy, All Right Reserved
自己紹介(みっちー) みっちー | Onomichi Hirokazu – 2004年からロボットをたくさん作っています – 2020年 勇者技術研究所でファイバリオン製作開始 – 2021年 仮想トラッカー だみとら/だみとら2開発 仮想トラッカー 「だみとら2」 ROBO-ONEの世界から、二足歩行ロボットにどっぷり 自宅のロボットの一部 Copyright ©2025, Micchy, All Right Reserved 下肢ロボット型姿勢入力デバイス 「だみとらコントローラー」 2025.12.13 ニソコンVRサミット in VRChat
VR Chatの仮想と現実の接続点 VR Chatと双方向に連動するロボット VR Chatアバター Unityのアニメーション機能で ステートマシンを製作可能 (任意のロジックを実装可能) ローカルPC 組込機器・ロボットとの通信 (我々の得意分野) Avatar OSC Debug.Logでリアルタイムに 変数を取得する黒魔術 VR Chatワールド MIDIのNote Onの18bitを束ねて、 リアルタイムに変数を共有する黒魔術 Live Streaming / String Loading / Image Loading C#ライクなU#言語で、プログラミング可能 近年VR Chatのワールドとクラウドサーバーの 連携APIも充実してきたので、遊び方(黒魔術)を模索中… Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
VRChatとロボットが連動するには… 双方向で、 通信するしかない! てっとりばやく、VRChatとロボットがシリアル通信出来ればいいよね。 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
シリアル通信とは… RS-232C (Dsub-9pin) 最近は省略されることが多いが 実は自作PCの取説を見ると M/Bに実装されていることも USB-RS232C変換機 注) USBもシリアル通信ですが、 本LTでは、RS-232CやUARTを用いた非同期シリアル通信を扱います。 PCの背面パネル Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
シリアル通信を実現させる方法 Debag Log Text Udon Serial com2 vrchat MIDI Copyright ©2025, Micchy, All Right Reserved ? なんでも繋ごう! 2025.12.13 ニソコンVRサミット in VRChat
実装事例)VRChat内のターミナルとRaspberryPiで通信 << VRChat内にハイパーターミナルを作りました。 踏み台にして、 クラウドとも通信可能 RS232C PCVR Copyright ©2025, Micchy, All Right Reserved Raspberry Pi 2025.12.13 ニソコンVRサミット in VRChat
シリアル通信を実現させる方法 (2) VRC World から外部への出力 Debag Log Text Udon Serial com2 vrchat MIDI (1) 外部からVRC Worldへの入力 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
シリアル通信を実現させる方法(1) Udon Serial com2 vrchat MIDI (1) 外部からVRC Worldへの入力 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
外部からWorldへのデータ入力 - MIDI • VRChatに送れるMIDIのイベント – NoteON – 鍵盤を押すイベント(チャンネル、強さ、音程) – NoteOFF – 鍵盤を離すイベント(チャンネル、強さ、音程) – Control Change -音量や音の性質などに関する制御 • 本来は、キーを押す・離すなので、交互に送るものだけれ ど・・・ – キニシナイ!漢は黙って、ひたすら ノォォォオトッ!オンッッ!! Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
MIDI (Note On)とは・・・ チャンネル 1-16(4bit) ベロシティ (音の強さ) 0-127 (7bit) ノートナンバー(音の高さ) 0-127 (7bit) MIDIのデータ (Note On) 18bit 音を伝送するための転送規格 • 音の種類(チャンネル) • 音の強さ • 音の高さ Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
MIDI (Note On)とは・・・ チャンネル 1-16(4bit) ノートナンバー(音の高さ) 0-127 (7bit) ベロシティ (音の強さ) 0-127 (7bit) MIDIのデータ (Note On) 18bit 音を伝送するための転送規格 • 音の種類(チャンネル) • 音の強さ • 音の高さ Copyright ©2025, Micchy, All Right Reserved 18bitのデータ 2025.12.13 ニソコンVRサミット in VRChat
MIDI (Note On) を使ってデータを送る… チャンネル 1-16(4bit) ベロシティ (音の強さ) 0-127 (7bit) ノートナンバー(音の高さ) 0-127 (7bit) MIDIのデータ (Note On) 18bit もったいないケド、 18bitの一部を8bitのデータとして使う 8bitのデータ Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
外部からデータ(1byte)を受信出来た! 8bitのデータ Udon Serial com2 vrchat デコード MIDI-> 1byte エンコード 1byte -> MIDI 仮想MIDIドライバ loopMIDI Copyright ©2025, Micchy, All Right Reserved 1byte 2025.12.13 ニソコンVRサミット in VRChat
シリアル通信を実現させる方法(2) (2) VRC World から外部への出力 Debag Log Text Udon Serial Copyright ©2025, Micchy, All Right Reserved com2 vrchat 2025.12.13 ニソコンVRサミット in VRChat
VRChatのログを読み取る • VRChatログの場所 – C:¥Users¥(ユーザー名)¥AppData¥LocalLow¥ VRChat¥VRChat¥output_log_XX-XX-XX.txt • リードオンリーでファイルオープンすれば、リアルタイムにパー ス可能 Worldにjoinする度に、新しいログが生成される。 更新時間が一番新しいものが現行のログ Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
VRChatのログに情報を書き出す • “Hello World”を出力するには… • 16進数に変換 1byte = 8 bit : 0-255 => 00-FF で表現可能 H e l l o (スペース) W o r l d (復帰) (改行) 48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a • 48 65 6c 6c 6f 20 57 6f 72 6c 64 0d 0a • 前後に区切り文字をつけて、 Debug.Log関数で出力! – OUTPUT_DATA[48656C6C6F20576F726C640D0A] – アスキーだけじゃなく、バイナリも転送可能 (0x00-0xFF なんでも送れる) Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
VRChatのログに書き出されたデータ • 実際のログの様子 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
外部へデータを送信出来た! Debag Log Text Udon Serial com2 vrchat DATA 外部プログラム[com2vrchat]で再度デコード • • • • Copyright ©2025, Micchy, All Right Reserved OUTPUT_DATA[]を見つけ出す 中身を抜き出す 16進数をバイナリに変換 変換済みのバイナリを仮想COMポートに流す 2025.12.13 ニソコンVRサミット in VRChat
外部へデータ送信の応用例 Copyright ©2025, Micchy, All Right Reserved VRC ロボット 2025.12.13 ニソコンVRサミット in VRChat
Udon Serial - Arduinoライクな関数実装 Arduino のSerial準拠 • Serial_write(byte send_data) – 1byte送信 • Serial_print(string send_data) – 文字列送信 • Serial_println(string send_data) – 文字列送信(改行付き) • bool Serial_available() – 受信バッファの確認 • byte Serial_read() – 1byteデータ受信 • byte Serial_peek() – 1byteデータ受信 • void Serial_flush() – 受信バッファクリア Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
Udon Serial - Arduinoライクな関数実装 • 受信データをそのままループバックするUdonのサンプル コード Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
GitHub公開してます。 • Udon Serial https://github.com/dreamdrive/UdonSerial Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
課題 • MIDIドライバ(loopMIDI)や、場合によって仮想シリアルドライバ com0comに加え、com2vrchatなど、周りに用意するものが多く準 備に手間がかかる – MIDIドライバを書けるようになって組み込みたい… • 現状、ソースコードしか公開してないのでpythonが読める人しか 対象になってない – com2vrchatは自動でログを検出して、GUIで操作できるようにします。 • World OSCが来たらたぶん用済みになる \(>o<)/ • 現状、18bitを8bitしか使ってなかったり、バイナリにエンコードして いたり、ちょっともったいない仕様 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
課題 • MIDIドライバ(loopMIDI)や、場合によって仮想シリアルドライバ com0comに加え、com2vrchatなど、周りに用意するものが多く準 備に手間がかかる – MIDIドライバを書けるようになって組み込みたい… • 現状、ソースコードしか公開してないのでpythonが読める人しか 対象になってない – com2vrchatは自動でログを検出して、GUIで操作できるようにします。 • World OSCが来たらたぶん用済みになる \(>o<)/ • 現状、18bitを8bitしか使ってなかったり、バイナリにエンコードして いたり、ちょっともったいない仕様 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
さらに効率化のために① チャンネル 1-16(4bit) ノートナンバー(音の高さ) 0-127 (7bit) ベロシティ (音の強さ) 0-127 (7bit) MIDIのデータ (Note On) 18bit 音を伝送するための転送規格 • 音の種類(チャンネル) • 音の強さ • 音の高さ Copyright ©2025, Micchy, All Right Reserved 18bitのデータ 2025.12.13 ニソコンVRサミット in VRChat
サーボモーターの分解能とbit数 R社 角度 : 0~360度を 0~4098で表す。 F社 角度 : 0.0~360.0度を 0~3600で表す。 (ホビーロボットに置いては、) 角度のデータは 12bit あればOK Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
MIDIを角度データのメモリマップとして扱う チャンネル 1-16(4bit) ノートナンバー(音の高さ) 0-127 (7bit) ベロシティ (音の強さ) 0-127 (7bit) MIDIのデータ (Note On) 18bit アドレス部 6bit データ部 12bit 64個の12bitの型の変数テーブル(メモリマップ)として見ることが出来る! (64音で同期可能) Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
ROSからVRChatにリアルタイムで動作を流し込む Udon(MIDI)を用いた方法 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
ニソコンVRとROBO-ONEを繋いだ、実証実験! VRC ← ロボット 2022/09/25 第41回 ROBO-ONE(神奈川県)にて、実証実験デモンストレーション 現実世界のロボットを動かすと、VRChat内のロボットが連動して動くデモ VRホビロボ集会合作! Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
ちなみに・・・MIDIでのデータ転送レート • MIDI 1音で3byte • MIDIの規格上の通信速度は31.25Kbps = 3,906Byte/sec = 1302音/sec • Udonの実行周期は50Hz、1フレーム(1/50)に21音(実測) • 50Hz x 21音 x 3byte = 3150Byte/sec < 3906 • 実測で、だいたいスペックに近い速度は出ている (みっちー調べ) • ただし、Udonの同期が上限約115200bps (VRChat仕様)のため、 MIDIよりワールド同期の方がボトルネック Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
さらに効率化のために② • ログに流し込むデータをバイナリではなくJSONにしました。 JSON形式にすることで、汎用のJSONパーサーが使える Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
外部へデータ送信(JSON対応)の応用例 Copyright ©2025, Micchy, All Right Reserved VRC ロボット 2025.12.13 ニソコンVRサミット in VRChat
その他、外部信号をVRChatにリアルタイム入力 • VRChatのアバターを外部からリアルタイムで制御する方法 – トラッカーの制御(アバター) 1. OpenVRによるトラッカー座標のオーバーライド – NullドライバーによるHMDの座標オーバーライドも可能 – ただし、コントローラーでのUI操作の課題 2. OSCトラッカーによる方法 – HMDは制御の対象外 × – ワールドのアバター(オブジェクト)の制御 3. Udon = MIDIによる流し込み 4. 映像のストリーミングに情報を載せて (Shader Motion) Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
だみとら2 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
VMT(OpenVR)による仮想トラッカーでの流し込み 対戦するロボット2体の情報をアバターに乗せて、トラッキング情報として流し込むアイディアも・・・ ただ、データの帯域としては、実は1アバターあたり数kbps程度という話 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
EX) Shaderを使って外界にアウトプットする方法 (ROSとVRChatを繋ぐ さらに強力な武器) • HapticsReciverSample (hheaven氏) – アバターに仕込んだカメラを使い、 対象レイヤーのオブジェクトまでの深度をシェーダーでVRCウィン ドウにoutput – https://github.com/hheaven/HapticsReciverSample • Shader Motion (lox9973氏) – ボーンの位置・姿勢情報をシェーダーでVRCウィンドウにoutput – https://gitlab.com/lox9973/ShaderMotion Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
Shaderを使って出力した情報 ROSに持ち込む • 実際に作ったもの紹介 – VRC : 手と胴体に仕込んだカメラで接触判定、深度を画面上に 表示 – Web Server : 情報をウィンドウキャプチャし、httpで垂れ流し – ROS : WebSocketで受け取った情報をROS messageに変換 • もっと複雑な情報、座標や姿勢など リアルタイムで大量のデータを送るならShaderが有利 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
Shaderを使って出力した情報 ROSに持ち込む • 実際に作ったもの紹介 – VRC : 手と胴体に仕込んだカメラで接触判定、深度を画面上に 表示 – Web Server : 情報をウィンドウキャプチャし、httpで垂れ流し – ROS : WebSocketで受け取った情報をROS messageに変換 • もっと複雑な情報、座標や姿勢など リアルタイムで大量のデータを送るならShaderが有利 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
ShaderMotion 概要 エンコード Shader アバター Transform Udon オーバーレイ デコード テクスチャ Shader アバター(オブジェクト) エンコード側をVRChat内ではなく、Unity上で実施することで、ローカルのAIで動かすボーン情報をVRChat内に送り込める Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
ShaderMotionで送れる情報量 デフォルトでは、アバター(パペット) 2体分の姿勢と、 1632x1080pxの映像を送れる Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
ShaderMotionで送れる情報量 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
ShaderMotionで送れる情報量 1マス= 24x24px 1080p = 3600マス x 3byte = 10,800 byte/フレーム 10800byte x 30fps = 324kbps • 1体分のパペットの情報 = 6*45マス = 270マス • 270x 3 byte = 810byte/avatar 最大情報量 • 13アバター(3,510マス) • 残り2列= 90マスx 3 byte =270byte(演出用として確保できる) Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
フレンドにVRChat越しに遠隔で操縦してもらう様子 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
フレンドにVRChat越しに遠隔で操縦してもらう様子 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
それぞれ特徴 • Shader Motionは、配信による遅延が発生する • VMTは、UIの操作が大変なので運用に難あり • アバターであることを求めなければ、MIDIで動かすのがお勧め • 相手がアバターであると認識させるならVMT 遅延 同期 データレート 運用 形式 音声との同期 〇 動画で共有 324kbps △ OBS必要 ワールド オブジェクト ◎ ローカルは30kbps Udon同期は11.5Kbps △ LoopMIDI 必要 ワールド オブジェクト △ △ ドライバセット アップ必要 アバター 〇 Shader Motion △ 2~3sec MIDI 〇 △ Udon Sync 〇 △ アバターの同期と同じ VMT Copyright ©2025, Micchy, All Right Reserved 数kbps 2025.12.13 ニソコンVRサミット in VRChat
今後のニソコンVRを検討する… (by みっちー) • Articulation Body非対応の現状で、 VRChatでのシミュレーションは難しい • 外部にシミュレーション環境を構築して、INとOUTをVRChatに 繋ぐのが良さそう (そもそも、VRChatにこだわるか否かという議論もあってもよ いが、それは今回は割愛) • シミュレーション環境どうする? Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
今後のニソコンVRを検討する… (by みっちー) コントローラーの操作をDebug.LOGでJSON出力 (ユーザー間はUdonで同期) ※ シミュレーター実行ユーザーには公平でない ニソコンVR シミュレーター (MuJoCo?) TopazChat OBS 各ユーザー公平に配信 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
今後のニソコンVRを検討する… (by みっちー) Virtual Reality Music Festival https://x.com/VRMF_info ボクセル情報とテクスチャ情報を、1画面にエンコードして動画配信、3D情報としてVRChat内でデコードする 複数インスタンスで同時に視聴可能なVRライブ これをMujocoで実現することも可能かも。 Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat
今後のニソコンVRを検討する… (by みっちー) • VRC World API – String Loading • GitHub等一部ホワイトリストのWebから文字列を取ってくることができる • 制限:GET しかできない • ロボットの形状データなどをwebに保存して、ワールド内で再構築できそう – Image Loading • Webから画像を取得できる • ロボットのテクスチャなどをwebに保存して、ワールド内で再構築できそう Copyright ©2025, Micchy, All Right Reserved 2025.12.13 ニソコンVRサミット in VRChat