# 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://<host>: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).
