Zum Hauptinhalt springen

09. WebSocket-Arbeitsbereichs-Browser

Navigieren Sie durch die Position des Arbeitsbereichs des Geräts in Echtzeit durch das kontinuierliche Senden von Befehlen set_transform über den WebSocket-Kanal. Das Tutorial nutzt HTTP, um die Sitzung und das Gerät zu ermitteln (genau wie das Tutorial 08), und eröffnet anschließend eine WebSocket-Verbindung, um in jedem Zyklus Positionsaktualisierungen zu übertragen.

Dies veranschaulicht den Unterschied zwischen zwei Transformationsvorgängen:

OperationAnleitungTypische Verwendung
configure.mount — dauerhafte Montageumwandlung08Wird nur einmal (oder selten) festgelegt, um den physikalischen Aufbau des Geräts zu beschreiben
set_transform — kontinuierliche Umgestaltung des Arbeitsraums09 (dieses Tutorial)Ebenfalls persistent, kann jedoch in jedem Zyklus kontinuierlich übertragen werden, um eine Echtzeit-Navigation im Arbeitsbereich zu ermöglichen

Beide Befehle sind verfügbar über HTTP und WebSocket, und beide sind mehrjährig : Der Dienst speichert den zuletzt von Ihnen übermittelten Wert. Der Unterschied liegt im Zweck und in der Häufigkeit der Aktualisierung: configure.mount ist für seltene Aktualisierungen optimiert (physische Installation), während set_transform ist für eine hochfrequente kontinuierliche Datenübertragung (Navigation innerhalb der Szene) optimiert.

Verwenden Sie set_transform wenn die Position des Arbeitsbereichs etwas nachverfolgen muss, das sich zur Laufzeit ändert: einer Hand folgen, eine prozedurale Verschiebung animieren oder einem Bediener ermöglichen, den virtuellen Arbeitsbereich in Echtzeit zu verschieben.

Der Schnitt und der Arbeitsbereich sind miteinander verflochten

Für sich genommen, configure.mount et set_transform scheinen dieselbe Wirkung zu haben, aber sie sind ineinander verschachtelt : In der Koordinaten-Pipeline wird die Arbeitsraumtransformation angewendet darüber die Montage (device → basis → mount → workspace → application). Siehe Montage und Arbeitsbereich für die gesamte Pipeline.

Anwendungsfälle​

  • Direkte Navigation im Arbeitsbereich. Verschieben Sie den Arbeitsbereich des Gerätecursors (den begrenzten Bereich, den der Effektor erreicht), ohne die haptische Szene zu unterbrechen.
  • Vom Bediener gesteuerte Ausrichtung. Lassen Sie jemanden an einem zweiten Terminal die Pfeiltasten gedrückt halten, um den Arbeitsbereich zu verschieben, während die haaptische Hauptanwendung läuft – nützlich für die Kalibrierung am Arbeitsplatz während einer Live-Sitzung.
  • Verfahren zur Verschiebung des Arbeitsbereichs. Steuern Sie die Position des Arbeitsbereichs über ein Skript (audioabhängig, physikgesteuert usw.), indem Sie in jedem Zyklus Transformationskorrekturen senden, die sich ausschließlich auf die Position beziehen.

Voraussetzungen​

Für Tutorial 09 ist eine aktive WebSocket-Sitzung erforderlich – ein Client, bei dem bereits „ Inverse3 “ in einer laufenden haptischen Schleife ausgeführt wird. Tutorial 09 verbindet sich anschließend mit dieser Sitzung und verschiebt dessen Arbeitsbereich in Echtzeit.

Der schnellste Weg, eine Sitzung zu starten

Öffnen Sie den „Haply -Hub“ und starten Sie die Orb-Demo. Dadurch wird eine dauerhafte haptische Sitzung eröffnet, auf die Sie sofort zielen können:

./09-haply-inverse-ws-remote-control --session co.haply.hub::demo-orb
python 09-haply-inverse-ws-remote-control.py --session "co.haply.hub::demo-orb"

Die Orb-Szene zeigt eine Kugel am Ursprung des Arbeitsbereichs an – wenn Sie den Arbeitsbereich gemäß Tutorial 09 verschieben, wird die gesamte Szene in Echtzeit mitverschoben, sodass Sie sofort ein visuelles Feedback erhalten.

Jedes andere Tutorial (01 bis 07), das eine haptische Schleife ausführt, funktioniert ebenfalls. Starten Sie es in einem ersten Terminal, starten Sie dann das Tutorial 09 in einem zweiten Terminal und lassen Sie es die Sitzung interaktiv erkunden.

Nutzung​

# Discover session interactively, use first detected device
./09-haply-inverse-ws-remote-control
python 09-haply-inverse-ws-remote-control.py

# Target the Haply Hub Orb demo directly
./09-haply-inverse-ws-remote-control --session co.haply.hub::demo-orb
python 09-haply-inverse-ws-remote-control.py --session "co.haply.hub::demo-orb"

# Target a session directly, specify device
./09-haply-inverse-ws-remote-control --session :my_profile:0 --device A14
python 09-haply-inverse-ws-remote-control.py --session "#42" --device A14

Bestellungen​

Halten Sie eine Taste gedrückt, um sich kontinuierlich zu bewegen. Lassen Sie die Taste los, um anzuhalten.

ToucheAktion
→ / ←+X / −X
↑ / ↓+Y / −Y
Page Up / Page Down+Z / −Z
= / -Navigationsgeschwindigkeit erhöhen / verringern
0Arbeitsbereich auf die ursprünglichen Einstellungen zurücksetzen
HHilfe anzeigen
EscDrückeberger (Ctrl+C (funktioniert auch)

Funktionsweise​

Schritt 1 – HTTP: Erkennung der Sitzung und des Geräts​

Das Tutorial verwendet dieselben Hilfsfunktionen discover_session() / discover_device() dass er Tutorial 08 : GET /sessions (oder GET /sessions/<selector> avec --session), dann GET /devices (oder direkte Nutzung von --device). Beide Funktionen akzeptieren dieselben CLI-Optionen, mit einem Text SESSION_HELP Identisch: Ein Selektor aus dem Tutorial 00 oder 08 funktioniert hier ohne Änderungen.

Schritt 2 – WebSocket-Sitzung, Aushandlung bei der ersten Nachricht​

Das Tutorial öffnet einen WebSocket zu ws://localhost:10001. Au nur die erste erhaltene Nachricht, sendet er die Aufzeichnung des Sitzungsprofils:

{
"session": {"configure": {"profile": {"name": "co.haply.inverse.tutorials:ws-remote-control"}}},
"inverse3": [{"device_id": "...", "commands": {"set_transform": {"transform": {"position": {"x": 0, "y": 0, "z": 0}}}}}]
}

Die folgenden Häkchen werden weggelassen session — nur die Schalttafel inverse3 wird versendet.

Schritt 3 — set_transform bei jedem Tick​

set_transform akzeptiert eine partielle Transformation — nur die Felder, die Sie ändern möchten. In dieser Anleitung wird nur die Position übermittelt; Rotation und Skalierung behalten ihre Standardwerte für die Sitzung bei (die von configure.mount, falls zutreffend).

{
"inverse3": [{"device_id": "...", "commands": {"set_transform": {"transform": {"position": {"x": 0.02, "y": 0.0, "z": 0.01}}}}}]
}

Die Position wird Tick für Tick ermittelt. Bei etwa 1 kHz wird der Dienst erneut angewendet. set_transform bei jedem Tick (Beibehaltung der Ordnung Null), sodass der Arbeitsbereich an der zuletzt gesendeten Position verbleibt.

set_transform ou configure.mount

Beide Befehle speichern eine dauerhafte Transformation pro Sitzung, doch die Transformation des Arbeitsbereichs erfolgt darüber Die Montage in der Pipeline (siehe Montage und Arbeitsbereich). Während das Tutorial 09 läuft set_transform Bei jedem Tick ersetzt jeder neue WebSocket-Frame die zuvor gesendete Arbeitsbereichstransformation; somit kann jeder andere Client, der set_transform in Richtung desselben Instruments wird beim nächsten Tick überschrieben. configure.mount ist unabhängig und behält seinen Wert. In der Praxis sollten Sie pro Thema einen Kanal wählen: „Montage“ für die physische Konfiguration, set_transform für die Live-Navigation.

Thread-Modell (C++)​

Das C++-Tutorial verwendet zwei Threads, die sich einen Positionszähler teilen:

ThemaRolle
ThemenleiterLit std::getline(std::cin, ...), analysiert die Token, aktualisiert nav_vel[] et default_step
WebSocket-ErinnerungsthreadVorangetrieben nav_pos[] avec nav_vel[] * dt, serialisieren set_transform und schickt es ihm

std::mutex nav_mutex Schutz nav_pos[], nav_vel[] et default_step. Die Zeitstempelung last_tick und der Indikator first_ws_msg Sie sind lokal im WS-Aufruf und benötigen keine Mutexe.

ws.onmessage = [&](const std::string &) {
float pos_snap[3];
{
std::lock_guard<std::mutex> lk(nav_mutex);
for (int i = 0; i < 3; ++i) nav_pos[i] += nav_vel[i] * 0.001f; // mm/frame → m
for (int i = 0; i < 3; ++i) pos_snap[i] = nav_pos[i];
}
// build and send set_transform with pos_snap
};

Quelle​

Im Lieferumfang des SDK-Installationsprogramms enthalten

Das Tutorial 09 wird lokal zusammen mit dem SDK installiert – siehe tutorials/09-haply-inverse-ws-remote-control/ im Installationsverzeichnis des Dienstes.

Siehe auch: Bestellung set_transform · Sitzungen – Verhandlung bei der ersten Nachricht · Montage und Arbeitsbereich · Wahlschalter · Tutorial 08 – HTTP-Konfiguration per Fernzugriff · Tutorial 07 – Grundlagen und Montage