From 0cb2bae554dafb04bbfe32634ff728023129b05b Mon Sep 17 00:00:00 2001 From: chk <79915315+ChKendel@users.noreply.github.com> Date: Sun, 14 Jun 2026 16:42:17 +0200 Subject: [PATCH] Phasen aufteilung ToDo --- doc/Homing_ROADMAP.md | 116 +++++++++++++++++++++++++++++------------- 1 file changed, 82 insertions(+), 34 deletions(-) diff --git a/doc/Homing_ROADMAP.md b/doc/Homing_ROADMAP.md index 3fe5ef8..177db8a 100644 --- a/doc/Homing_ROADMAP.md +++ b/doc/Homing_ROADMAP.md @@ -314,43 +314,91 @@ automatisch die aktuelle Konfiguration. --- -## Reihenfolge der Implementierung +## To-Do / Fortschritt -``` -[Jetzt] Arm-Marker eintragen (Nutzer) - → Arm1 Joint-Origin Button klicken (bereits ausführbar) +### Voraussetzungen (Kalibrierung abschliessen) -[0] Refactor: Snapshot+1+2+3b aus /api/board/run - in runBoardPipeline(runDir, send) auslagern - → wird von Board-Run UND Homing genutzt - -[1] POST /api/homing/run + homingOrchestrator.js - → runBoardPipeline() + 4b-Schleife als SSE - → SCRIPT_4B-Konstante in server.js ergänzen - → Minimale UI: nur Log + Raw JSON - -[2] public/homing.html - → Vollständige UI mit allen Sektionen - → Link von index.html - -[3] POST /api/homing/send-state - → ROBOT_URL/api/state aufrufen (analog zu robotActions.js) - -[4] robot.json via Driver-API (wenn ROBOT_URL verfügbar) - → Nur wenn Driver den Endpunkt implementiert -``` +- [x] Kamera-Intrinsik (NPZ) kalibriert +- [x] Board-Marker-Positionen kalibriert +- [x] X-Achsen-Richtung kalibriert +- [x] Arm1 Joint-Origin Y/Z — Button in `calibration_arm.html` ausführbar +- [ ] **Arm-Marker eintragen** (Nutzer): `links.Arm1.markers`, `links.Ellbow.markers`, `links.Arm2.markers`, `links.Hand.markers` in `scripts/robot_*.json` +- [ ] Arm1 Joint-Origin Y/Z Button klicken + in robot.json gespeichert --- -## Status-Tabelle +### Phase 0 — Refactor: Board-Pipeline auslagern -| Schritt | Was | Status | -|---------|-----|--------| -| Scripts 1, 2, 3b, 4b | Homing-Scripts | ✅ vorhanden | -| Kalibrierung | Kamera, Board, X-Achse | ✅ fertig | -| Arm1 Joint-Origin | Button in calibration_arm.html | ✅ **ausführbar** | -| Arm-Marker | robot.json links.Arm1/… .markers | 🔶 Nutzer trägt ein | -| `/api/homing/run` | Backend-Orchestrierung | ❌ zu implementieren | -| `homing.html` | Frontend-UI | ❌ zu implementieren | -| `/api/homing/send-state` | State an Roboter | ❌ zu implementieren | -| robot.json via API | Driver-Integration | ⏳ nach allem anderen | +- [ ] Funktion `runBoardPipeline(runDir, send)` in `server/server.js` extrahieren + - [ ] Bestehende Logik aus `POST /api/board/run` (Zeile ~520–606) in Funktion verschieben + - [ ] `POST /api/board/run` ruft `runBoardPipeline()` auf (Verhalten unverändert) + - [ ] Rückgabewert: `runDir` (String, Pfad zum Lauf-Verzeichnis) + - [ ] Test: Board-Run funktioniert weiterhin identisch + +--- + +### Phase 1 — Backend `POST /api/homing/run` + +- [ ] Konstante `SCRIPT_4B` in `server/server.js` ergänzen (analog zu `SCRIPT_1`, `SCRIPT_3B` etc.) +- [ ] `server/homingOrchestrator.js` erstellen + - [ ] `estimateXFromMarkers(arucoJsonPath)` implementieren (X aus triangulierten Marker-Positionen) + - [ ] `runHoming({ robotJsonPath, send })` implementieren + - [ ] `runBoardPipeline()` aufrufen → `runDir` + `aruco_marker_poses.json` + - [ ] X-Position berechnen + - [ ] 4b-Schleife: Arm1 → Ellbow → Arm2 → Hand (sequenziell, `--from-state`) + - [ ] `send({ type: 'done', state: accumulated_state, runDir })` +- [ ] Route `POST /api/homing/run` in `server/server.js` registrieren (SSE-Stream) +- [ ] Minimale Test-UI (temporär): Fetch + Log im Browser-Konsole genügt + +--- + +### Phase 2 — Frontend `public/homing.html` + +- [ ] Datei `public/homing.html` erstellen + - [ ] Sektion **Aktionen**: Button „Foto & Homing berechnen", Button „An Roboter senden" (disabled) + - [ ] Sektion **Ausgabe / Log**: SSE-Stream-Ausgabe, Schritt-Fortschritt + - [ ] Sektion **Analysis & Reasoning**: Zwischenergebnisse je Script als JSON + - [ ] Sektion **Result Raw JSON** + **Result Tree View**: `{ x, y, z, a, b, c, e }` + - [ ] Sektion **Snapshot CSV**: Marker-Tabelle (ID, Link, x, y, z, Residual) + - [ ] Sektion **Snapshots**: annotierte Kamerabilder (cam0, cam1, …) +- [ ] `public/homing.js` erstellen + - [ ] `runHoming()`: POST + SSE-Stream lesen, Log befüllen + - [ ] `showResult(state)`: Tree View + Raw JSON befüllen, Send-Button aktivieren + - [ ] `sendToRobot(state)`: POST `/api/homing/send-state` +- [ ] Link-Button von `public/index.html` zu `homing.html` ergänzen + +--- + +### Phase 3 — State an Roboter senden + +- [ ] Route `POST /api/homing/send-state` in `server/server.js` registrieren + - [ ] Body: `{ state: { x, y, z, a, b, c, e } }` + - [ ] Weiterleitung an `ROBOT_URL/api/state` (analog zu `robotActions.js`) + - [ ] Fehler wenn `ROBOT_URL` nicht konfiguriert: JSON-Fehler zurückgeben +- [ ] Frontend: Fehler-Feedback wenn kein ROBOT_URL + +--- + +### Phase 4 — robot.json via Driver-API *(nach allem anderen)* + +- [ ] `loadRobotConfig()` Funktion in `server/server.js` + - [ ] Wenn `ROBOT_URL` gesetzt: `GET ROBOT_URL/api/robot/config` → temp-Datei cachen + - [ ] Fallback: lokale Datei (Verhalten unverändert) +- [ ] Homing und Board-Run nutzen `loadRobotConfig()` statt direkt `ROBOT_JSON` +- [ ] *(Voraussetzung: Driver implementiert `GET /api/robot/config`)* + +--- + +## Status-Übersicht + +| Bereich | Status | +|---------|--------| +| Python-Scripts (1, 2, 3b, 4b) | ✅ vorhanden | +| Kalibrierung (Kamera, Board, X-Achse) | ✅ fertig | +| Arm1 Joint-Origin Button | ✅ ausführbar | +| Arm-Marker in robot.json | 🔶 Nutzer | +| Phase 0 – runBoardPipeline() | ❌ offen | +| Phase 1 – /api/homing/run | ❌ offen | +| Phase 2 – homing.html | ❌ offen | +| Phase 3 – /api/homing/send-state | ❌ offen | +| Phase 4 – robot.json via Driver-API | ⏳ später |