センサーと周辺機器
メタクエスト 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; 古い Wi-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 |
| 標準ライブラリのみ | ソケット、構造体、キュー、スレッド、シグナル、時間 |