# appRobotHoming `appRobotHoming` ist die browserbasierte Bedienoberfläche für die WebCam-gestützte Ermittlung der Roboterpose. Das Frontend bleibt der Einstieg; die eigentliche Bildverarbeitung läuft hinter der Firewall auf eigenen Services (WebCam, BodyTracker), die der Homing-Backend als schlanker Proxy anspricht. ## Architektur im Überblick ``` Browser ──HTTPS──▶ Reverse-Proxy ──HTTPS/WSS──▶ appRobotHoming-Backend (statisches UI) (öffentliches TLS) (server/server.js, Port 2093) │ intern (hinter der Firewall, HTTP): ├──▶ WebCam-Service (Bilder) ├──▶ BodyTracker-Service (Pose) └──▶ … weitere Schritte (später) ``` - **Frontend (`public/`)** – statische Seite: zeigt Infos, Buttons und die Rückmeldungen (Result als JSON + Tree-View, Snapshot-Tabelle, Bilder). Kein direkter Zugriff auf die internen Services. - **Backend (`server/server.js`)** – BFF-Proxy. Liefert das statische Frontend aus und stellt eine kleine API bereit, über die das UI an die internen Services kommt. Läuft auf **HTTPS, Port 2093**. ## Ablauf 1. Das UI lädt den aktuellen Stand über `GET /api/latest-snapshot`. 2. **Bilder und Kamera-Intrinsics kommen vom WebCam-Service** (eigener Server hinter der Firewall; die Kamera ist Source of Truth ihrer eigenen Kalibrierung). 3. Auf Knopfdruck schickt das UI eine Pose-Anfrage an `POST /api/estimate`. 4. Der Backend reicht **Bilder + Intrinsics** zur Verarbeitung an den **BodyTracker** weiter und erhält die Roboterpose zurück. 5. Das Ergebnis wird im UI ausgegeben (JSON, Tree, Tabelle, annotierte Bilder). 6. **Eventuell folgen weitere Schritte** (z. B. Pose an `appRobotDriver` geben). Fällt der BodyTracker aus, rechnet das Frontend ersatzweise lokal mit `public/calculateAngles.js`. ## HTTPS (bewusste Entscheidung) Der Backend läuft selbst auf **HTTPS** – auch wenn davor schon ein Reverse-Proxy die öffentliche TLS-Terminierung übernimmt. Grund: **WebSocket-Verbindungen (WSS) kommen nur sauber durch den Proxy, wenn auch der Backend-Hop TLS spricht.** - Das verwendete Zertifikat ist **self-signed** (`https/`, Passphrase `abcd`). Das ist Absicht: Dieser Hop ist nur **Proxy ↔ Backend**, nie öffentlich. Die vertrauenswürdige Kette stellt der vorgelagerte Reverse-Proxy bereit. - Zugriff im internen Netz z. B. über `https://thinkcentre.local:2093/`. ## API (Backend) | Endpoint | Methode | Zweck | |---|---|---| | `/api/health` | GET | Status + konfigurierte Service-URLs | | `/api/latest-snapshot` | GET | Aktuelle Bilder/Daten (vom WebCam-Service bzw. lokalem Fallback) | | `/api/estimate` | POST | Bilder an BodyTracker geben → Pose zurück | ## Konfiguration (Umgebungsvariablen) | Variable | Bedeutung | |---|---| | `HTTPS_PORT` | Port des Backends (Default `2093`) | | `WEBCAM_URL` | Basis-URL des internen WebCam-Services | | `BODYTRACKER_URL` | Basis-URL des internen BodyTracker-Services | | `HTTPS_KEY_PATH` / `HTTPS_CERT_PATH` / `HTTPS_PASSPHRASE` | self-signed Cert für den Proxy-Hop | Ist `WEBCAM_URL` nicht gesetzt, nutzt der Backend lokale Dateien aus `public/snapshots` als Fallback (Entwicklung ohne Kamera). ## Dateien & Struktur - `public/` – statisches Frontend (UI, Client-Logik, Anzeige). - `server/server.js` – HTTPS-Backend / BFF-Proxy. - `https/` – self-signed Zertifikate für den Proxy-Hop (nicht eingecheckt). - `doc/README_WebCam.md` – WebCam-Service (Bildquelle). - `doc/README_BodyTracker.md` – BodyTracker-Service (Pose-Ermittlung). - `doc/ToDo.md` – offene Punkte & nächste Umsetzungsschritte. - `test/` – Tests für Berechnung und Auswertung. ## Nutzung ```bash npm install npm test npm start # startet den HTTPS-Backend auf Port 2093 ``` Danach im internen Netz `https://:2093/` öffnen (self-signed → einmalige Zertifikatswarnung im Browser bestätigen). > Hinweis: Das Frontend ist auf den Backend angewiesen – `/api/latest-snapshot` > und `/api/estimate` funktionieren **nicht**, wenn man `index.html` rein > statisch öffnet. Immer über `npm start` (bzw. den Container) laufen lassen. ## Geplante Erweiterungen 1. Pose an `appRobotDriver` weitergeben. 2. Wenn die Hand nicht erkannt wird: Vorschlag für eine bessere Arm-/Foto-Position. 3. Manuelle Eingabe von `x, y, z, a, b, c, e`. 4. Erkennungsergebnis und Pose klarer im UI ausgeben. Konkrete nächste Schritte und offene Schnittstellen-Fragen: siehe [`doc/ToDo.md`](doc/ToDo.md).