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は選択されたエントリをクリアします。セレクターは 1 つの 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 応答をティック同期のハンドシェイクとして使用しているクライアントには、持続的なトラフィック時でもセッションあたり 1 ms につき最大 1 件の応答しか届かなくなります。設定変更時のフルスナップショットは影響を受けません。
非推奨
3.5.1 での非推奨はありません。プレビューのマスタースイッチは、今後の 3.6 で導入される「サイレント」から「警告」への移行パイプラインのための、非推奨化の基盤です。最初の非推奨化作業は 3.5.2 で予定されています。