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:
| Bedienung | Anleitung | Typische Anwendungsbeispiele |
|---|---|---|
configure.mount — Persistente Mount-Umwandlungen | 08 | Einmalige Konfiguration (oder nur sehr seltene Änderungen) zur Beschreibung der physischen Installation des Geräts |
set_transform — Persistente Arbeitsbereichstransformationen | 09(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.
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.
Ö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
- Python
- C++
Halten Sie eine Taste gedrückt, um sich fortlaufend zu bewegen; lassen Sie sie los, um anzuhalten.
| Taste | Bedienung |
|---|---|
→ / ← | +X / −X |
↑ / ↓ | +Y / −Y |
Page Up / Page Down | +Z / −Z |
= / - | Navigationsgeschwindigkeit erhöhen / verringern |
0 | Den Arbeitsbereich auf den Ursprung zurücksetzen |
H | Hilfe anzeigen |
Esc | Beenden (Ctrl+C (ebenso wirksam) |
Eingabe zeilenweise – nach der Eingabe die ENTER-Taste drücken.
| Befehl | Bedienung |
|---|---|
x+[N] / x-[N] | Stellen Sie die X-Geschwindigkeit auf ±N mm/Bild ein (direkte Eingabe) x+ (dann wird die aktuelle Standardgeschwindigkeit verwendet) |
y+[N] / y-[N] | Stellen Sie die Y-Geschwindigkeit auf ±N mm/Bild ein |
z+[N] / z-[N] | Stellen Sie die Z-Geschwindigkeit auf ±N mm/Bild ein |
s+[N] / s-[N] | Standardgeschwindigkeit um ±N mm/Bild anpassen |
stop | Alle Geschwindigkeiten auf Null setzen |
reset | Geschwindigkeit auf Null setzen und zum Ursprung zurückkehren |
h | Hilfe anzeigen |
Drücken Sie Strg+C(oder Strg+D / EOF), um das Programm zu beenden.
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 UnterschiedBeide 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:
| Thread | Aufgaben |
|---|---|
| Hauptthread | Lesen std::getline(std::cin, ...), Token analysieren, aktualisieren nav_vel[] und default_step |
| WebSocket-Callback-Thread | Verwendung 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
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