v3.5.0
これは、1年前のAPIの全面刷新以来、最大規模のリリースとなります。3.5.0では、統一された3D数学レイヤー、Minverse の完全なサポート、型付きイベントストリーム、完全な設定API、より簡潔なHTTPインターフェースが導入されたほか、この1年間にわたるバグ修正やユーザー体験の最適化も盛り込まれています。
見どころ
- 統一された3D数学レイヤー――組み合わせ可能な変換パイプラインにより、デバイス基準座標系(basis/frame)、マウント変換(mount transform)、作業空間変換(workspace transform)、ナビゲーション変換(navigation transform)に対して第一級プリミティブを提供し、ローカル、セッション、アプリケーション、および内部空間間の明示的な変換をサポートします。
- バブルナビゲーション(Bubble Navigation)—— 成形領域(SDF 要素)を用いて大規模な仮想作業空間内をナビゲートします。速度マッピングによる速度制御、ヒステリシスを考慮した衝突検出、およびオプションでカーソル方向へのドリフト機能をサポートしています。HTTP および WebSocket を通じて完全に設定可能で、アプリケーション空間の往復変換にも対応しています。
- タイプ付きイベントストリーム—— デバイスのライフサイクル、セキュリティアラート、校正、バッテリー、制御レートに関する警告、およびサポート終了の通知などを網羅した、専用の WebSocket イベントチャネル。
- 設定 API—— 完全なキーバリュー型設定システムであり、HTTP による CRUD(作成・読み取り・更新・削除)、型ヒント、範囲制限、説明情報をサポートしており、従来のネストされた設定ファイルに取って代わりました。
- 一貫性のあるデバイス設定 —— すべてのデバイスが 1 つの 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」は、公式グリップ製品タイプとして認定されました。
- デバイスエミュレータのサポート—— ソフトウェアによるエミュレートされたデバイスを検出し、それらと通信できるほか、実際のハードウェアとも互換性があります。
- ループ接続保護 —— 異常な動作を示すポートは自動的にブロックされます。以下の方法で
POST /ports/{port}/resetリセット。 - ペンホルダーの装着・取り外し時の心拍検出—— ジッター除去技術を活用し、ペンホルダーの確実な装着・取り外し検出を実現。
会話、コマンド、および WebSocket
- セッションプロファイルのフィルタリングと永続化—— セッションでプロファイル名と必要なSDKバージョンを指定すると、サービスは再接続後もこれらの情報を記憶します。クライアントや監視ツールは、このプロファイルに基づいてセッションをフィルタリングし、特定することができます。
- セッションごとのコマンドバッファ—— 処理が遅い1つのセッションがあっても、他のセッションの動作が遅くなることはなくなりました。
- 単発命令の明示的表現
configureマッピング —— 各機器のbasis、preset、mount、force_gate、damping、および各セッションのprofile和basis,これをまとめてここに配置するconfigureこの際、出力構成のマッピングと一致しているため、送信された内容と読み戻された内容が1対1で対応する。 - カスタマイズ可能なデバイスのマウント —— 組み込みのワークスペースプリセットから選択できます(
defaults、arm_front、arm_front_centered、led_front、led_front_centered),明示的な変換を送信することも可能です。マウントを手動で変更すると、プリセットは自動的にcustom。 - 名前付きコマンドフィールド ——
position、vector、angles、torques汎用的なものに取って代わったvalues配列。 set_angular_torquesに取って代わったset_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 」の使用例)
/inverse3/0/...;すべての Inverse シリーズ機器で使用/inverse*/*/...)。 - 統一されたリクエスト/レスポンスの構造 —— POST/GET リクエスト本文には、WebSocket と同じ
command_dataJSONの構造。ある転送方式向けに記述されたコードは、もう一方の転送方式にも同様に適用できます。 - 選択可能なパッケージ構造 —— 任意のルートに追加する
?format=json有効化できます;/settings*和GET /home_returnデフォルトで戻る{ok, error, data}。元の構造が必要な場合は、以下をご利用ください。?format=plain。 - 会話セレクタのワイルドカード —— プロフィール名称中の
*(任意の文字列)および?(1文字)。 - パーセント記号によるセレクタのデコード ——
%2A、%3Aなど、ルーティングの前にまずデコードされます。
事件
- 所在地:
communication/events/port上の専用のWebSocketイベントストリーム。 - 合計 24 種類のイベントがあり、これにはデバイスのライフサイクル、安全関連イベント(電子ブレーキ(e-brake)、異物検知、ロックアップ)、校正失敗、バッテリーアラート、セッション警告、制御レートが低すぎる/著しく低すぎる、入力検証、および廃止通知などが含まれます。
観測可能性
- パフォーマンス分析の際、ログメッセージはTracyに転送され、ログレベルに応じて色分けされます。
- 各 HTTP ハンドラに Tracy セクションを追加します。
- メインループの計時およびイベントの集計。
- ログディレクトリとサーバーのホスト名を設定できます(Dockerでの使用に便利です)。
バージョン3.6がまもなくリリースされます
- SDF 触覚エフェクト(SDF HFX)—— バージョン 3.5 において基礎的な実装(モジュール、ライフサイクル、モジュールが提供するコマンド/状態のシリアライズ)が完了しており、公開 API および完全なドキュメントはバージョン 3.6 のリリースに合わせて公開される予定です。
改善
- 力振動フィルタ—— 軸ごとの振動検出、8段階の漸進的復帰、ヒステリシスを伴うエントリー投票、および非対称のリリースウィンドウ。
- 実行時ゲート制御フィルタ —— 以下の方法で利用可能です
configure.force_gate.gainWebSocket または HTTP 上で設定を行い、永続化されたデフォルト値が設定されます。 - メインループの最高周波数が 32 kHz に引き上げられ、高精度な用途に適しています。
- WebSocketの負荷をさらに軽減 —— 恒等(identity)のデフォルト値の変換サブフィールド(
position = 0、rotation = identity、scale = 1)はデフォルトで出力されなくなり、これによりデータサイズが縮小され、旧バージョンの Unity における 4 KB のメッセージ上限との互換性が回復されます。2 つの詳細設定(serialization/explicit_fields、serialization/force_complete_transforms)必要に応じて、すべてのフィールドを再度有効にすることができます。 - メインループのジッターを低減—— WebSocket メッセージの処理において、JSON の解析およびネットワーク送信中にメインループのティックがブロックされることがなくなりました。セッションのティックスケジューリングは、レスポンスのシリアライズ前に行われるようになりました。
- サーバーはデフォルトで localhost のみをリッスンします —— インターネットへのアクセスが必要な場合は、以下の方法をご利用ください。
communication/bind_all_interfaces設定を有効にする。 - デバイスセレクタのワイルドカードをプレフィックス構文に変更(例:
inverse*(Inverse シリーズのすべてのデバイスに対応しています)。 - ダンピング指令 移動済み
configureマッピング中、とforce_gateまとめておく。 - ローテーションファイルロガーは、従来のロガーに取って代わり、設定ディレクトリをサポートしています。
- モジュールによるコマンドと状態の提供—— モジュールは、コアスキーマを変更することなく、独自のコマンドや設定フィールドを注入したり、状態出力をWebSocketフレームに書き込んだりすることができます。
修正
1年間にわたる不具合の修正。そのうち、影響が最も大きかった修正を以下に挙げます。
- 会話の速度に異常が見られ、特定の条件下で発生する。
- **GripHook(Verse Grip Stopper)**は、シミュレーションを実行していない状態では、きれいに解放することができません。
- Inverse3 タイムアウトの設定が厳しすぎるため、起動に時間がかかるデバイスが接続切断のループに陥ってしまう。
- Windows では、サービスの停止が不完全な場合があり、シャットダウン時に HTTP サーバーが必ずしもクリーンアップされるとは限りません。
- ループの再接続――サービスが古いファームウェアバージョンに対してサポートされていないコマンドを送信した際に発生します。
- Bluetoothアダプタが搭載されたシステムでは、Bluetoothデバイスの列挙処理により、大量のログが記録されます。
- サービスを連続して複数回再起動すると、クラッシュする。
- Ubuntu搭載のノートパソコンで、スリープ状態からの復帰後に、ワイヤレス「Verse Grip」レシーバーがフリーズしてしまう。
- LinuxおよびmacOS上のWireless Verse Gripは、初回検出に失敗した後、正しくフォールバックするようになりました。
- macOS のプロファイルの保存場所——設定は現在、以下の場所に保存されています
~/Library/Application Support/その中で、誤ったパスは使用されなくなりました。 - LinuxおよびmacOSにおけるSIGSEGVシグナルの処理――マルチスレッドでのクラッシュ捕捉を有効にすると、プロセスは致命的なシグナルによってループに陥らなくなる。
- セッション間のコマンド上書き――あるセッションの設定コマンドが、別のセッションのコマンドによって密かに上書きされることがありましたが、これらは現在、適切にフィルタリングされ、統合されるようになりました。
- 検出コマンドのオーバーライド設定——監視セッション(例:Haply Hub)からの送信
probe_positionこのとき、有効化待ちのbasis / preset / profileの変更を、もはや静かに上書きすることはありません。 - プロトタイプのグリップの表示に誤りがあります――プロトタイプのハードウェアが、カスタムグリップではなく標準グリップとして誤って表示されています。
- 旧版
set_basis行列の表記規則まだ移行されていないクライアントに対して、再度有効にする。 - Inverse3 セッションが切断された際、 フォースキックによる残留力のピーク値は発生しなくなりました。
- WebSocket 接続切断の競合状態――高速な接続・切断の繰り返し中に発生する。
- WebSocket
session_id一部の出力負荷において、次のようにシリアル化される0。 - Windowsでは、同時に
--dev現在はこれに従う--log-level(以前はこっそりとリセットされていたが、現在は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 |
WebSocket command_data.values | position, vector, angles, torques |
WebSocket set_angular_torque | set_angular_torques |
WebSocket probe_cursor_position | probe_position |
WebSocket set_coordinate_origin | configure.preset |
WebSocket セッションレベル set_basis | configure.basis |
互換性に関する説明
3.4.19 と比べて、必須の破壊的変更はありません。既存の統合に関しては、以下の 2 点の注意点が挙げられます:
- 廃止された HTTP エンドポイントは、現在、レスポンスに以下を含めるようになりました
deprecation_warningフィールド――レスポンスのスキーマを厳密に検証するクライアントは、この追加フィールドを許可する必要があります。 - WebSocket
command_dataの中のvaluesこのフィールドは非推奨ですが、引き続き解析されます。名前付きフィールドを優先して使用することをお勧めします。
チュートリアルとドキュメント
- 新しいチュートリアル:05 位置制御、06 組み合わせ(Inverse3 + Verse Grip)、07 基準と取り付け、08 HTTP リモートコンフィギュレータ、09 WebSocket リモート制御、10 イベントストリームリスナー。
- 各 C++ チュートリアルに Glaze バージョンを追加(
cpp-glz/),既存の nlohmann/json バリアントと並存する。 - すべてのチュートリアルは v3.1 API に基づいて書き直されました(ポート 10001、
configure.preset、具名命令フィールド、print_state()補助関数)。 - 以前の「Verse Grip Stopper」のチュートリアルを削除し、新しい組み合わせチュートリアルに置き換えました。
- 公開ドキュメントが更新されました。SDK ガイド、API リファレンス、およびハードウェアのページが含まれています。