주요 내용으로 이동

04. 헬로 플로어

첫 번째 촉각 효과: 커서가 그 위로 눌려 들어갈 때 반작용력을 발생시키는 가상의 수평지면입니다. 이 힘은 간단한 페널티 스프링 모델로, —stiffness × penetration_depth——통과 set_cursor_force Z축을 따라 가해진다.

다음 내용을 배우게 됩니다:

  • 사용 set_cursor_force 처벌용 스프링 힘을 가하다
  • 읽기 cursor_position 그리고 힘을 실시간으로 계산하며
  • (파이썬) 설정 작업 공간 사전 설정(arm_front_centered), 원점을 작업 공간의 중심에 위치시킨다
  • (파이썬)을 통해 keyboard 지면의 높이와 강성을 상호작용 방식으로 조절한다

업무 흐름​

  1. 열기 ws://localhost:10001 WebSocket을 열고 첫 번째 상태 프레임을 기다립니다.
  2. 첫 번째 프레임에서: 등록 세션 프로필. Python 버전은 또한 다음을 전송합니다. configure.preset: arm_front_centered, 원점을 작업 공간의 중앙에 위치시킵니다. C++ 버전은 기기에서 현재 활성화된 구성을 사용합니다.
  3. 각 프레임: 읽기 cursor_position.z, 계산 force_z = max(0, (floor_pos - z) * stiffness), 그리고 이를 통해 set_cursor_force 명령을 다시 전송합니다.
  4. 이후의 각 주기에서는 힘 명령만 전송되며, 세션 프로파일은 일회성 핸드셰이크에 불과합니다.
  5. (Python) 매 주기마다 키보드의 방향키를 폴링하여 실시간으로 업데이트합니다. floor_pos / stiffness。

매개변수​

명칭기본값용도
floor_pos0.10 m가상 지면 평면의 Z 좌표
stiffness1000 해당 없음탄성 계수 (1 mm 관통 시 → 1 N)
PRINT_EVERY_MS100–200원격 측정 유량 조절
세션 프로필 이름co.haply.inverse.tutorials:hello-floorHaply Hub에서 이 시뮬레이션을 식별합니다.
대화형 (Python 전용)

파이썬 버전 사용 keyboard 패키지 (Linux에서는 권한 상승이 필요함):

  • ↑ / ↓ ——지면 높이기 / 낮추기
  • ← / → ——강성 감소 / 증가
  • R ——기본값으로 복원
확장력

서비스 주기 동안 힘은합산될 수 있습니다. 즉, 장치로 전송되기 전에 각 출처의 힘이 먼저 합산됩니다. 이 튜토리얼과 같은 예제는 다른 힘 생성 소스와 공존할 수 있으며, 서로를 방해하지 않습니다.

읽은 상태 필드​

출처: data.inverse3[i].state:

  • cursor_position.z — vec3, 관통 깊이를 계산하는 데 사용됨
  • current_cursor_force — 원격 측정 데이터 전송용

보내기 / 받기​

각 주기마다: 커서의 Z 좌표를 읽어들이고, 계산한다 force_z = max(0, (floor_pos - z) * stiffness),그리고 다음 메시지를 보내세요 set_cursor_force 명령어. 제1조에 따라 전송되는 메시지에는 세션 구성 파일(모든 버전)이 포함되며, Python 버전의 경우 다음도 함께 포함됩니다. configure.preset: arm_front_centered。

단일 비동기 루프. 첫 번째 프레임의 핸드셰이크에는 프로필과 configure.preset, ~하게 하여 floor_pos = 0.1 작업 공간의 중심 좌표와 정렬합니다.

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["inverse3"][0]["device_id"]
# Handshake: profile + preset (one-shot)
request_msg = {
"session": {"configure": {"profile": {"name": "co.haply.inverse.tutorials:hello-floor"}}},
"inverse3": [{
"device_id": device_id,
"configure": {"preset": {"preset": "arm_front_centered"}}
}]
}
else:
# Per tick: compute force along Z, send set_cursor_force
z = data["inverse3"][0]["state"]["cursor_position"]["z"]
force_z = 0.0 if z > floor_pos else (floor_pos - z) * stiffness
request_msg = {
"inverse3": [{
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": 0.0, "z": force_z}}}
}]
}

await websocket.send(json.dumps(request_msg))
SDK 설치 프로그램과 함께 제공됨

튜토리얼 04는 SDK와 함께 로컬에 설치됩니다. 서비스 설치 디렉터리 내의 tutorials/04-haply-inverse-hello-floor/ 에서 검색하세요.

소스 코드: Python · C++ · C++ Glaze

관련 내용: 제어 명령(set_cursor_force) · 마운트 및 작업 공간 (기본 설정) · 형식 (vec3) · 대화 · 튜토리얼 07 (베이스와 장착)