メタクエスト 3 VR テレオプ仕様

完全な技術リファレンス: UDP パケット スキーマ、フィールド タイプとバイト レイアウト、エンドツーエンドのレイテンシの内訳、主要な調整可能なパラメータ、および互換性のあるアーム仕様。

システム概要

ハードウェアとランタイム
ヘッドセット Meta Quest 3 (ハンドトラッキングモードが必要)
Unityのバージョン 2022.3 LTS以降・XR Handsパッケージ・OpenXRプラグイン
ホストランタイム Python 3.10+ (Linux または macOS、ROS は必要ありません)
ネットワーク要件 同じ LAN サブネット。 Wi-Fi6アクセスポイント推奨
右側の UDP ポート 8888
左側の UDP ポート 8889 (双方向制御のみ、それ以外は未使用)
パケットレート(送信側) Unity から ~50 Hz (Unity の固定更新ループ)
ロボットコマンドレート 30 Hz デフォルト (CONTROL_HZ 経由で設定可能)
プライマリ SDK (Piper) Piper_sdk · python-can · CAN over USB アダプター

UDPパケットスキーマ

各パケットは、固定長の 45 バイトのバイナリ メッセージです。 すべてのマルチバイトフィールドでは、 リトルエンディアン バイトオーダー。 最後に追加された不明なバイトは、上位互換性のために受信側によって無視されます。

バイナリ パケット レイアウト — 合計 45 バイト
分野 タイプ バイト 説明
ヘッダ uint8[4] 4 マジックバイト 0x52 0x43 0x54 0x50 — アスキー「RCTP」。 間違ったマジック値を持つパケットは通知なくドロップされます。
タイムスタンプ float64 8 団結 Time.realtimeSinceStartup 数秒で。 ジッタ測定に使用されます。 ロボットコントローラーでは解釈されません。
pos_x float32 4 エンドエフェクターの X 位置 (メートル単位)、VR ワールド フレーム (右回り、Y 上)。 mmロボットフレームに変換 transform_position().
pos_y float32 4 エンドエフェクターの Y 位置 (メートル単位)、VR ワールド フレーム。
pos_z float32 4 エンドエフェクターの Z 位置 (メートル単位)、VR ワールド フレーム。
rot_x、rot_y、rot_z、rot_w float32×4 16 VR ワールド フレーム内の単位四元数としてのエンドエフェクターの回転。 オイラー (ロール/ピッチ/ヨー) に変換 quat_to_euler() ロボット SDK に渡す前に。
グリッパー float32 4 グリッパーの開度: 0.0 = 完全に閉じた状態、 1.0 = 全開。 ピンチ強度から導出 VRGripperController.cs.
フラグ uint8 1 ビット 0: トラッキングが有効 (1 = 手が検出された)。 ビット 1: 緊急停止要求 (1 = オペレーターがメニューを押した)。 残りのビットは予約されています。

バイト オフセットの概要: ヘッダー 0 ~ 3、タイムスタンプ 4 ~ 11、pos_x 12 ~ 15、pos_y 16 ~ 19、pos_z 20 ~ 23、rot_x 24 ~ 27、rot_y 28 ~ 31、rot_z 32 ~ 35、rot_w 36 ~ 39、グリッパー 40 ~ 43、フラグ 44。

パイソン struct 解凍するためのフォーマット文字列:

輸入 struct

PACKET_MAGIC = b'\x52\x43\x54\x50'  # "RCTP"
PACKET_FMT   = '<4sdfffffffff f B'
#              ^  ^ ^^^^^^^^^^ ^ ^
#              |  | pos xyz    | flags (uint8)
#              |  timestamp   gripper (float32)
#              header (4 bytes)   rot xyzw (float32×4)

確かに parse_packet(data: bytes) -> dict | None:
    もし len(data) < struct.calcsize(PACKET_FMT):
        戻る None
    fields = struct.unpack_from(PACKET_FMT, data)
    header, ts, px, py, pz, rx, ry, rz, rw, gripper, flags = fields
    もし header != PACKET_MAGIC:
        戻る None
    戻る {
        「タイムスタンプ」: ts,
        "位置": (px, py, pz),
        "回転": (rx, ry, rz, rw),
        「グリッパー」:  gripper,
        "有効":    bool(flags & 0x01),
        "停止":    bool(flags & 0x02),
    }

エンドツーエンドの遅延

AgileX Piper アームを使用した Wi-Fi 6 LAN 上で、制御レート 30 Hz、速度制限 25% で測定。 値は典型的なものです。 実際の遅延は、Wi-Fi の状態とロボットのサーボ レートによって異なります。

~20ミリ秒
Quest 3 追跡パイプライン
Unity コールバックへの手姿勢センサーの融合
5 ミリ秒未満
UDPトランジット
Wi-Fi 6 LAN; 古い W​​i-Fi では最大 15 ミリ秒
2 ミリ秒未満
Python の解析とキュー
構造体のアンパック + キューの挿入
30~80ミリ秒
ロボットの軌道の実行
制限速度や移動距離によって異なります
一般的なエンドツーエンドの合計
Wi-Fi 6 LAN、25% 高速化 50~120ミリ秒
Wi-Fi 5 LAN、25% 高速化 80~150ミリ秒
ソフトウェア非常停止応答 (ビット 1 パス) 1 制御サイクル (30 Hz で約 33 ms)
トラッキングロス検出 即時 (現在のパケット内のフラグバイト)
遅延感を軽減するために、速度制限は控えめに保ちます。 主要な知覚遅延コンポーネントは、ロボットの軌道の実行です。 より低い SPEED_PERCENT 実際の往復時間が同じであっても、システムはより予測しやすくなります。 25% から開始し、モーションが完全に検証された後にのみ引き上げます。

主要な調整可能なパラメータ

Unity インスペクター (VRHandPoseSender)
位置オフセット (m) (0, 0, 0.3) — パイパーの開始点
回転オフセット (度) (0, 90, 0) — パイパーの開始点
スケールファクター 0.75 — 手の動きをパイパーのワークスペースに合わせてスケールします
ワークスペースXクランプ(mm) ±400 (パイパー); ±600 (xArm6)
ワークスペース Z クランプ (mm) 50 – 700 (パイパー); 0 – 900 (xArm6)
UDPターゲットポート 8888(右手) / 8889(左手)
Python サーバー (teleoperation_main.py)
CONTROL_HZ 30 Hz — ロボットのコマンドレート。 サーボレートに合わせる
QUEUE_MAXSIZE 3 — レシーバーとコントローラーのスレッド間でバッファリングされるフレーム
Piper_controller.py (AgileX パイパー)
SPEED_PERCENT 25% — 最大ジョイント速度部分。 徐々に上げる
X_MIN / X_MAX (mm) −400 / +400
Y_MIN / Y_MAX (mm) −400 / +400
Z_MIN / Z_MAX (mm) 50 / 700
GRIPPER_MAX_UM (μm) 70 000 — 70 mm の物理的開口部
SDK 位置単位 マイクロメートル (整数) — mm 値に 1 000 を掛けます。
SDKオリエンテーションユニット ミリ度 (整数) — 度の値を 1 000 で乗算します。
CANインターフェース can0 (デフォルト) — 実行前に can_activate.sh でアクティブ化します

SVRCでの互換性のあるアーム

アーム DOF SDK / インターフェース コントローラファイル 状態
アジャイルX パイパー 6 Piper_sdk · USB 経由の CAN piper_controller.py 本番環境に対応
オープンアーム 7 SocketCAN / ROS 2 MoveIt2 openarm_controller.py ベータ
DK1 バイマニュアルキット デュアル6 ポート 8888 + 8889 を同時に使用 dk1_controller.py ベータ
VLAI L1 デュアル6 ROS2ブリッジ・TCP/IP vlai_l1_controller.py 開発中

ソフトウェア要件

クエスト 3 / ユニティサイド
団結 2022.3 LTS 以降
XRハンズパッケージ com.unity.xr.hands ≥ 1.3
OpenXR プラグイン com.unity.xr.openxr ≥ 1.9
メタ XR SDK オプションですがパススルーに推奨
ハンドトラッキングモード Questシステム設定で有効化(移動追跡)
制御PC・Python側
パイソン 3.10以降(共用体型構文を使用)
パイパー_sdk pip install piper_sdk
Python-缶 pip install python-can
CANインターフェース USB - CAN アダプター。 でアクティブ化 can_activate.sh can0 1000000
標準ライブラリのみ ソケット、構造体、キュー、スレッド、シグナル、時間

テレオペの準備はできていますか?

セットアップ ガイドに戻って Quest 3 をロボット アームにストリーミングするか、完全な開発者リファレンスについては完全な Wiki をお読みください。