WebSocketプロトコル
シミュレーションチャネルは、ポート10001上のWebSocket接続です。これは、 アプリケーションとサービス間の制御ループおよび状態情報をリアルタイムで伝送します。
基本ルール:1つのメッセージにつき1つの返信
このサービスは、クライアントから受信した各メッセージに対して、 正確に1回ずつステータス更新を送信します:
ポーリングも、定期購読も、帯域外からの自発的な送信もありません。送信間隔は 完全に、あなたの送信頻度によって決まります。
ステップ 1 — 初期状況の把握(サービスからの最初のメッセージ)
接続時に、サービスは 完全なスナップショット コンテナ config, state
et status 検出した各デバイスについて:
{
"session_id": 7,
"inverse3": [
{
"device_id": "049D",
"config": {
"type": "inverse3",
"port": "COM12",
"device_info": { "major_version": 7, "minor_version": 4, "id": "049D", "device_type": 4, "uuid": "…" },
"extended_device_id": "…",
"extended_firmware_version": "…",
"gravity_compensation": { "enabled": true, "scaling_factor": 1.0 },
"handedness": "right",
"streaming_mode": "USB",
"torque_scaling": { "enabled": true },
"home_return": { "enabled": false },
"preset": "defaults",
"basis": { "permutation": "XYZ" },
"mount": { "position": { "x": 0, "y": 0, "z": 0 }, "rotation": { "w": 1, "x": 0, "y": 0, "z": 0 }, "scale": { "x": 1, "y": 1, "z": 1 } },
"filters": {
"force_gate": { "gain": 0.3 },
"damping": { "scalar": 0.0 }
}
},
"state": {
"cursor_position": { "x": 0.0, "y": -0.12, "z": 0.15 },
"cursor_velocity": { "x": 0.0, "y": 0.0, "z": 0.0 },
"angular_position": { "a0": 0.0, "a1": 0.0, "a2": 0.0 },
"angular_velocity": { "a0": 0.0, "a1": 0.0, "a2": 0.0 },
"body_orientation": { "w": 1.0, "x": 0.0, "y": 0.0, "z": 0.0 },
"current_cursor_force": { "x": 0.0, "y": 0.0, "z": 0.0 },
"current_cursor_position": { "x": 0.0, "y": 0.0, "z": 0.0 },
"current_angular_torques": { "a0": 0.0, "a1": 0.0, "a2": 0.0 },
"current_angular_position": { "a0": 0.0, "a1": 0.0, "a2": 0.0 },
"control_domain": "cartesian",
"control_mode": "idle",
"transform": { "position": { "x": 0, "y": 0, "z": 0 }, "rotation": { "w": 1, "x": 0, "y": 0, "z": 0 }, "scale": { "x": 1, "y": 1, "z": 1 } },
"transform_velocity": { "position": { "x": 0, "y": 0, "z": 0 }, "rotation": { "w": 1, "x": 0, "y": 0, "z": 0 }, "scale": { "x": 0, "y": 0, "z": 0 } }
},
"status": {
"calibrated": true,
"in_use": false,
"power_supply": true,
"ready": true,
"started": true
}
}
],
"verse_grip": [],
"wireless_verse_grip": []
}
3つのブロックは、それぞれ更新頻度が異なります:
| ブロック | 目次 | 変更点 |
|---|---|---|
config | ファームウェア、プリセット、ベース、マウント、フィルターに関する情報 | ごくまれに — 明示的な設定変更が行われた場合のみ |
state | 位置、速度、力、向き、変換 | 各サイクルごとに(高周波) |
status | 準備完了、校正済み、電源投入、使用中 | 時折(頻度は低い) |
ステップ 2 — 最初の注文を送信してください
初期インベントリを分析してデバイスの識別子を特定し、セッションプロファイル、初期設定、および/または制御コマンドを 含むメッセージを返信してください:
{
"session": {
"configure": {
"profile": { "name": "co.haply.inverse.tutorials:hello-floor" }
}
},
"inverse3": [
{
"device_id": "049D",
"configure": {
"preset": { "preset": "arm_front_centered" }
},
"commands": {
"set_cursor_force": { "vector": { "x": 0.0, "y": 0.0, "z": 0.0 } }
}
}
]
}
ステップ 3 — その後のステータス更新
最初のやり取りの後、このサービスからは state + status (なし
config)、ただし、設定の変更によって完全なスナップショットの送信がトリガーされる場合は除きます:
{
"session_id": 7,
"inverse3": [
{
"device_id": "049D",
"state": { "cursor_position": { … }, "cursor_velocity": { … }, … },
"status": { "ready": true, "calibrated": true, … }
}
]
}
ステップ4 — 繰り返す
注文を送信 → ステータスの更新を受け取る。このサイクルは、お客様が注文を送信する頻度に応じて繰り返されます。
configure ou commands
送信メッセージ内の各デバイスエントリには、2つの辞書を含めることができます:
| 辞書 | 役割 | 粘り強さ |
|---|---|---|
configure | 個別の設定:プリセット、ベース、マウント、フィルター、モジュールの設定 | 変更があるまで記憶されます |
commands | 各サイクルごとの制御:力、位置、トルク | 一度貼ったら、そのまま忘れ去られてしまう |
Voir セッションの設定 以下の
キーの完全なリストについては configure、など 制御コマンド ~の
前菜として commands.
set_transform 例外となるset_transform は、以下の場所にあります commands、しかし彼女は 持続性 — このサービスは、
新しい値が送信されるまで、最後の値を保持します。これは、その機能が
シーン内のナビゲーションにあるためです。つまり、カメラの移動中は変形情報を継続的に送信しますが、ボタンを2回押す間の間、最後の位置はそのまま維持されるようにしたいのです。
指標 execute
すべての入場 configure ou commands 以下を含む場合がある "execute": false その
サービスが 分析および検証 適用せずに有効荷重を算出する。
{
"inverse3": [{
"device_id": "049D",
"configure": {
"preset": { "preset": "arm_front", "execute": true },
"damping": { "scalar": 0.0, "execute": false }
}
}]
}
これは、以下の場合に役立ちます。 反射型シリアライザ (例えば、 JsonUtility (Unityより)
常にすべてのフィールドを出力する:未使用の入力は次のように定義してください execute: false それらが
実際の設定を上書きしないようにするためです。デフォルト値は true — 指定を省略する場合は、
「通常通り適用する」という意味になります。
注意事項
probe_position et probe_orientation これらは、監視専用の接続維持(キープアライブ)メッセージであり、
制御コマンド(例:Haply Hub)を送信しないセッション向けです。セッションがすでに set_cursor_force, set_cursor_positionなど、 また、探査機も送らないでください — デバイスの状態は、各応答にすでに含まれています。
この2つを組み合わせると、帯域幅を無駄に消費し、イベントを引き起こす可能性があります。 session-probe-dropped.
コマンドが効果がないように見える場合は、フィールド名が間違っている可能性があります。 現在、本サービスでは、認識されないJSONキーをエラーを発生させることなく無視しています。サービスのログを確認し、 APIリファレンスでフィールド名を確認してください。この動作は、 今後のバージョンで変更される予定です。