WebSocket-Protokoll
Der Simulationskanal ist eine WebSocket-Verbindung überPort 10001. Er überträgt in Echtzeit Befehls- und Statuszyklen zwischen der Anwendung und dem Dienst.
Grundregel: Pro Nachricht eine Antwort
Der Dienst sendet für jede vom Client empfangene Nachrichtgenau eine Statusaktualisierung:
Es gibt weder Polling noch Abonnements noch Out-of-Band-Push-Benachrichtigungen. Das Aktualisierungsintervall hängt ausschließlich von der Übertragungsrate der Anwendung ab.
Schritt 1 – Erstinventarisierung (erste Nachricht vom Dienst)
Beim Herstellen der Verbindung führt der Dienst für alle erkannten Geräte folgende Schritte durch:config、state、status einschließlich Vollständiger Schnappschuss sende:
{
"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": []
}
Die drei Blöcke werden jeweils mit unterschiedlicher Häufigkeit aktualisiert:
| Block | Inhalt | Änderungshäufigkeit |
|---|---|---|
config | Firmware-Informationen, Voreinstellungen, Basis, Halterung, Filter | Wird nur selten geändert – nur bei expliziten Einstellungsänderungen |
state | Position, Geschwindigkeit, Kraft, Lage, Umwandlung | Pro Tick (hohe Frequenz) |
status | Bereit, kalibriert, mit Strom versorgt, in Gebrauch | Gelegentlich (selten) |
Schritt 2 – Den ersten Befehl senden
Das System analysiert das Anfangsinventar, ermittelt die Geräte-ID und sendet eine Nachricht zurück, die das Sitzungsprofil, die Grundeinstellungen (sofern vorhanden) und/oder Steuerbefehle enthält:
{
"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 } }
}
}
]
}
Schritt 3 – Aktualisierung des Status ab diesem Zeitpunkt
Nach dem ersten Austausch löst der Dienst keine vollständige Snapshot-Übertragung aus, es sei denn, es werden Konfigurationsänderungen vorgenommen,state und status Es werden nur folgende Daten gesendet (config (ist nicht enthalten):
{
"session_id": 7,
"inverse3": [
{
"device_id": "049D",
"state": { "cursor_position": { … }, "cursor_velocity": { … }, … },
"status": { "ready": true, "calibrated": true, … }
}
]
}
Schritt 4 – Wiederholung
Wenn Sie einen Befehl senden, erhalten Sie eine Statusaktualisierung. Die Schleife läuft entsprechend der Sendefrequenz weiter.
configure und commands
Jeder Geräteeintrag in der zu sendenden Nachricht kann zwei Zuordnungen enthalten.
| Karte | Zweck | Dauerhaftigkeit |
|---|---|---|
configure | Einmalige Einstellungen: Voreinstellungen, Referenzwerte, Halterung, Filter, Moduleinstellungen | Bis zur Änderung beibehalten |
commands | Steuerung pro Tick: Kraft, Position, Drehmoment | Wird nach der Anwendung verworfen |
configure Eine vollständige Liste der Tasten finden Sie unter Sitzungseinstellungen ,commands Zu den Einträgen Steuerbefehle Siehe dazu.
set_transform Das ist ein Sonderfall.set_transform は commands befindet sich darunter, aberdauerhaft. Der Dienst behält den letzten Wert bei, bis ein neuer Wert gesendet wird. Dies liegt daran, dass sein Zweck in der Navigation durch die Szene besteht. Er wird verwendet, wenn man während der Kamerabewegung die Transformation streamen und gleichzeitig bei jedem Tastendruck die letzte Position beibehalten möchte.
execute Flag
configure oder commands Der Eintrag enthält "execute": false kann einbezogen werden. Dadurch kann der Dienst die Nutzlast anwenden, ohneAnalyse und ÜberprüfungWir führen ausschließlich diese Tätigkeit durch.
{
"inverse3": [{
"device_id": "049D",
"configure": {
"preset": { "preset": "arm_front", "execute": true },
"damping": { "scalar": 0.0, "execute": false }
}
}]
}
Dies gibt stets alle Felder aus.Reflexionsbasierter Serializer(Beispiel: Unity) JsonUtility) ist hilfreich. Bei ungenutzten Einträgen gilt execute: false Bitte nehmen Sie diese Einstellung vor, damit die tatsächlichen Einstellungen nicht überschrieben werden. Die Standardeinstellung lautet true . Wird das Flag weggelassen, bedeutet dies „wie gewohnt anwenden“.
Warnung
probe_position und probe_orientation ist ein reiner Überwachungs-Keepalive für Sitzungen, bei denen keine Steuerbefehle gesendet werden (z. B.Haply Hub). Wenn die Sitzung bereits set_cursor_force、set_cursor_position Wenn Sie beispielsweise Folgendes senden,Bitte senden Sie keine weiteren Sonden.。Der Gerätestatus ist bereits in allen Antworten enthalten. Wenn man beides miteinander vermischt, verschwendet man Bandbreite undsession-probe-dropped Es kann zu einem Ereignis kommen.
Falls der Befehl keine Wirkung zu zeigen scheint, ist möglicherweise der Feldname falsch. Der Dienst ignoriert derzeit nicht erkannte JSON-Schlüssel ohne Fehlermeldung. Überprüfen Sie bitte das Protokoll des Dienstes und stellen Sie sicher, dass der Feldname mit der API-Referenz übereinstimmt. Dieses Verhalten wird sich in zukünftigen Versionen ändern.