Meta Quest 3 VR Teleop 사양

전체 기술 참조: UDP 패킷 스키마, 필드 유형 및 바이트 레이아웃, 종단 간 대기 시간 분석, 주요 조정 가능 매개변수 및 호환 가능한 암 사양.

시스템 개요

하드웨어 및 런타임
헤드폰 Meta Quest 3(손 추적 모드 필요)
유니티 버전 2022.3 LTS 이상 · XR Hands 패키지 · OpenXR 플러그인
호스트 런타임 Python 3.10+(Linux 또는 macOS, ROS 필요 없음)
네트워크 요구 사항 동일한 LAN 서브넷 Wi-Fi 6 액세스 포인트 권장
오른쪽 UDP 포트 8888
왼쪽 UDP 포트 8889(양측 제어만 해당, 그 외에는 사용되지 않음)
패킷 속도(발신자) Unity에서 ~50Hz(Unity의 고정 업데이트 루프)
로봇 명령 속도 30Hz 기본값(Control_HZ를 통해 구성 가능)
기본 SDK(파이퍼) Piper_sdk · python-can · USB 어댑터를 통한 CAN

UDP 패킷 스키마

각 패킷은 고정 길이의 45바이트 바이너리 메시지입니다. 모든 다중 바이트 필드는 다음을 사용합니다. 리틀 엔디안 바이트 순서. 끝에 추가된 알 수 없는 바이트는 이후 호환성을 위해 수신기에서 무시됩니다.

바이너리 패킷 레이아웃 - 총 45바이트
필드 유형 바이트 설명
헤더 uint8[4] 4 매직 바이트 0x52 0x43 0x54 0x50 — ASCII "RCTP". 잘못된 매직 값을 가진 패킷은 자동으로 삭제됩니다.
타임스탬프 float64 8 단일성 Time.realtimeSinceStartup 초 안에. 지터 측정에 사용됩니다. 로봇 컨트롤러에 의해 해석되지 않습니다.
pos_x float32 4 미터 단위의 엔드 이펙터 X 위치, VR 월드 프레임(오른손잡이, Y자 위). mm 로봇 프레임으로 변환 transform_position().
꽃다발 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   = '<4sdffffffff f B'
#              ^  ^ ^^^^^^^^^^ ^ ^
#              |  | pos xyz    | flags (uint8)
#              |  timestamp   gripper (float32)
#              header (4 bytes)   rot xyzw (float32×4)

데프 파싱_패킷(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에서 30Hz 제어 속도 및 25% 속도 제한으로 측정되었습니다. 값은 일반적입니다. 실제 대기 시간은 Wi-Fi 상태와 로봇 서보 속도에 따라 다릅니다.

~20ms
퀘스트 3 추적 파이프라인
Unity 콜백에 손 자세 센서 융합
<5ms
UDP 전송
Wi-Fi 6 LAN; 구형 Wi-Fi에서는 최대 15ms
<2ms
Python 구문 분석 및 큐
구조체 압축 풀기 + 대기열 삽입
30~80ms
로봇 궤적 실행
제한 속도와 이동 거리에 따라 다름
일반적인 총 종단 간
Wi-Fi 6 LAN, 25% 속도 50~120ms
Wi-Fi 5 LAN, 25% 속도 80~150ms
소프트웨어 비상 정지 응답(비트 1 경로) 1 제어 주기(30Hz에서 ~33ms)
추적 손실 감지 즉시(현재 패킷의 바이트에 플래그 지정)
대기 시간 느낌을 줄이려면 속도 제한을 보수적으로 유지하십시오. 지배적인 지각 대기 시간 구성 요소는 로봇 궤적 실행입니다. 더 낮은 SPEED_PERCENT 실제 왕복 시간이 비슷하더라도 시스템을 더 예측 가능하게 만듭니다. 25%에서 시작하여 모션이 완전히 검증된 후에만 올립니다.

주요 조정 가능 매개변수

Unity 인스펙터(VRHandPoseSender)
위치 오프셋(m) (0, 0, 0.3) — 파이퍼 시작점
회전 오프셋(도) (0, 90, 0) — 파이퍼 시작점
스케일 팩터 0.75 - Piper 작업 공간에 맞게 손 동작 크기 조정
작업공간 X 클램프(mm) ±400(파이퍼); ±600(xArm6)
작업공간 Z 클램프(mm) 50 – 700(파이퍼); 0 – 900(xArm6)
UDP 대상 포트 8888(오른손) / 8889(왼손)
Python 서버(teleoperation_main.py)
CONTROL_HZ 30Hz - 로봇 명령 속도; 서보 속도에 일치
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 – 70mm 물리적 개구부
SDK 위치 단위 마이크로미터(정수) - mm 값에 1,000을 곱합니다.
SDK 방향 단위 Millidegrees(정수) — 각도 값에 1,000을 곱합니다.
CAN 인터페이스 can0 (기본값) — 실행하기 전에 can_activate.sh로 활성화

SVRC의 호환 가능한 무기

DOF SDK/인터페이스 컨트롤러 파일 상태
AgileX 파이퍼 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 ROS 2 브리지 · 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 이상(Union 유형 구문 사용)
파이퍼_sdk pip install piper_sdk
파이썬 캔 pip install python-can
CAN 인터페이스 USB-CAN 어댑터; 으로 활성화됨 can_activate.sh can0 1000000
표준 라이브러리만 해당 소켓, 구조체, 큐, 스레딩, 신호, 시간

Teleop을 사용할 준비가 되셨나요?

Quest 3를 로봇 팔로 스트리밍하려면 설정 가이드로 돌아가거나 전체 개발자 참고 자료를 보려면 전체 Wiki를 읽어보세요.