Phasen aufteilung ToDo
This commit is contained in:
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user