APIの書き換え以来、1年ぶりにリリースされた最大規模のアップデートです。バージョン3.5.0では、統合された3D数学レイヤー、Minverseの完全サポート、型指定イベントストリーム、完全な設定API、そしてより洗練されたHTTPインターフェースが導入されました。これに加え、この1年間に行われたバグ修正や使い勝手の改善も盛り込まれています。
主な見どころ {#highlights}
統合3D数学レイヤー— デバイスベース(フレーム)、マウント変換、ワークスペース変換、ナビゲーション変換を第一級の基本要素として提供する、組み合わせ可能な変換パイプラインであり、ローカル、セッション、アプリケーション、内部空間間の明示的な変換もサポートしています。Bubble Navigation— 速度マッピングに基づく速度制御、ヒステリシスを考慮した衝突検出、および選択可能なカーソル方向のドリフトを備えた形状領域(SDFプリミティブ)を通じて、広大な仮想作業空間を探索します。HTTPおよびWebSocketを介して完全に構成可能であり、アプリ空間のラウンドトリップに対応しています。タイプ指定イベントストリーム— デバイスのライフサイクル、安全に関する通知、キャリブレーション、バッテリー、制御サイクルの警告、サポート終了(deprecation)のヒント専用のWebSocketイベントチャネルです。Settings API— HTTP CRUD、型ヒント、スコープ制約、説明をサポートする完全なキー・バリュー型設定システムであり、従来のネストされた設定ファイルに代わるものです。一貫したデバイス構成 — すべてのデバイスに共通して適用されるHTTPルートセットを提供します: 基準, マウント, プリセット, 変える, フィルター, 利き手, トルク・スケーリング, 重力補正, ホームに戻る.Minverse およびペンの同期キャリブレーション— デバイスとペンは現在、一緒にキャリブレーションされるようになり、グリップが物理的に接続されるまで、キャリブレーションの状態はロックされたままになります。ユーザビリティの改善 HTTP — インデックスベースのデバイスセレクタ(ID を使用せず、インデックスでデバイスを指定)、WebSocket と共通の統合リクエスト/レスポンス形式、オプションで使用可能な {OK、エラー、データ} エンベロープ(?format=json), ワイルドカード・セッション・セレクタを提供します。新機能 {#new-features}
デバイス {#devices}
Minverse— 今回のリリースでは、検出、準備シーケンス、安全通知、同期化されたキャリブレーションワークフローが正式にサポートされました。RukoおよびKingfisherは、公式のグリップ製品タイプとして認定されています。デバイスシミュレータのサポート— 実際のハードウェアに加え、ソフトウェアでシミュレートされたデバイスも検出して通信することができます。接続ループ保護 — 誤動作しているポートは自動的に遮断され、 POST /ports/{port}/resetにリセットすることができます。ペン接続ハートビート— ディバウンスを適用することで、グリップの接続と切断を確実に検知します。セッション、コマンド、およびWebSocket {#sessions-commands-websocket}
セッションプロファイルのフィルタリングと永続性— セッションはプロファイル名と必要なSDKバージョンを宣言し、サービスはこの情報を再接続後も保持します。クライアントやモニタリングツールは、このプロファイルに基づいてセッションをフィルタリングし、ターゲットとして指定することができます。セッションごとのコマンドバッファ— 1つのセッションの処理が遅くても、他のセッションへの影響はなくなります。1回限りのコマンド用の明示的な `configure` マップ — デバイス別 基準, プリセット, マウント, force_gate, 減衰およびセッション別 プロフィール および 基準これで全部 設定するに含まれます。出力構成マップと整合が取れているため、送信した内容を後で読み込む際、同じ形式で返されます。カスタムデバイスのマウント — 内蔵ワークスペースプリセット(デフォルト, 腕(前面), 腕の正面中央, フロントLED, led_front_centered) のいずれかを選択するか、明示的な変換を送信することができます。マウントを手動で変更すると、プリセットは自動的に カスタムに切り替わります。名前付きコマンドフィールド — 位置, ベクトル, 角度, トルク汎用 価値観 配列を置き換えます。角トルクを設定するか set_angular_torqueに置き換えます(単数形はサポートされなくなりました)。セッションフレームの拡張 — v3.0 および v3.1 セッションフレームに拡張可能な 設定, 状態, ステータス オブジェクトが含まれます。新しい出力フィールドには current_cursor_force, 現在のカーソル位置, 現在の角トルク, 現在の角度位置, 制御ドメイン, 制御モード, 変える, 変形速度, さらに充実した config.*, そして ステータス・安全(デフォルトでは非表示)が含まれます。部分的なトランスフォームの更新 — マウント、ワークスペースの変換、変更したいサブフィールド(位置, 回転, スケール)のみ送信できます。HTTP {#http}
GET / — サービス版です。GET/POST/DELETE /settings および /settings/* — キーと値の設定に関するAPIの全体像です。GET /sessions/{session} および GET/POST/DELETE /sessions/{session}/profile.GET /devices?session=<selector> — デバイスの座標を、指定されたセッションのアプリケーション空間に変換します。インデックスベースのデバイスセレクタ — IDがわからなくても、インデックスを使って任意のデバイスを指定できます(最初のInverse3の場合、 /inverse3/0/..., Inverseシリーズのすべてのデバイスは inverse...).統合リクエスト/レスポンス形式 — POST/GETの本文はWebSocketと同じ command_data JSON形式を採用しているため、ある通信方式用に作成したコードは、他の通信方式でも動作します。選択的エンベロープ — すべてのルートにおいて ?format=jsonで有効にすることができます。 /設定* および GET /home_return基本的には {OK、エラー、データ} 型を使用します。プリミティブ型を使用するには、 ?format=plainを指定してください。セッションセレクタのワイルドカード — プロフィール名から *(任意の文字列)と ?(1文字)を使用できます。パーセント記法で展開されたセレクタ — %2A, %3A などは、ルーティングの前にデコードされます。イベント {#events}
コミュニケーション/イベント/ポートで提供される専用のWebSocketイベントストリームです。デバイスのライフサイクル、安全性(電子ブレーキ、異物検知、ストール)、キャリブレーション失敗、バッテリー警告、セッション警告、制御サイクルの低下および閾値、入力の妥当性チェック、サポート終了の通知など、24種類の指定イベントカテゴリを提供します。観測可能性(Observability) {#observability}
プロファイリング時には、ログメッセージがレベルごとの色とともにTracyに送信されます。すべてのHTTPハンドラーにTracyゾーンが適用されます。メインループのタイミング統計イベントです。ログディレクトリとサーバーのホスト名を設定できます(Docker に対応)。バージョン3.6で提供予定 {#coming-in-36}
SDF Haptic Effects (SDF HFX)に基づく機能は、バージョン 3.5 に実装されました(モジュール、ライフサイクル、モジュールが提供するコマンド/状態のシリアライズ)。公開 API は、バージョン 3.6 で完全なドキュメントとともに提供される予定です。改善点 {#improvements}
力振動フィルタリング— 軸ごとの振動検出、8段階の漸進的復元、ヒステリシスを適用したエントリー投票、非対称解除区間を含みます。ランタイム・フォースゲート・フィルター — WebSocket または HTTP を通じて configure.force_gate.gainで構成することができ、永続的なデフォルト値に対応しています。高精度な用途向けに、メインループの最大周波数が32 kHzに引き上げられました。さらに小型化されたWebSocketペイロード — 変換のサブフィールドで、恒等(identity)をデフォルト値とするもの(位置 = 0, rotation = 単位行列, スケール = 1)は、基本的に出力から省略されるため、ペイロードサイズが縮小され、旧バージョンのUnityパッケージにおける4 KBのメッセージ制限との互換性が回復されます。2つの詳細設定(シリアライズ/明示的なフィールド, シリアライズ/変換の強制完了)を使用すれば、この値を必要とする利用者向けに、すべてのフィールドを再度含めることができます。メインループのジッター低減— JSONの解析やネットワーク通信中も、WebSocketメッセージの処理がメインループのティックをブロックすることはありません。セッションティックのスケジューリングは、応答のシリアライズよりも前倒しされました。サーバーのデフォルト設定は localhost 専用です — 通信/すべてのインターフェースをバインド 設定でネットワークへのアクセスを明示的に許可することができます。デバイスセレクタのワイルドカードは、接頭辞構文を使用します(例: inverse(Inverseシリーズのすべてのデバイスと互換性があります)。ダンピング指令これ force_gateとともに 設定する マップに移動しました。ローテーションファイルロガーは、既存のロガーに取って代わり、ディレクトリを構成することができます。モジュールが提供するコマンドと状態— モジュールは、コアスキーマを変更することなく、独自のコマンドを組み込んだり、フィールドを構成したり、WebSocketフレームに状態出力を追加したりすることができます。修正内容 {#fixes}
これは1年間に蓄積されたバグ修正内容であり、影響が最も大きい項目は以下の通りです。
特定の条件下でセッション速度の不安定な現象が発生していた問題。シミュレーションが実行されていないときに、GripHook(Verse Grip Stopper)の解除が正しく行われなかった問題。Inverse3 タイムアウトが短すぎたため、起動に時間がかかる端末で接続が繰り返し切断されるという問題。Windows サービスの異常終了— 終了時にHTTPサーバーが必ずしもクリーンアップされなかった。サービスが旧バージョンのファームウェアではサポートされていないコマンドを送信した際に発生していた再接続ループ。Bluetoothアダプタを搭載したシステムにおいて、Bluetoothデバイスの列挙処理によりログが過剰に埋まってしまう問題。サービスを連続して複数回再起動した際に発生していたクラッシュ。省電力モードから復帰した際、Ubuntu搭載のノートPCで発生していた「Wireless Verse Grip」ドングルの動作停止。Linux および macOS において、Wireless Verse Grip のハンドシェイクが最初の検出試行で失敗した場合でも、正しくフォールバックするようになりました。macOSの設定ファイルの保存場所 — 設定により、誤ったパスではなく ~/Library/Application Support/に保存されます。Linux および macOS におけるSIGSEGV シグナルの処理— マルチスレッド競合のキャプチャが有効になっている場合、致命的なシグナルが発生してもプロセスはループに陥らなくなります。セッション間のコマンドの上書き— 以前は、あるセッションの設定コマンドが別のセッションのコマンドによって黙って上書きされることがありましたが、現在は適切にフィルタリングされ、統合されるようになりました。「Probe」コマンドが設定を上書きしてしまう問題 — モニタリング セッション(例:Haply Hub)において プローブの位置 コマンドを送信しても、待機中のbasis / preset / profileの変更内容が、もはや黙って上書きされることはなくなりました。プロトタイプのグリップの表示— プロトタイプのハードウェアが、カスタムグリップではなく標準グリップとして誤って表示されていました。まだ移行していないクライアントに対して、従来の `set_basis` 行列ルールが再び適用されるよう修正されました。セッションの接続を切断した際、「Inverse3 」の強制キックで、残留力の急上昇がもはや発生しなくなりました。高速な接続/切断サイクル中に発生していた「WebSocket connection lost」というレースコンディション。一部の送信ペイロードにおいて WebSocketの`session_id` 値が 0シリアル化されていた問題。Windowsでは --dev オプションと併用すると --ログレベル オプションが正しく適用されるようになりました(以前は何も表示されずに デバッグ (レベルにリセットされました)。非推奨項目 {#deprecations}
現在も動作していますが、今後のメジャーバージョンで削除される予定です。該当する場合は、回答に 非推奨警告 フィールドが含まれます。
| 廃止項目 | 代替項目 |
|---|---|
| POST /force_scale | POSTinverse |
| 投稿 /重力補正 | POST /{device}/{id}/config/gravity_compensation |
| 投稿 /torque_scaling | POST /{device}/{id}/config/torque_scaling |
| 投稿 /デバイスの利き手 | POST /{device}/{id}/config/handedness |
| POST /serial_enable | POST /settings/communication/serial/enabled |
| POST /experimental/features/グリップ脱落シミュレーションストッパー | Settings API |
| POST /experimental/features/screensaver_enable | Settings API |
| WebSocket command_data.values | 位置, ベクトル, 角度, トルク |
| WebSocket set_angular_torque | 角トルクを設定する |
| WebSocket カーソルの位置を取得 | プローブの位置 |
| WebSocket 座標原点を設定する | configure.preset |
| WebSocket セッションレベル 基底を設定する | configure.basis |
互換性に関する注意事項 {#compatibility-notes}
3.4.19 に向けて、確実な互換性を損なう変更はありません。既存の連携に関する注意事項は以下の 2 点です:
使用されなくなったHTTPエンドポイントのレスポンスには、現在 非推奨警告 フィールドが含まれます。レスポンススキーマを厳密に検証するクライアントは、この追加フィールドを受け入れる必要があります。WebSocket command_dataの 価値観 このフィールドは非推奨となっていますが、依然として解析されます。名前付きフィールドの使用を推奨します。チュートリアルおよびドキュメント {#tutorials-documentation}
新しいチュートリアル:05 位置制御、06 統合(Inverse3 +Verse Grip)、07 Basisおよびマウント、08 HTTPリモート設定ツール、09 WebSocketリモート制御、10 イベントストリームリスナー。Glazeの新バージョン: 既存の nlohmann/json バージョンに加え、すべての C++ チュートリアルに Glaze バージョン(cpp-glz/)が追加されました。すべてのチュートリアルの書き直し: v3.1 API(ポート 10001、 configure.preset, 指定されたコマンドフィールド、 print_state() (ヘルパー)に合わせて書き直されました。従来の「Verse Grip Stopper」チュートリアルを削除しました— 新しい統合チュートリアルに置き換えられました。SDKガイド、APIリファレンス、ハードウェアページなど、公開ドキュメント全般を新たに更新しました。