v3.5.1
3.5.1 は、安定化と品質向上のためのリリースです。主な変更点は以下の通りです。1対1の「Inverse3 」とグリップ構成の自動ペアリング、開いている WebSocket セッションがなくても GET /devices/{id} 最新のモーション状態を取得できること、力/位置モードの切り替え時に発生していたキーキーという音の解消、そして持続的な負荷下で自己調整を行うサービステックスケジューラです。
ハイライト
- 1↔1のInverse3 とグリップ構成の自動ペアリング。 Inverse3 1 台とグリップ 1 個の準備が整うと、SDK は自動的にペアリングを登録します。これにより、マルチデバイス構成で
pen_attachedMinverse のキャリブレーション解除が誤ってルーティングされることがなくなりました。 - セッションを開かなくても最新の
GET /devices/{id}スナップショットの取得が可能になりました。 ファームウェア v7.5 以降では、Inverse3 、Inverse3x、Minverse において、WebSocket の動作にかかわらず、モーション状態が 20 Hz でポーリングされるようになりました。v7.5 以前のファームウェアでは、ポーリングをスキップし、警告を 1 回だけ出力します。 - 力と位置の切り替えにより、キーキーという音がしなくなりました。
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 ミリ秒につき最大 1 件の応答しか届かなくなります。設定変更時のフルスナップショットには影響ありません。
非推奨
3.5.1 では非推奨となる項目はありません。プレビューのマスタースイッチは、今後の 3.6 で導入される「サイレント」から「警告」への移行パイプラインに向けた、非推奨化の基盤となります。最初の非推奨化は 3.5.2 で予定されています。