Zum Hauptinhalt springen
Version: 3.0.6

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 Sie services.mscund drücken Sie dann Enter oder wählen Sie OK.

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

Unter OSX:

  • Die Konfigurationsdateien befinden sich in: $TMPDIR/Haply/Inverse/*-config.json
  • Die Protokolldateien befinden sich in: $TMPDIR/Haply/Inverse/*-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
}

Konfiguration speichern

Funktioniert nur mit Inverse3 Geräten. Warnung: Vermeiden Sie es, die Konfiguration zu oft zu speichern, da es nur eine begrenzte Anzahl von Speicherungen gibt, die auf ein bestimmtes Gerät angewendet werden können.

Methode: POST

URL: http://localhost:10000/3.0/save_configuration

Beispiel Körper:

{
"device_id": "049D"
}

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
}
}