Haply Inverser Dienst
Der Haply Inverse Service ist eine grundlegende Komponente, die die taktilen Geräte von Haply mit interaktiven Anwendungen verbindet und als Windows-Hintergrunddienst läuft, um Interaktionen in Echtzeit zu ermöglichen. Seine Funktionalitäten umfassen:
- Erkennung und Verwaltung von Geräten: Identifiziert und konfiguriert angeschlossene Haply Geräte automatisch.
- Verwaltung der Eigentümerschaft: Verwaltet den Zugriff auf Geräte über mehrere Anwendungen hinweg und gewährleistet so einen reibungslosen Betrieb.
- Status-Streaming in Echtzeit: Liefert Aktualisierungen der Gerätezustände in hoher Frequenz für eine präzise Steuerung.
- Befehlsverarbeitung: Führt Befehle für Kraft oder Position mit hoher Wiedergabetreue aus und verbessert so das haptische Feedback.
- Hintergrundbetrieb: Läuft im Hintergrund und hält das Gerät ohne Benutzereingriff betriebsbereit.
Laufen, anhalten, neu starten
Unter Windows:
- Öffnen Sie die Dienstleistungen Desktop-App: Drücken Sie .
Windows
+R
zum Öffnen des Laufen lassen Feld, geben Sieservices.msc
und drücken Sie dannEnter
oder wählen SieOK
.
Unter Ubuntu:
- Start
systemctl start haply-inverse-service.service
- Stopp
systemctl stop haply-inverse-service.service
- Aktivieren Sie
systemctl enable haply-inverse-service.service
- Deaktivieren Sie
systemctl disable haply-inverse-service.service
Wichtige Dateien
Unter Windows:
- Die Konfigurationsdateien befinden sich in: %PROGRAMDATA%\Haply\Inverse\*-config.json
- Die Protokolldateien befinden sich in: %PROGRAMDATA%\Haply\Inverse\*-log.log
Unter Ubuntu:
- Die Konfigurationsdateien befinden sich in: /etc/haply-inverse-service/*-config.json
- Die Protokolldateien befinden sich in: /var/log/haply-inverse-service/*-log.log
Schnittstellen
Sowohl die HTTP- als auch die Websocket-Schnittstelle verwenden JSON
formatierte Nutzdaten.
HTTP
Standardmäßig wird der HTTP-Dienst eingeschaltet: http://localhost:10000
. Hinweis: Der Anschluss kann in der Konfiguration geändert werden.
Dashboard
Das Dashboard ist verfügbar unter: http://localhost:10000
Version
Methode: GET
URL: http://localhost:10000/3.0/version
Beispiel für eine Antwort:
{
"build_time": "2024-08-07T16:01:53Z",
"git_branch": "main",
"git_describe": "3.0.0-2-gce34c39e",
"git_hash": "ce34c39e",
"git_tag": "3.0.0",
"project_name": "haply-inverse-service",
"project_version": "3.0.0.0"
}
Geräte
Methode: GET
URL: http://localhost:10000/3.0/devices
Beispiel für eine Antwort:
{
"inverse3": {
"049D": {
"config": {
"device_info": {
"firmware_version": 1,
"hardware_version": 7,
"id": "049D",
"model": 4,
"uuid": "5A9F3AC02E085C078AD6A4A113DE049D"
},
"extended_device_id": "5A9F3AC02E085C078AD6A4A113DE049D",
"extended_firmware_version": "77488E4644CB6057D0920B0B919C8B82",
"gravity_compensation": {
"enabled": true,
"scaling_factor": 0.75
},
"handedness": "left",
"torque_scaling": {
"enabled": true
}
},
"device_id": "049D",
"state": {
"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
},
"calibrated": false,
"cursor_position": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"cursor_velocity": {
"x": 0.0,
"y": 0.0,
"z": 0.0
},
"in_use": false,
"mode": "idle",
"power_supply": false,
"ready": false,
"started": false
},
"status": {
"initialization_received": {
"body_orientation": true,
"device_handedness": true,
"device_info": true,
"extended_device_id": true,
"extended_firmware_version": true,
"gravity_compensation": true,
"torque_scaling": true
},
"port": "COM12"
}
}
},
"verse_grip": {
"61582": {
"button": false,
"device_id": "61582",
"error": 0,
"hall": 0,
"orientation": {
"w": 0.17022705078125,
"x": -0.24114990234375,
"y": -0.95538330078125,
"z": -0.001220703125
}
}
},
"wireless_verse_grip": {
"0": {
"battery_level": 0.6200001239776611,
"buttons": {
"a": false,
"b": false,
"c": false
},
"device_id": "0",
"hall": 15,
"orientation": {
"w": -0.906463623046875,
"x": -0.379058837890625,
"y": -0.111785888671875,
"z": -0.136688232421875
}
}
}
}
Kraft-Skala
Methode: POST
URL: http://localhost:10000/3.0/force_scale
Beispiel Körper:
{
"force_scale": 0.5
}
Beispiel für eine Antwort:
{
"ok": true
}
Schwerkraft-Kompensation
Methode: POST
URL: http://localhost:10000/3.0/gravity_compensation
Beispiel Körper:
{
"device_id": "049D",
"enable": true,
"gravity_scaling_factor": 0.8
}
Beispiel für eine Antwort:
{
"ok": true
}
Skalierung des Drehmoments
Methode: POST
URL: http://localhost:10000/3.0/torque_scaling
Beispiel Körper:
{
"device_id": "049D",
"enable": true
}
Beispiel für eine Antwort:
{
"ok": true
}
Handlichkeit des Geräts
Methode: POST
URL: http://localhost:10000/3.0/device_handedness
Beispiel Körper:
{
"device_id": "049D",
"handedness": "right"
}
Beispiel für eine Antwort:
{
"ok": true
}
Websocket
Die Standard-URL für den Websocket lautet ws://localhost:10000
. Hinweis: Der Anschluss kann in der Konfiguration geändert werden.
Initiale Nachricht
Der Dienst sendet eine Nachricht mit der vollständigen Geräteliste, wenn eine Verbindung zu einem Websocket hergestellt wird. Die erste Nachricht hat den folgenden Inhalt JSON
Format:
{
"inverse3": {
"049D": {
"config": {
"device_info": {
"firmware_version": 1,
"hardware_version": 7,
"id": "049D",
"model": 4,
"uuid": "5A9F3AC02E085C078AD6A4A113DE049D"
},
"extended_device_id": "5A9F3AC02E085C078AD6A4A113DE049D",
"extended_firmware_version": "77488E4644CB6057D0920B0B919C8B82",
"gravity_compensation": {
"enabled": true,
"scaling_factor": 0.75
},
"handedness": "left",
"torque_scaling": {
"enabled": true
}
},
"device_id": "049D",
"state": {
"angular_position": {
"a0": -90.40308380126953,
"a1": 3.390819549560547,
"a2": 0.8826223015785217
},
"angular_velocity": {
"a0": 0,
"a1": 0,
"a2": 0
},
"body_orientation": {
"w": 1,
"x": 0,
"y": 0,
"z": 0
},
"calibrated": false,
"cursor_position": {
"x": -0.022379431873559952,
"y": -0.011212021112442017,
"z": -0.11827600002288818
},
"cursor_velocity": {
"x": 0,
"y": 0,
"z": 0
},
"in_use": false,
"mode": "angle",
"power_supply": true,
"ready": true,
"started": true
},
"status": {
"initialization_received": {
"body_orientation": true,
"device_handedness": true,
"device_info": true,
"extended_device_id": true,
"extended_firmware_version": true,
"gravity_compensation": true,
"torque_scaling": true
},
"port": "COM12"
}
}
},
"verse_grip": {
"61582": {
"button": false,
"device_id": "61582",
"error": 0,
"hall": 0,
"orientation": {
"w": 0.156982421875,
"x": -0.24163818359375,
"y": -0.95751953125,
"z": -0.00079345703125
}
}
},
"wireless_verse_grip": {
"0": {
"battery_level": 0.5999999046325684,
"buttons": {
"a": false,
"b": false,
"c": false
},
"device_id": "0",
"hall": 15,
"orientation": {
"w": -0.91265869140625,
"x": -0.389984130859375,
"y": -0.075103759765625,
"z": -0.07635498046875
}
}
}
}
Status Update Nachricht
Wann immer jede der verfügbaren Geräte eine Änderung erfährt, sendet der Dienst eine Statusaktualisierungsnachricht, die den Status von alle Geräte. Die Statusaktualisierungsnachricht hat folgenden Inhalt JSON
Format:
{
"inverse3": {
"049D": {
"state": {
"angular_position": {
"a0": 0,
"a1": 0,
"a2": 0
},
"angular_velocity": {
"a0": 0,
"a1": 0,
"a2": 0
},
"body_orientation": {
"w": 1,
"x": 0,
"y": 0,
"z": 0
},
"calibrated": true,
"cursor_position": {
"x": -0.022203030064702034,
"y": -0.027979673817753792,
"z": -0.1170499324798584
},
"cursor_velocity": {
"x": 0,
"y": 0,
"z": 0
},
"in_use": true,
"mode": "position",
"power_supply": false,
"ready": true,
"started": true
}
}
},
"verse_grip": {
"61582": {
"button": false,
"device_id": "61582",
"error": 0,
"hall": 0,
"orientation": {
"w": 0.15423583984375,
"x": -0.24176025390625,
"y": -0.95794677734375,
"z": -0.0015869140625
}
}
},
"wireless_verse_grip": {
"0": {
"battery_level": 0.5999999046325684,
"buttons": {
"a": false,
"b": false,
"c": false
},
"device_id": "0",
"hall": 15,
"orientation": {
"w": -0.3958740234375,
"x": 0.639190673828125,
"y": -0.404388427734375,
"z": -0.51739501953125
}
}
}
}
Befehlsnachricht
Zum Senden von Befehlen an das inverse3
muss der Client eine Befehlsnachricht senden. Hier ist ein Beispiel:
{
"inverse3": {
"049D": [
{
"command": "set_cursor_force",
"values": {
"x": 0,
"y": 0,
"z": 0
}
}
]
}
}
Es ist auch möglich, Befehle an mehrere Geräte in einer einzigen Nachricht zu senden. Hier ein Beispiel:
{
"inverse3": {
"049D": [
{
"command": "set_cursor_force",
"values": {
"x": 0,
"y": 0,
"z": 0
}
}
],
"049E": [
{
"command": "set_cursor_force",
"values": {
"x": 0,
"y": 0,
"z": 0
}
}
]
}
}
Die folgenden Befehle sind derzeit auf der Website inverse3
:
Cursorposition einstellen
{
"command": "set_cursor_position",
"values": {
"x": 1.0,
"y": 2.0,
"z": 3.0
}
}
Cursorkraft einstellen
{
"command": "set_cursor_force",
"values": {
"x": 0.5,
"y": 0.5,
"z": 0.5
}
}
Winkellage einstellen
{
"command": "set_angular_position",
"values": {
"a0": 1.0,
"a1": 2.0,
"a2": 3.0
}
}
Winkelmoment einstellen
{
"command": "set_angular_torque",
"values": {
"a0": 0.5,
"a1": 0.5,
"a2": 0.5
}
}