Zum Hauptinhalt springen
Version: 3.0.2

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

Ö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.

Wichtige Dateien

  • Die Konfigurationsdateien befinden sich in: %PROGRAMDATA%\Haply\Inverse\*-config.json
  • Die Protokolldateien befinden sich in: %PROGRAMDATA%\Haply\Inverse\*-log.log

Schnittstellen

Sowohl die HTTP- als auch die Websocket-Schnittstelle verwenden JSON formatierte Nutzdaten.

Infos

Wenn Sie die Position des Endeffektors lesen, müssen Sie einen Kraftwert an das Gerät senden (auch wenn die Kraftwerte alle Nullen sind).

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. Wenn Sie den Zustand der Maschine wissen wollen, müssen Sie ihr vorher eine Nachricht senden, z. B. einen Kraftwert (auch wenn die Werte Nullen sind). Dies ist besonders wichtig, wenn unsere Geräte als Eingabegerät verwendet werden, z. B. um die Position zu verfolgen und keine Kraft anzuwenden. Die Zustandsaktualisierungsnachricht 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
}
}