Zum Hauptinhalt springen

09. WebSocket-Arbeitsbereichs-Navigator

durch Streaming über den WebSocket-Kanal set_transform Befehle für Echtzeit-NavigationsgeräteStandort des Arbeitsbereichs。In diesem Tutorial werden HTTP-Sitzungen und Geräte ermittelt (im Gegensatz zu Tutorial 08 (absolut identisch), dann wird ein WebSocket geöffnet, über den bei jedem Tick Positionsaktualisierungen gesendet werden.

Die folgende Tabelle verdeutlicht den Unterschied zwischen den beiden Transformationsoperationen:

BedienungAnleitungTypische Anwendungsbeispiele
configure.mount — Persistente Mount-Umwandlungen08Einmalige Konfiguration (oder nur sehr seltene Änderungen) zur Beschreibung der physischen Installation des Geräts
set_transform — Persistente Arbeitsbereichstransformationen09(dieses Tutorial)Ebenfalls persistent, kann jedoch bei jedem Tick im Streaming-Verfahren gesendet werden und dient der Navigation im Arbeitsbereich in Echtzeit

Beide Befehle können über HTTP und WebSocket verwendet, und zwar allepersistent——Der Dienst speichert den zuletzt von Ihnen übermittelten Wert. Der Unterschied zwischen den beiden liegt in ihrem Verwendungszweck und der Aktualisierungshäufigkeit:configure.mount Es wurde für seltene Aktualisierungen (physikalische Einstellungen) optimiert, während set_transform Für die hochfrequente Streaming-Übertragung (Szenennavigation) wurde eine Optimierung vorgenommen.

Wenn der Ursprung des Arbeitsraums einem Objekt folgen soll, dessen Position sich während der Ausführung ändert, verwenden Sie bitte set_transform——Beispiele hierfür sind die Nachführung von Handbewegungen, die Animation programmierter Versätze oder die Feinjustierung des virtuellen Arbeitsraums durch den Bediener in Echtzeit.

Zwischen Mounts und Arbeitsbereichen besteht eine Eltern-Kind-Beziehung

Für sich genommen,configure.mount und set_transform Es scheint, als würden sie denselben Effekt erzielen, doch zwischen beiden besteht ein Unterschied.Vater-Sohn-Beziehung: In der Koordinatenkette wird die Arbeitsraumtransformation auf die Befestigung angewendetdarüber hinaus(device → basis → mount → workspace → application). Die vollständige Liste finden Sie unter Einbinden und Arbeitsbereiche。

Anwendungsszenarien​

  • Navigation im Arbeitsraum in Echtzeit. Verschieben Sie den Cursor im Arbeitsraum des mobilen Geräts (d. h. den Bereich, den der End-Effektor erreichen kann), ohne die haptische Szene anzuhalten.
  • Bedienergeführte Ausrichtung. Lassen Sie die Person am anderen Terminal die Pfeiltasten gedrückt halten, um den Arbeitsbereich zu verschieben, während die Haupt-Haptik-Anwendung läuft – geeignet für die Desktop-Kalibrierung jedes Benutzers während einer Echtzeit-Sitzung.
  • Programmgesteuerte Bewegungen im Arbeitsbereich. Die Position im Arbeitsbereich wird über Skripte (audio- oder physikgesteuert usw.) gesteuert, wobei bei jedem Tick lediglich ein Transformations-Patch gesendet wird, der ausschließlich die Position enthält.

Voraussetzungen​

Für Tutorial 09 wird eineaktive WebSocket-Sitzungbenötigt – das heißt, es muss bereits ein Client unter Inverse3 im laufenden Tactile-Loop vorhanden sein. Tutorial 09 stellt anschließend eine Verbindung zu dieser Sitzung her und verschiebt deren Arbeitsbereich in Echtzeit.

Der schnellste Weg, eine Sitzung zu starten

Öffnen Sie den „Haply “-Hub und startenSie die Orb-Demo. Dadurch wird eine dauerhafte haptische Sitzung eröffnet, die Sie sofort als Ziel verwenden 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 rendert eine Kugel am Ursprung des Arbeitsbereichs – mit der Anleitung 09 „Arbeitsbereich verschieben“ können Sie die gesamte Szene in Echtzeit verschieben und erhalten so sofort visuelles Feedback.

Dies gilt auch für alle anderen Tutorials, die den Haptic-Zyklus ausführen (01 – 07). Starten Sie diesen zunächst in einem Terminal und starten Sie anschließend Tutorial 09 in einem zweiten Terminal, damit die Sitzung interaktiv erkannt wird.

Verwendung​

# 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

Steuerung​

Halten Sie eine Taste gedrückt, um sich fortlaufend zu bewegen; lassen Sie sie los, um anzuhalten.

TasteBedienung
→ / ←+X / −X
↑ / ↓+Y / −Y
Page Up / Page Down+Z / −Z
= / -Navigationsgeschwindigkeit erhöhen / verringern
0Den Arbeitsbereich auf den Ursprung zurücksetzen
HHilfe anzeigen
EscBeenden (Ctrl+C (ebenso wirksam)

Funktionsweise​

Schritt 1 – HTTP-Sitzung und Geräteerkennung​

In diesem Tutorial wird die Wiederverwendung von und Tutorial 08 Das Gleiche discover_session() / discover_device() Hilfsfunktion: Zuerst ausführen GET /sessions(Falls angegeben wurde, --session, dann ist GET /sessions/<selector>), dann führen Sie Folgendes aus: GET /devices(oder direkt verwenden --device). Beide Hilfsfunktionen akzeptieren dieselben Befehlszeilenargumente, und SESSION_HELP Der Text stimmt vollständig überein – die Selektoren aus den Tutorials 00 oder 08 können hier ohne Änderungen verwendet werden.

Schritt 2 – Handshake zwischen WebSocket-Sitzung und erster Nachricht​

In diesem Tutorial wird eine Verbindung zu ws://localhost:10001 WebSocket.Nur beim Empfang der ersten Nachricht, wobei es Informationen zur Registrierung der Sitzungskonfiguration sendet:

{
"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 Ticks werden weggelassen session Feld – Nur senden inverse3 Befehlsarray.

Schritt 3 – Bei jedem Tick set_transform​

set_transform AkzeptierenTeilweise Transformation——Geben Sie einfach die Felder an, die Sie ändern möchten. In diesem Tutorial wird nur die Position gesendet; Drehung und Skalierung behalten die Standardwerte der Sitzung bei (d. h. configure.mount (die eingestellten Werte, falls vorhanden).

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

Die Position wird Tick für Tick akkumuliert. Bei einer Frequenz von etwa 1 kHz wendet der Dienst die Berechnung bei jedem Tick erneut an. set_transform(Beibehaltung der nullten Ordnung), daher bleibt der Arbeitsbereich an der Position, an der Sie zuletzt gepusht haben.

set_transform und configure.mount Der Unterschied

Beide Befehle speichern für jede Sitzung eine persistente Transformation, doch in der Pipeline befindet sich die Arbeitsbereichstransformation im Mount.darüber hinaus(siehe Einbinden und Arbeitsbereiche). Wenn Tutorial 09 bei jedem Tick datenstromartig sendet set_transform In diesem Fall ersetzt jeder neue WebSocket-Frame die zuvor gestreamte Arbeitsbereichstransformation – daher wird jeder weitere Frame, der an dasselbe Gerät gestreamt wird, set_transform des Clients werden beim nächsten Tick überschrieben.configure.mount Sie sind voneinander unabhängig und behalten ihren Wert bei. In der Praxis wird für jede Aufgabenart ein Kanal ausgewählt: „Mount“ dient zur physischen Konfiguration,set_transform Zur Echtzeit-Navigation.

Thread-Modell (C++)​

In diesem C++-Tutorial wird ein Positionszähler von zwei Threads gemeinsam genutzt:

ThreadAufgaben
HauptthreadLesen std::getline(std::cin, ...), Token analysieren, aktualisieren nav_vel[] und default_step
WebSocket-Callback-ThreadVerwendung nav_vel[] * dt Vorantreiben nav_pos[], Serialisierung set_transform und senden

std::mutex nav_mutex Schutz nav_pos[]、nav_vel[] und default_step。last_tick Zeitstempel und first_ws_msg „mark“ ist eine lokale Variable für den WS-Callback, für die kein Exklusiv-Lock erforderlich ist.

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

Quellcode​

Im Lieferumfang des SDK-Installationsprogramms enthalten

Tutorial 09 wurde zusammen mit dem SDK lokal installiert. Bitte suchen Sie im Installationsverzeichnis des Dienstes nach tutorials/09-haply-inverse-ws-remote-control/ dort suchen.

Verwandte Themen: set_transform Befehl · Sitzung – Handshake bei der ersten Nachricht · Einbinden und Arbeitsbereiche · Selektor · Tutorial 08 – HTTP-Fernkonfiguration · Tutorial 07 – Basis und Einbinden