본문으로 바로 가기

09. WebSocket Workspace-Navigator

다음으로 이동하세요 장치의 작업 공간 내 위치 실시간 표시, 다음을 통해 set_transform-웹소켓 채널을 통해 명령을 스트리밍합니다. 이 튜토리얼에서는 HTTP를 사용하여 세션과 기기를 식별합니다(마찬가지로 튜토리얼 08), 그 후 웹소켓 연결을 열어 매 틱마다 포지션 업데이트를 전송합니다.

이 그림은 두 가지 변환 연산 간의 차이를 보여줍니다:

작전튜토리얼일반적인 용도
configure.mount — 지속적 마운트 변환08장치의 물리적 조립 과정을 설명하기 위해 한 번(또는 드물게) 적용합니다.
set_transform — 지속적인 작업 공간 변환09 (이번)이 역시 지속적이지만, 워크스페이스 내 실시간 탐색을 위해 매 틱마다 스트리밍될 수 있습니다.

두 명령 모두 HTTP와 WebSocket을 통해 사용할 수 있으며, 둘 다 지속적인 — 이 서비스는 가장 최근에 전송된 값을 기억합니다. 차이점은 용도와 갱신 빈도에 있습니다: configure.mount 드문 업데이트에 최적화되어 있습니다(물리적 구성), 반면 set_transform 고주파수 스트리밍(장면 이동)에 최적화되어 있습니다.

다음과 같이 사용하십시오 set_transform, 워크스페이스의 기점이 런타임 중에 변경되는 크기(예: 손, 애니메이션이 적용된 절차적 오프셋, 또는 가상 워크스페이스를 실시간으로 이동시키는 조작자 등)를 따라가야 하는 경우.

Mount와 Workspace는 계층적으로 연결되어 있습니다.

그 자체로 보면 configure.mount 그리고 set_transform 같은 효과를 내기는 하지만, 이들은 계층적으로 연결된: 작업 공간 변환은 좌표 파이프라인에서 auf den Mount에 적용됨 (device → basis → mount → workspace → application). 전체 파이프라인은 다음에서 확인하실 수 있습니다. 마운트 및 작업 공간.

사용 사례​

  • 작업 공간 내 실시간 내비게이션. 햅틱 장면을 일시 정지하지 않고도 장치의 커서 작업 공간(엔드 이펙터가 도달할 수 있는 경계 영역)을 이동할 수 있습니다.
  • 사용자 제어 정렬. 햅틱 메인 애플리케이션이 실행 중인 동안, 두 번째 터미널에서 한 사람이 화살표 키를 길게 눌러 작업 공간을 이동하도록 하세요. 이는 세션이 진행 중일 때 해당 작업 공간에서 보정을 수행하는 데 유용합니다.
  • 프로시저럴 워크스페이스 이동. 각 틱마다 순수한 위치 변환 패치를 전송하여 스크립트 내에서 워크스페이스 위치를 제어할 수 있습니다(오디오 제어, 물리 기반 등).

필수 조건​

튜토리얼 09를 진행하려면 활성 웹소켓 세션, 즉 Inverse3 가 이미 실행 중인 햅틱 루프 내에서 활성 상태인 클라이언트가 필요합니다. 튜토리얼 09는 이 세션에 연결되어 해당 워크스페이스를 실시간으로 이동시킵니다.

세션을 시작하는 가장 빠른 방법

Haply Hub를 열고 Orb 데모를 실행하세요. 그러면 즉시 상호작용할 수 있는 지속형 햅틱 세션이 열립니다:

./09-haply-inverse-ws-remote-control --session co.haply.hub::demo-orb
python 09-haply-inverse-ws-remote-control.py --session "co.haply.hub::demo-orb"

Orb 장면은 작업 공간의 원점에 구체를 렌더링합니다. 튜토리얼 09에서 작업 공간을 이동하면 전체 장면이 실시간으로 함께 이동하므로, 즉각적인 시각적 피드백을 확인할 수 있습니다.

햅틱 루프를 실행하는 다른 모든 튜토리얼(01~07)도 마찬가지로 작동합니다. 터미널에서 해당 튜토리얼을 실행한 다음, 두 번째 터미널에서 튜토리얼 09를 실행하여 세션을 대화형으로 인식하도록 하세요.

사용법​

# Discover session interactively, use first detected device
./09-haply-inverse-ws-remote-control
python 09-haply-inverse-ws-remote-control.py

# Target the Haply Hub Orb demo directly
./09-haply-inverse-ws-remote-control --session co.haply.hub::demo-orb
python 09-haply-inverse-ws-remote-control.py --session "co.haply.hub::demo-orb"

# Target a session directly, specify device
./09-haply-inverse-ws-remote-control --session :my_profile:0 --device A14
python 09-haply-inverse-ws-remote-control.py --session "#42" --device A14

제어​

키를 길게 누르고 있으면 계속 이동합니다. 키에서 손을 떼면 멈춥니다.

맛액션
→ / ←+X / −X
↑ / ↓+Y / −Y
Page Up / Page Down+Z / −Z
= / -항해 속도 높이기 / 낮추기
0작업 공간을 초기 상태로 재설정
H도움말 보기
Esc종료 (Ctrl+C (이것도 작동합니다)

작동 원리​

1단계 — HTTP 세션 및 기기 식별​

이 튜토리얼에서는 동일한 보조 함수를 사용합니다. discover_session() / discover_device() wie 튜토리얼 08: GET /sessions (또는 GET /sessions/<selector> MIT --session), 그 후 GET /devices (또는 바로 --device (사용). 두 보조 함수 모두 동일한 CLI 플래그를 지원하며, SESSION_HELP-텍스트 — 튜토리얼 00 또는 08에 나오는 선택자는 여기에서도 변경 없이 그대로 사용할 수 있습니다.

2단계 — WebSocket 세션, 첫 번째 메시지 전송 시 핸드셰이크​

이 튜토리얼은 다음 주소로 WebSocket 연결을 설정합니다. ws://localhost:10001. 오직 ~에서 처음으로 수신한 메시지 세션 프로필 등록을 전송합니다:

{
"session": {"configure": {"profile": {"name": "co.haply.inverse.tutorials:ws-remote-control"}}},
"inverse3": [{"device_id": "...", "commands": {"set_transform": {"transform": {"position": {"x": 0, "y": 0, "z": 0}}}}}]
}

다음 틱들은 session weg — 명령어 배열만 전송됩니다 inverse3.

3단계 — set_transform pro Tick​

set_transform ~를 수락합니다 부분 변환, 또한 변경하고자 하는 필드만 선택하십시오. 이 튜토리얼에서는 위치 정보만 전송하며, 회전 및 확대/축소 비율은 세션 기본값(필요한 경우 configure.mount (제정되었다).

{
"inverse3": [{"device_id": "...", "commands": {"set_transform": {"transform": {"position": {"x": 0.02, "y": 0.0, "z": 0.01}}}}}]
}

포지션은 틱 단위로 누적됩니다. 약 1 kHz의 주파수로 이 서비스는 set_transform 매 틱마다 다시 활성화되므로(제로 오더 홀드), 워크스페이스는 사용자가 마지막으로 이동시킨 위치에 그대로 유지됩니다.

set_transform vs configure.mount

두 명령어 모두 세션당 하나의 영구 변환을 저장합니다. 그러나 워크스페이스 변환은 파이프라인 내에 auf dem Mount (참조: 마운트 및 작업 공간). 매 틱마다 솔랑지 튜토리얼 09 set_transform 스트리밍 과정에서, 새로운 WebSocket 프레임은 이전에 스트리밍된 워크스페이스 변환을 대체합니다. 다른 클라이언트가 set_transform 동일한 기기로 스트리밍되는 내용은 따라서 다음 틱에서 덮어쓰게 됩니다. configure.mount 이는 이와 별개이며 그 가치를 유지합니다. 실제로는 각 용도에 따라 채널을 선택해야 합니다. 물리적 설정을 위한 마운트, set_transform 라이브 내비게이션을 위해.

스레딩 모델 (C++)​

이 C++ 튜토리얼에서는 위치 누적기를 공유하는 두 개의 스레드를 사용합니다:

스레드롤레
메인 스레드거짓말 std::getline(std::cin, ...), 토큰 분석, 업데이트됨 nav_vel[] 그리고 default_step
WebSocket 콜백 스레드Schreibt nav_pos[] 음 nav_vel[] * dt fort, 연재물 set_transform 그리고 보내고

std::mutex nav_mutex 보호한다 nav_pos[], nav_vel[] 그리고 default_step. 타임스탬프 last_tick 그리고 그 깃발 first_ws_msg 이는 WS 콜백 내에서 로컬로 실행되며 뮤텍스가 필요하지 않습니다.

ws.onmessage = [&](const std::string &) {
float pos_snap[3];
{
std::lock_guard<std::mutex> lk(nav_mutex);
for (int i = 0; i < 3; ++i) nav_pos[i] += nav_vel[i] * 0.001f; // mm/frame → m
for (int i = 0; i < 3; ++i) pos_snap[i] = nav_pos[i];
}
// build and send set_transform with pos_snap
};

출처​

SDK 설치 프로그램에 포함되어 있습니다

튜토리얼 09는 SDK와 함께 로컬에 설치됩니다. 다음 위치에서 찾을 수 있습니다. tutorials/09-haply-inverse-ws-remote-control/ 서비스의 설치 디렉터리에서.

관련 주제: 명령 set_transform · Sitzungen — 첫 메시지와 함께 악수하기 · 마운트 및 작업 공간 · 셀렉토렌 · 튜토리얼 08 — HTTP 원격 구성 · 튜토리얼 07 — 베이스 및 마운트