본문으로 이동

07. 기초 및 설치: 시험장

다음과 같이 대화형 방식으로 제어하세요. 편집 변환 기기의 기능을 설명하고, 다음과 같이 configure.basis, configure.preset et configure.mount 프로토콜 수준에서 함께 작동합니다. 상호작용 가능한 관심 지점이 설정 제어 항목 위에 머물 수 있도록 수평선을 고정된 상태로 유지합니다.

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

  • 정의하기 기본 순열 ("XZY" → Y축이 위를 향하도록 정렬된 기준점)
  • 선택하기 사전 설정 (arm_front) 그리고 그것이 무엇을 설정하는지 이해하기
  • 실행 시의 조립 과정을 (키보드로 제어되는) 회전 쿼터니언으로 대체하기
  • 상호 배타의 법칙: mount et preset 는 같은 블록 내에서 공존할 수 없습니다. 기기 설정
  • [ ]의 점별 의미론 configure : 키를 누를 때마다 정확히 하나의 구성 메시지가 전송됩니다
  • (C++ Glaze) 상호 배타적인 필드의 모델링 std::optional

업무 흐름​

  1. 첫 번째 메시지를 보내실 때: 다음을 보내주세요 세션 프로필, configure.basis: "XZY" et configure.preset: arm_front. 보내기 시작하세요 set_cursor_force 고정 바닥용.
  2. 각 사이클마다: 커서의 Y 값을 읽고, 다음을 계산합니다. force_y = max(0, (floor_pos - y) * stiffness) 그리고 보내주세요.
  3. 사용자가 마운트의 회전 버튼을 누르면 다음을 설정하십시오. pending_configure = true.
  4. 다음 단계: 블록 만들기 configure.mount 변환을 통해 rotation 는 유니터리 쿼터니언입니다(현재 피치 및 요각의 Z, X 순서 합성). 생략하십시오 preset — 두 가지 모두 프로토콜 차원에서 상호 배타적입니다.
  5. 재설정 버튼 (R)는 대체 내용을 지웁니다. 다음 설정은 다음과 같은 효과를 냅니다. preset.

매개변수​

Nom결함역할
BASIS"XZY"축의 순서 변경 — Y축이 위를 향하도록 설정된 좌표계
DEVICE_PRESET / DEVICE_CONFIG_PRESET"arm_front"이름이 지정된 사전 설정 — 기기 본체의 기본값
FLOOR_POS_Y0.0 m고정 평면도 (앱의 Y축)
STIFFNESS1000 해당 없음토양 강성 상수
MOUNT_STEP_DEG10°키 입력에 따른 회전
PRINT_EVERY_MS200텔레메트리 데이터 전송량 제한

명령어​

그 말이 맞네요액션
W / S장치의 +X축을 중심으로 마운트를 ±10° 회전시키기 (피치)
A / D장치의 +Z축을 중심으로 마운트를 ±10° 회전시키기 (요)
R편집 초기화 — 기본 설정으로 되돌리기
H주문 보기
Q포기자
mount et preset 서로 배타적이다

이 서비스는 다음 블록을 거부합니다. 기기 설정 이 두 가지를 모두 포함하고 있습니다. 사용자가 마운트를 교체하면, 튜토리얼에서는 다음 내용을 생략합니다. preset 다음 각 구성에 대해. 누르십시오 R 반응형 preset 다음과 같이 구성하고 제거하십시오 mount.

다양한 입력 방식

C++ 버전은 백그라운드에서 stdin 실행 스레드를 통해 입력 내용을 한 줄씩 읽어들입니다(각 문자를 입력한 후 Enter 키를 누르세요). Python은 다음 패키지를 사용합니다. keyboard 주 비동기 루프에서 키 입력을 실시간으로 감지하기 위해 — ENTER 키는 필요하지 않습니다. 동일한 키, 동일한 명령어입니다.

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

~부터 data.inverse3[i].state :

  • cursor_position.y — vec3, 토양 침투도를 계산하는 데 사용됨
  • current_cursor_force — 원격 측정용으로 신고됨

발송 / 수신​

모든 변형에 대해 유효 부하의 구조는 동일하며, 주목할 만한 차이점은 각 변형이 상호 배타적 분기를 구성하는 방식에 있습니다. mount / preset 그리고 입력 신호가 WebSocket 신호를 어떻게 전달하는지.

패킷을 통해 키 입력을 실시간으로 감지하는 비동기식 고유 루프 keyboard. pending_configure 이는 키 관리자에 의해 정의된 전역 지표이며, 블록이 실행될 때마다 재설정됩니다. configure 이 전송됩니다.

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 + basis + preset
request_msg = {
"session": {"configure": {"profile": {"name": SLUG}}},
"inverse3": [{
"device_id": device_id,
"configure": build_configure_block(first_handshake=True),
# -> {"basis": {"permutation": "XZY"},
# "preset": {"preset": "arm_front"}}
}],
}
else:
handle_key_inputs() # may set pending_configure = True (classic, not shown)

y = data["inverse3"][0]["state"]["cursor_position"]["y"]
force_y = 0.0 if y > FLOOR_POS_Y else (FLOOR_POS_Y - y) * STIFFNESS

entry = {
"device_id": device_id,
"commands": {"set_cursor_force":
{"vector": {"x": 0.0, "y": force_y, "z": 0.0}}},
}
if pending_configure:
entry["configure"] = build_configure_block(first_handshake=False)
# -> {"mount": {...}} OR {"preset": {...}} (never both)
pending_configure = False

request_msg = {"inverse3": [entry]}

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

튜토리얼 07도 SDK와 함께 로컬에 설치되어 있습니다 — 다음을 참조하세요 tutorials/07-haply-inverse-basis-and-mount/ 서비스 설치 디렉터리에서.

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

관련 항목: 기본 순열 · 편집 및 작업 공간 · 기기 설정 · 제어 명령 (set_cursor_force) · 유형 (변환) · 튜토리얼 04 (Hello Floor)