센서 및 주변기기
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 |
| 표준 라이브러리만 해당 | 소켓, 구조체, 큐, 스레딩, 신호, 시간 |