v3.5.0
이번 버전은 1년 전 API 개편 이후 지금까지 출시된 버전 중 가장 포괄적인 업데이트입니다. 3.5.0 버전에서는 통합된 3D 수학 레이어, Minverse 에 대한 완벽한 지원, 타입이 지정된 이벤트 스트림, 완전한 설정 API, 그리고 더욱 직관적인 HTTP 인터페이스가 도입되었으며, 여기에 1년 동안 진행된 버그 수정 및 사용 편의성 개선 사항도 포함되어 있습니다.
주요 내용
- 통합 3D 수학 계층 – 디바이스 기반(프레임), 마운트 변환, 작업 공간 변환 및 내비게이션 변환을 위한 완전한 기능을 갖춘 프리미티브를 갖춘 결합 가능한 변환 파이프라인과, 로컬 공간, 세션 공간, 애플리케이션 공간 및 내부 공간 간의 명시적 변환 기능을 제공합니다.
- 버블 내비게이션 – 속도 기반 속도 제어, 히스테리시스 효과를 고려한 충돌 감지, 커서로 이동하는 선택적 드리프트 기능을 통해 형성된 구역(SDF 프리미티브)을 기반으로 대규모 가상 작업 공간에서 탐색을 수행합니다. HTTP 및 WebSocket을 통해 앱 공간을 경유하는 왕복 통신을 이용하여 완전히 구성할 수 있습니다.
- 표준화된 이벤트 스트림 – 기기 수명 주기, 보안 경고, 보정, 배터리 상태, 규정 준수율 관련 경고 및 구형 기능에 대한 알림을 위한 전용 WebSocket 이벤트 채널.
- Settings-API – HTTP CRUD, 타입 힌트, 범위 제한 및 설명을 지원하는 완전한 키-값 설정 시스템으로, 기존의 중첩된 구성 파일을 대체합니다.
- 일관된 장치 구성 – 각 기기에 대해 공통으로 적용되는 HTTP 경로 세트:
basis,mount,preset,transform,filters,handedness,torque_scaling,gravity_compensation,home_return. - Minverse 와 펜의 동기화된 보정 – 이제 기기와 펜이 함께 보정되며, 펜이 물리적으로 장착될 때까지 보정 기능은 잠긴 상태로 유지됩니다.
- HTTP의 편의성 개선 – 인덱스 기반 장치 선택기(ID 없이 인덱스를 통해 장치에 접근), WebSocket과 공유되는 일관된 요청/응답 구조, 선택적으로 활성화할 수 있는
{ok, error, data}-봉투 (?format=json) 및 와일드카드 세션 선택자.
새로운 기능
기기
- Minverse – 이 버전에서 공식적으로 지원되는 기능: 감지, 대기 절차, 보안 알림 및 동기화된 보정 절차.
- 이제 ‘Ruko ’와 ‘Kingfisher’가 Griff의 공식 제품 유형으로 인정됩니다.
- 장치 시뮬레이터 지원 – 실제 하드웨어와 함께 소프트웨어로 시뮬레이션된 장치를 식별하고 제어할 수 있습니다.
- 연결 루프 방지 – 오류가 있는 포트는 자동으로 차단되며, 다음 명령어로 재설정할 수 있습니다.
POST /ports/{port}/reset. - 손잡이 감지를 위한 하트비트 – 데바운스 기능을 통해 손잡이를 잡거나 놓을 때를 정확하게 감지합니다.
세션, 명령어 및 WebSocket
- 세션 프로필의 필터링 및 지속성 – 세션은 프로필 이름과 필요한 SDK 버전을 지정하며, 서비스는 재연결 시에도 이 두 가지를 기억합니다. 클라이언트와 모니터링 도구는 이 프로필을 기반으로 세션을 필터링하고 특정 세션을 대상으로 할 수 있습니다.
- 세션별 명령어 버퍼 – 한 세션이 느려져도 다른 세션의 속도를 저하시키지 않습니다.
- Explizite
configure-일회성 명령어용 맵 –basis,preset,mount,force_gate,damping기기당 및profile그리고basis이제 각 세션마다 모든 것이configure전송되며 출력 구성 맵에 맞춰져 있어, 전송된 내용과 다시 읽혀진 내용이 일치하도록 합니다. - 맞춤형 기기 거치대 – 통합된 워크스페이스 사전 설정을 선택하십시오 (
defaults,arm_front,arm_front_centered,led_front,led_front_centered) 또는 명시적인 변환을 전송하십시오. 수동으로 마운트를 변경하면 프리셋이 자동으로custom. - 명명된 명령 필드 –
position,vector,angles,torques일반 배열을 대체합니다values. set_angular_torquesersetztset_angular_torque(단수형은 더 이상 사용되지 않습니다).- 세션 프레임의 확장 – v3.0 및 v3.1 버전의 세션 프레임에는 이제 확장 가능한
config-,state- 그리고status- 객체; 새로운 출력 필드에는 다음이 포함됩니다.current_cursor_force,current_cursor_position,current_angular_torques,current_angular_position,control_domain,control_mode,transform,transform_velocity, 더 자세한config.*-펠더와status.safety(기본적으로 숨김). - 부분 변환-업데이트 – 변경하고자 하는 하위 필드만 보내주십시오 (
position,rotation,scale), 마운트, 작업 공간 변환 및 탐색 양식에 대해.
HTTP
GET /– 서비스 버전.GET/POST/DELETE /settings그리고/settings/*– 키-값 쌍을 위한 완전한 설정 API.GET /sessions/{session}그리고GET/POST/DELETE /sessions/{session}/profile.GET /devices?session=<selector>– 장치 좌표를 지정된 세션의 적용 영역으로 변환합니다.- 인덱스 기반 장치 선택기 – ID를 알 필요 없이 인덱스를 통해 원하는 기기를 호출할 수 있습니다 (
/inverse3/0/...우선 Inverse3;/inverse*/*/...(Inverse 제품군의 모든 기기에 적용됨). - 일관된 문의·답변 구조 – POST 및 GET 요청은 동일한 것을 사용합니다.
command_data- WebSocket과 같은 JSON 기반 구조; 한 전송 프로토콜을 위해 작성된 코드는 다른 프로토콜에서도 작동합니다. - 선택적으로 활성화할 수 있는 엔벨로프 über
?format=json모든 노선에서;/settings*그리고GET /home_return기본적으로 사용{ok, error, data}. 다음을 사용하십시오?format=plain기본 구조를 위해. - 세션 선택자 내의 와일드카드 –
*(임의의 문자열) 및?(단일 문자)가 프로필 이름에 포함되어 있습니다. - 백분율로 인코딩된 선택자 –
%2A,%3A등은 라우팅 전에 디코딩됩니다.
이벤트
- 전용 WebSocket 이벤트 스트림
communication/events/port. - 24가지 유형의 이벤트 범주. 여기에는 기기 수명 주기, 안전(전자 브레이크, 이물질 감지, 잠김), 보정 오류, 배터리 경고, 세션 경고, 낮은 제어 속도 및 임계 제어 속도, 입력 유효성 검사, 구형 기능에 대한 알림 등이 포함됩니다.
가시성
- 프로파일링 시 로그 메시지는 단계별 색상으로 구분되어 Tracy로 전달됩니다.
- 각 HTTP 핸들러에 대한 트레이시-조넨.
- 메인 루프의 타이밍 통계가 포함된 이벤트.
- 설정 가능한 로그 디렉터리와 서버 호스트명 (Docker 호환).
3.6 버전 미리보기
- SDF 햅틱 효과(SDF HFX) – 기본 기능은 이미 3.5 버전에서 구현되었습니다(모듈, 수명 주기, 모듈에서 제공하는 명령 및 상태의 직렬화). 완전한 문서가 포함된 공개 API는 3.6 버전에서 제공될 예정입니다.
개선 사항
- 힘 진동 필터링 – 축 기반 진동 감지, 8단계 점진적 복원, 히스테리시스를 적용한 입력 조정 및 비대칭 허용 창.
- 실행 시 Force-Gate-Filter – 다음을 통해 설정 가능
configure.force_gate.gainWebSocket 또는 HTTP를 통해, 영구적으로 저장된 기본값과 함께. - 정밀 응용 분야를 위해 메인 루프의 최대 주파수를 32 kHz로 높였습니다.
- 더 작은 웹소켓 페이로드 – 변환-기본값으로 항등값을 갖는 하위 필드 (
position = 0,rotation = identity,scale = 1)는 기본적으로 출력되지 않습니다. 이로 인해 유효 부하 크기가 줄어들며, 구형 Unity 패키지의 4KB 메시지 제한과의 호환성이 다시 확보됩니다. 두 가지 고급 설정(serialization/explicit_fields,serialization/force_complete_transforms)는 이를 필요로 하는 애플리케이션을 위해 모든 필드를 다시 포함합니다. - 메인 루프의 지터 감소 – WebSocket 메시지 처리 시 JSON 구문 분석 및 네트워크 전송 중에 메인 루프의 클럭이 더 이상 차단되지 않으며, 세션의 클럭 스케줄링이 응답 직렬화 단계보다 앞당겨졌습니다.
- 서버는 기본적으로 localhost를 통해서만 접속할 수 있습니다. – 네트워크에 액세스하려면 다음 설정을 활성화하십시오.
communication/bind_all_interfaces. - 장치 선택자에서 와일드카드를 사용할 때는 접두사 구문을 사용합니다. (예:
inverse*(Inverse 제품군의 모든 기기에 적용됩니다). - 감쇠 명령어 다음과 함께
force_gate인 다이configure-지도가 이동되었습니다. - 기존 파일 로거를 순환형 파일 로거로 대체하며, 디렉터리는 구성할 수 있습니다.
- 모듈이 제공하는 명령어 및 상태 – 모듈은 핵심 스키마를 변경하지 않고도 WebSocket 프레임에 자체 명령어, 구성 필드 및 상태 출력을 포함시킬 수 있습니다.
오류 수정
오류 수정으로 가득 찬 한 해였으며, 가장 효과적인 수정 사항들은 아래에 나열되어 있습니다.
- 특정 조건에서 세션 속도가 불규칙하게 나타남.
- 시뮬레이션이 실행 중이 아닐 때 GripHook(Verse Grip Stopper) 이 제대로 해제되지 않았습니다.
- Inverse3-타임아웃 설정이 너무 엄격하여, 기기가 느리게 시작될 때 연결 루프가 발생했습니다.
- Windows에서 서비스가 비정상적으로 종료됨 — 시스템 종료 시 HTTP 서버가 항상 정리되지는 않았습니다.
- 서비스가 구형 펌웨어 버전에 지원되지 않는 명령을 전송했을 때 발생하는 재연결 루프.
- 블루투스 어댑터가 장착된 시스템에서 블루투스 기기 목록이 로그를 넘쳐나게 했다.
- 서비스를 연속으로 여러 번 재시작할 때 오류가 발생합니다.
- Ubuntu 노트북에서 절전 모드 진입 및 복귀 후 무선 Verse-Grip 동글이 응답하지 않는 현상.
- Linux 및 macOS에서 무선 Verse Grip의 핸드셰이크 기능이 이제 첫 번째 인식 시도가 실패할 경우 올바르게 대체 방식을 활용합니다.
- macOS 구성 파일의 저장 위치 — 구성이 이제
~/Library/Application Support/잘못된 경로에 저장되었습니다. - Linux 및 macOS에서 SIGSEGV 신호 처리 — 여러 스레드에 대해 크래시 로깅이 활성화된 경우, 치명적인 신호가 발생해도 프로세스가 무한 루프에 빠지지 않습니다.
- 세션 간 명령어 덮어쓰기 — 한 세션의 구성 명령어가 다른 세션의 명령어로 묵시적으로 대체될 수 있었으나, 이제 이러한 명령어가 올바르게 필터링되고 병합됩니다.
- 프로브 명령은 구성을 덮어씁니다. — 모니터링 세션(예: Haply Hub)은
probe_positionBasis / Preset / 프로필에 대한 미적용 변경 사항을 더 이상 묵시적으로 적용하지 않습니다. - 프로토타입 핸들 표시 — 프로토타입 하드웨어가 사용자 정의 핸들이 아닌 표준 핸들로 잘못 표시되었습니다.
- 구식 매트릭스 표기법은
set_basis아직 마이그레이션되지 않은 클라이언트에 대해서는 다시 고려됩니다. - Inverse3 의 절단 시 발생하는 크라프트임펄스는 더 이상 잔류 힘의 급격한 증가를 일으키지 않습니다.
- 연속적으로 빠르게 연결 및 연결 해제가 반복될 때 WebSocket 연결이 끊어지면 발생하는 경합 상태.
- 웹소켓
session_id일부 전송 중인 페이로드에서 다음과 같이 나타났습니다.0시리얼화됨. - Windows에서는
--log-level이제 다음 제품과 함께 사용할 수 있습니다--dev고려됨 (이전에는 암묵적으로debug(초기화됨).
구식 요소
현재는 여전히 작동하지만, 향후 주요 버전 업데이트 시 제거될 예정입니다. 답변에는 경우에 따라 필드가 포함될 수 있습니다. deprecation_warning.
| 구식 | 에르자츠 |
|---|---|
POST /force_scale | POST /settings/devices/inverse*/filters/force_scale/gain |
POST /gravity_compensation | POST /{device}/{id}/config/gravity_compensation |
POST /torque_scaling | POST /{device}/{id}/config/torque_scaling |
POST /device_handedness | POST /{device}/{id}/config/handedness |
POST /serial_enable | POST /settings/communication/serial/enabled |
POST /experimental/features/grip_dropped_simulation_stopper | 설정 API |
POST /experimental/features/screensaver_enable | 설정 API |
웹소켓 command_data.values | position, vector, angles, torques |
웹소켓 set_angular_torque | set_angular_torques |
웹소켓 probe_cursor_position | probe_position |
웹소켓 set_coordinate_origin | configure.preset |
WebSocket 세션 수준 set_basis | configure.basis |
호환성 안내
3.4.19 버전과 비교했을 때, 중대한 호환성 변경 사항은 없습니다. 기존 통합 환경과 관련하여 두 가지 참고 사항이 있습니다:
- 구버전 HTTP 엔드포인트에 이제 필드가 포함됩니다.
deprecation_warning답변에서 — 답변 패턴을 엄격하게 검증하는 클라이언트는 이 추가 필드를 허용해야 합니다. - Das Feld
valuesWebSocket에서command_data이 기능은 구식이지만 여전히 구문 분석됩니다. 가급적 명명된 필드를 사용하십시오.
튜토리얼 및 문서
- 새로운 튜토리얼: 05 위치 제어, 06 복합 (Inverse3 + Verse Grip), 07 기초 및 설치, 08 HTTP 원격 구성기, 09 WebSocket 원격 제어, 10 이벤트 스트림 리스너.
- 새로운 유약 종류 모든 C++ 튜토리얼 (
cpp-glz/) 기존의 nlohmann/json 방식과 병행하여. - 모든 튜토리얼은 v3.1 API에 맞춰 새로 작성되었습니다. (포트 10001,
configure.preset, 이름이 지정된 명령 필드,print_state()-보조 기능). - 이전 ‘Verse-Grip-Stopper’ 튜토리얼은 삭제되었으며, 새로운 통합 튜토리얼로 대체되었습니다.
- SDK 가이드, API 참조 및 하드웨어 페이지 전반에 걸쳐 공개 문서가 업데이트되었습니다.