09. WebSocket Workspace-Navigator
다음으로 이동하세요 장치의 작업 공간 내 위치 실시간 표시, 다음을 통해 set_transform-웹소켓 채널을 통해 명령을 스트리밍합니다. 이 튜토리얼에서는 HTTP를 사용하여 세션과 기기를 식별합니다(마찬가지로 튜토리얼 08), 그 후 웹소켓 연결을 열어 매 틱마다 포지션 업데이트를 전송합니다.
이 그림은 두 가지 변환 연산 간의 차이를 보여줍니다:
| 작전 | 튜토리얼 | 일반적인 용도 |
|---|---|---|
configure.mount — 지속적 마운트 변환 | 08 | 장치의 물리적 조립 과정을 설명하기 위해 한 번(또는 드물게) 적용합니다. |
set_transform — 지속적인 작업 공간 변환 | 09 (이번) | 이 역시 지속적이지만, 워크스페이스 내 실시간 탐색을 위해 매 틱마다 스트리밍될 수 있습니다. |
두 명령 모두 HTTP와 WebSocket을 통해 사용할 수 있으며, 둘 다 지속적인 — 이 서비스는 가장 최근에 전송된 값을 기억합니다. 차이점은 용도와 갱신 빈도에 있습니다: configure.mount 드문 업데이트에 최적화되어 있습니다(물리적 구성), 반면 set_transform 고주파수 스트리밍(장면 이동)에 최적화되어 있습니다.
다음과 같이 사용하십시오 set_transform, 워크스페이스의 기점이 런타임 중에 변경되는 크기(예: 손, 애니메이션이 적용된 절차적 오프셋, 또는 가상 워크스페이스를 실시간으로 이동시키는 조작자 등)를 따라가야 하는 경우.
그 자체로 보면 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
제어
- 파이썬
- C++
키를 길게 누르고 있으면 계속 이동합니다. 키에서 손을 떼면 멈춥니다.
| 맛 | 액션 |
|---|---|
→ / ← | +X / −X |
↑ / ↓ | +Y / −Y |
Page Up / Page Down | +Z / −Z |
= / - | 항해 속도 높이기 / 낮추기 |
0 | 작업 공간을 초기 상태로 재설정 |
H | 도움말 보기 |
Esc | 종료 (Ctrl+C (이것도 작동합니다) |
줄 기반 — 명령어를 입력한 후 ENTER 키를 누르십시오.
| 명령 | 액션 |
|---|---|
x+[N] / x-[N] | X축 속도를 ±N mm/프레임으로 설정 (숫자 없이 사용 시) x+ (현재 표준 속도) |
y+[N] / y-[N] | Y축 속도를 ±N mm/프레임으로 설정 |
z+[N] / z-[N] | Z축 속도를 ±N mm/프레임으로 설정 |
s+[N] / s-[N] | 표준 속도를 ±N mm/프레임으로 조정 |
stop | 모든 속도를 0으로 설정 |
reset | 속도를 0으로 설정하고 원점으로 돌아간다 |
h | 도움말 보기 |
Ctrl+C (또는 Ctrl+D / EOF)를 눌러 프로그램을 종료하십시오.
작동 원리
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
};
출처
튜토리얼 09는 SDK와 함께 로컬에 설치됩니다. 다음 위치에서 찾을 수 있습니다. tutorials/09-haply-inverse-ws-remote-control/ 서비스의 설치 디렉터리에서.
관련 주제: 명령 set_transform · Sitzungen — 첫 메시지와 함께 악수하기 · 마운트 및 작업 공간 · 셀렉토렌 · 튜토리얼 08 — HTTP 원격 구성 · 튜토리얼 07 — 베이스 및 마운트