본문으로 이동

02. VerseGrip 디스플레이

최초의 유선 VerseGrip에서 방향(쿼터니언 + 오일러 각도 Z-X-Y), 홀 센서 레벨 및 버튼 상태를 지속적으로 표시합니다.

이 강좌에서 배우게 될 내용:

  • 지침 읽기 quaternion 상태 트래임을 기반으로
  • 쿼터니언을 도 단위의 Z-X-Y 오일러 각도로 변환하기 (+X는 오른쪽, +Y는 앞쪽, +Z는 위쪽)
  • 사용하기 probe_orientation 자율 관측자의 유지 신호로서
  • 첫 번째 메시지에만 포함된 악수 모델 ( 튜토리얼 01의 것과 동일)

진행 과정​

  1. 다음으로 WebSocket 연결을 설정하십시오. ws://localhost:10001 그리고 첫 번째 상태 프레임까지 기다리세요.
  2. 다음 중 하나를 선택하십시오. device_id 표에 있는 최초의 유선 VerseGrip verse_grip.
  3. 다음과 함께 쿼리를 작성하세요. 세션 프로필 그리고 유지 신호 probe_orientation par appareil (상태 프레임 내에서 핸들의 방향 흐름을 유지하는 빈 객체 명령어).
  4. 요청을 전송한 후 해당 필드를 삭제하세요. session : 이는 일회성 악수입니다.
  5. 다음 프레임마다 쿼터니언을 오일러 각도로 변환하고, 제한된 주기로 텔레메트리 데이터를 표시하십시오. 매 사이클마다 유지 신호를 다시 전송하십시오.

매개변수​

Nom기본값역할
URIws://localhost:10001WebSocket 시뮬레이션 채널의 URL
PRINT_EVERY_MS100콘솔 화면의 재생 속도 제한
세션 프로필 이름co.haply.inverse.tutorials:print-verse-gripHaply Hub에서 이 시뮬레이션을 식별하세요.
오일러의 약정

변환은 매핑 좌표계 내에서의 Z-X-Y 내재적 회전(좌향 → 피치 → 롤)입니다. +X right, +Y forward, +Z up. 사용하지 마십시오 glm::eulerAngles : 이 함수는 다른 규칙을 따르기 때문에 여기에서는 잘못된 값을 반환할 것입니다. 세 가지 언어 버전 모두 동일한 계산을 구현하고 있습니다. 수식에 대해서는 소스 코드를 참조하십시오.

Quand probe_orientation 정말로 필요한가

probe_orientation 다음과 같은 경우에만 유용합니다. 아무것도 보내지 않는다 Inverse3 에 명령을 전송합니다. Inverse3 (힘, 위치, 토크 등)을 명령하면, 해당 서비스는 각 상태 프레임에 연관된 VerseGrip의 방향을 자동으로 전송합니다. 유지 신호는 필요하지 않습니다. 다음을 사용하십시오. probe_orientation 이 튜토리얼과 같이 독립형 핸들 추적 도구에만 해당됩니다.

가장 많이 읽힌 주 챔피언십 기사​

~부터 data.verse_grip[0].state :

  • orientation — quaternion (w, x, y, z)
  • hall — 홀 효과 센서의 정수값
  • button — booléen
  • transform.rotation — 작업 공간 회전 (quaternion) ; 위치 및 축척 정보는 방향 정보만 제공하는 기기에는 적용되지 않으며, 절대 전송되지 않습니다.
부분 업데이트의 의미론

transform.rotation 정체 쿼터니온과 같을 때는 생략된다. {w:1,x:0,y:0,z:0}. 읽기 작업에 기본값을 지정하십시오. 다음을 활성화하십시오. serialization/explicit_fields 이를 정기적으로 수신하려면.

발송 / 수신​

WebSocket 루프: 상태 프레임을 수신한 후, 핸드셰이크 및 유지 신호를 생성하여 반환합니다. probe_orientation. 첫 번째 송신 메시지에는 세션 프로필이 포함되며, 그 이후의 각 프레임에는 유지 신호만 포함됩니다.

고유 비동기 부클 : recv() → 주문 처리 → send() → 리허설.

async with websockets.connect(URI) as websocket:
while True:
msg = await websocket.recv()
data = json.loads(msg)

if first_message:
first_message = False
device_id = data["verse_grip"][0]["device_id"]
request_msg = {
"session": {"configure": {"profile": {
"name": "co.haply.inverse.tutorials:print-verse-grip"}}},
"verse_grip": [{
"device_id": device_id,
"commands": {"probe_orientation": {}} # empty — keepalive
}]
}

await websocket.send(json.dumps(request_msg))
request_msg.pop("session", None) # one-shot handshake

명령줄 옵션 (Python)​

Python 버전은 튜토리얼 01과 동일한 두 가지 옵션을 모두 지원합니다:

  • --full — 한 줄로 요약된 내용이 아닌, 원본 JSON 데이터를 읽기 쉬운 형식으로 표시합니다.
  • --query-config — 재주입 session.force_render_full_state 각 출력 사이클마다, 각 프레임이 해당 블록을 포함하도록 하기 위해 config (기기 유형, 펌웨어, 어셈블리 변환 등)을 상태 차이만 확인하는 대신 사용할 수 있습니다. 실시간으로 매개변수 변경 사항을 디버깅하는 데 유용합니다.

두 옵션은 함께 사용됩니다. C++ 변형에서는 이러한 옵션을 제공하지 않습니다.

SDK 설치 프로그램과 함께 제공됨

튜토리얼 02도 SDK와 함께 로컬에 설치되어 있습니다. 자세한 내용은 tutorials/02-haply-inverse-print-verse-grip/ 서비스 설치 디렉터리에서.

출처: Python · C++ · C++ Glaze

관련 항목: 유형 (쿼터니언) · 제어 명령 (probe_orientation) · WebSocket 프로토콜 · 튜토리얼 03 (무선 비디오 게임)