본문으로 건너뛰기

v3.5.1

3.5.1은 안정성 확보와 품질 향상을 위한 릴리스입니다. 주요 내용은 다음과 같습니다. 1:1 구성의 Inverse3 + 그립 구성에 대한 자동 페어링, 열린 WebSocket 세션이 없더라도 GET /devices/{id} 최신 모션 상태를 확인할 수 있으며, 힘/위치 모드 전환 시 발생하던 삐걱거리는 소음을 해소하고, 지속적인 부하 하에서 스스로 조정되는 서비스 틱 스케줄러입니다.

하이라이트​

  • 1↔1 방식의 Inverse3 + 그립 구성의 자동 페어링. Inverse3 기기 1대와 그립 1개가 준비되면 SDK가 자동으로 페어링을 등록합니다. 이를 통해 다중 기기 구성에서 pen_attached Minverse 의 보정 해제 명령이 실수로 라우팅되는 문제가 더 이상 발생하지 않습니다.
  • 세션을 열지 않아도 최신 GET /devices/{id} 스냅샷을 생성할 수 있게 되었습니다. 펌웨어 v7.5 이상 버전의 Inverse3 / Inverse3x / Minverse 에서는 WebSocket 작동 여부와 관계없이 모션 상태가 20 Hz로 폴링됩니다. v7.5 이전 펌웨어에서는 폴링을 건너뛰고 한 번만 경고를 출력합니다.
  • 힘/위치 전환 시 삐걱거리는 소리가 더 이상 나지 않게 되었습니다. set_cursor_force ↔ set_cursor_position 전환은 슬롯 배타적으로 이루어지며, 틱 사이에는 장치별로 최신 값만 유지됩니다.HARP 에 명시된 200 ms 유휴 간격 회피 조치는 더 이상 필요하지 않게 되었습니다.
  • 자동 조정형 틱 스케줄러. 메인 루프는 부하에 따라 전송 속도를 조정하므로, 처리 속도가 느린 틱으로 인해 명령어 큐가 끝없이 커지는 일은 없습니다.
  • 부하 상태에서의 1입력 1출력 스트리밍 응답. WS 메시지별 스트리밍 응답은 세션당 1/ms로 제한됩니다. 상한값으로 인해 응답이 거부된 경우 직전 버퍼가 재생되므로, 시뮬레이션 루프가 recv() 로 인해 차단되는 일은 없습니다.

내부 개선​

장치​

  • 기기별 Inverse3 ↔ VerseGrip 페어링 레지스트리. GET|POST|DELETE /devices/{sel}/paired_with 는 각 장치별 1대1 매핑입니다.POST 는 양쪽 모두에서 중복되는 기존 페어링을 삭제합니다.DELETE 선택된 항목을 지웁니다. 선택기는 하나의 ID로 해결되어야 합니다.
  • 펌웨어 v7.5 이상에서 20 Hz 모션 상태 폴링. GET /devices/{id} 50 ms마다 최신 cursor_position、cursor_velocity、angular_position、angular_velocity 을 반환합니다. 활성 세션에 대해서는 투명하게 작동합니다.
  • 무선 VerseGrip의 set_extension_data 속도 제어 모드로 변경. 오래된 데이터를 삭제하고, 유휴 상태일 때 반복적으로 전송하는 파이프라인을 서비스 틱마다 처리합니다. 이제 과도한 전송으로 인해 무선 링크가 포화되는 일이 없어졌을 뿐만 아니라, 전송이 부족해 오래된 값이 남아 있는 일도 없어졌습니다.

세션​

  • 제어 전용 배치(힘/위치)를 위해 WS 수신을 위한 새로운 고속 경로를 추가했습니다. 이 경로에서는 configure 단계를 고려한 파이프라인을 건너뜁니다.configure、set_profile、커스텀 명령은 계속해서 레이스 상태 수정 처리를 거칩니다.

관측 가능성​

  • 탐지 로그의 발생 빈도는 포트별로, 그리고 지속성을 고려하여 제어되도록 변경되었습니다. 블랙리스트에 등록된 각 포트는 독립적으로 제어됩니다. 반복적으로 출력되는 "...blacklisted: skipping" 해당 행에는 발화 기간 동안 출력이 억제된 틱 수를 나타낸다 (×N) 가 붙게 되었습니다.
  • WVG가 아닌 장치를 프로브할 때, 무선 VerseGrip이 감지되어 로그가 넘쳐나는 현상이 더 이상 발생하지 않습니다.

수정​

  • POST /device.config.preset 에서 defaults 또는 arm_front 을 지정한 경우는 이제 장치의 마운트를 공장 출하 시 기본값으로 재설정합니다(이전에는 아무런 조치도 취하지 않았습니다).basis 는 유지되므로, 앱에서 설정된 기본값은 마운트 프리셋을 변경한 후에도 그대로 유지됩니다.
  • force_render_full_state 하지만 config 블록이 누락된 스냅샷을 더 이상 반환하지 않습니다.. 해당 configure가 동일한 WS 메시지 내에서 수신된 경우, configure 처리가 스냅샷 생성 전에 동기적으로 완료됩니다.
  • 세션 간에 force_render_full_state 하지만 이제 대상의 완전한 스냅샷을 반환하게 되었습니다. 이제 A와 B 모두 완전한 페이로드를 수신하게 되었습니다(기존에는 A가 스트리밍만 수신했습니다).
  • 알 수 없는 target_session_id 세션을 넘나드는 명령어가 더 이상 요청/응답 루프를 멈추게 하지 않습니다. 요청 출처는 자신의 스냅샷과,session-command-dropped 이벤트(cross-session-unknown-target)를 수령합니다.
  • Minverse 다중 장치 보정 잠금 해제가 잘못 라우팅되는 문제가 해결되었습니다. Minverse A의 보정으로 인해 Minverse B의 잠금이 해제되는 일이 더 이상 발생하지 않습니다. inkwell-success 헤더 브로드캐스트도 마찬가지로 수정되었습니다.
  • HTTP 장치 선택기 는, 장치 ID로 #1234 그리고 1234 두 가지 모두를 지원합니다. 셀렉터 클래스(inverse3、verse_grip)는 인덱스와 함께 작동합니다. 404 오류 메시지에는 원래의 선택자 표현식이 그대로 유지됩니다.
  • 무선 VerseGrip의 ready 플래그는 초기 장치 정보 핸드셰이크 과정을 거친 후에 설정되도록 변경되었습니다.。이전에는 특정 재연결 경로에서, 장치가 자신을 완전히 알리기 전에 플래그가 전환될 가능성이 있었습니다.
  • keyed-rate-gate를 기반으로 하는 설정의 실행 시 변경 사항이 다음 참조 시점부터 반영되도록 변경되었습니다(기존에는 첫 번째 emplace 시점에 고정되어 있었으며, 변경 사항은 새로운 세션에서만 반영되었습니다).

파괴적인 변경의 가능성​

  • basis、preset、mount、transform、force_gate 전체적으로 HTTP의 404 오류 메시지를 통일했습니다: "{type} device #{id} not found" 를 "no device matches selector '{expr}'" 로 변경했습니다. 세션의 404도 마찬가지로 변경했습니다.
  • 힘 스케일 이득, 힘 게이트 이득, 제어 타임아웃,safeties/expose_in_snapshot 에 대한 설정 glob을 devices/inverse*/... 부터 devices/*inverse/... 로 변경했습니다。구식 리터럴을 사용하는 3.5.0 설정 파일은 바인딩에 실패합니다.
  • 설정: 직렬화 관련 전역 설정을 session/serialization/* 로 이동했습니다(explicit_fields、force_complete_transforms、preview/*). 기존 패스의 serialization/* 는 권장되지 않는 별칭을 통해 계속해서 해결되지만, 4.0 버전에서 삭제될 예정입니다.
  • 동작: 메시지별 WS 응답을 틱 동기화 핸드셰이크로 사용하는 클라이언트의 경우, 지속적인 트래픽이 발생하는 상황에서도 세션당 1ms마다 최대 1건의 응답만 수신하게 됩니다. 설정 변경 시 생성되는 전체 스냅샷에는 영향을 미치지 않습니다.

권장하지 않음​

3.5.1 버전에서는 비추천 항목이 없습니다. 미리보기 모드의 마스터 스위치는 향후 3.6 버전에서 도입될 ‘무통보’에서 ‘경고’로의 전환 파이프라인을 위한 비추천 조치의 기반이 됩니다. 첫 번째 비추천 조치는 3.5.2 버전에서 이루어질 예정입니다.