Konfig in robot.json
This commit is contained in:
79
README.md
79
README.md
@@ -11,6 +11,8 @@ Dieses Projekt empfängt G-Code und Robotersteuerbefehle, berechnet Inverse Kine
|
||||
- `robot/GCode.js` verarbeitet G-Code, übersetzt ihn in Roboter-Koordinaten und triggert `robot.sendCommand()`.
|
||||
- `robot/RobotBase.js` ist die abstrakte Basisklasse / der Interface-Vertrag: generische Infrastruktur (Zustand, `sendCommand`, Motor-Geschwindigkeiten) plus die zwei abstrakten Kinematik-Methoden.
|
||||
- `robot/kinematics/Arm3SegmentLinearX.js` ist die konkrete Kinematik (Inverse + Vorwärts) für den aktuellen Arm. Die Auswahl der Kinematik erfolgt über `robot/KinematicsFactory.js` (Umgebungsvariablen `ROBOT_KINEMATICS` / `ROBOT_KINEMATICS_PARAMS`). Siehe `doc/ToDo_12_InverseKinematikConfig_ROADMAP.md`.
|
||||
- `robot/RobotConfig.js` liest `data/robot/robot.json` beim Start synchron und gibt einen typisierten Konfigurations-Record zurück (Kinematik-Parameter, Bewegungs-Defaults, Controller-Endpunkte). Env-Variablen überschreiben die JSON-Werte.
|
||||
- `server/RobotConfigService.js` stellt `GET/PUT /api/robot` und `GET /api/robot/history` über den InfoServer bereit (Single Source of Truth für alle Apps). Schreibzugriffe erfordern `Authorization: Bearer <ROBOT_API_KEY>`.
|
||||
- `robot/TelnetSenderGRBL.js` formatiert die Motor-Positionen in GRBL-kompatible Befehle und sendet sie per Telnet an einen Zielcontroller.
|
||||
|
||||
## Eingaben
|
||||
@@ -89,22 +91,65 @@ Die Eingaben kommen per WebSocket an den HTTPS-Server und werden in `server/Inpu
|
||||
- Interner Schalter, ob `robot.calculateSpeeds()` rechnet. Ändert allein **nicht** die
|
||||
Sender-Ausgabe — dafür ist `ROBOT_SPEED_MODE=correct` nötig. Vom Korrekt-Modus
|
||||
automatisch aktiviert.
|
||||
- `ROBOT_KINEMATICS`
|
||||
- Standard: `arm3segmentlinearx`
|
||||
- Bezeichner der Kinematik-Klasse (case-insensitive). Bekannte Werte: `arm3segmentlinearx`,
|
||||
`grabit` / `robot02` (Joy-IT Grab-It). Unbekannter Bezeichner → Fehler beim Start.
|
||||
- `ROBOT_KINEMATICS_PARAMS`
|
||||
- JSON-Objekt mit Konstruktor-Parametern, z. B. `{"l1":250,"l2":264,"l3":100}`.
|
||||
Überschreibt die Werte aus `robot.json`. Wird von der Factory als viertes Argument
|
||||
an den Konstruktor weitergereicht (erlaubt kinematik-spezifische Parameter wie `baseHeight`).
|
||||
- `ROBOT_API_KEY`
|
||||
- Statischer Bearer-Token für `PUT /api/robot`. Fehlt die Variable, generiert
|
||||
`RobotConfigService` beim ersten Start einen zufälligen Key und speichert ihn in
|
||||
`data/robot/.apikey` (nicht im Repo). Der Key wird beim Start einmalig geloggt.
|
||||
|
||||
### HTTPS-Konfiguration
|
||||
|
||||
- `https/localhost.key`
|
||||
- `https/localhost.pem`
|
||||
- Passphrase aktuell hart codiert als `abcd`
|
||||
- Passphrase: Env-Variable `HTTPS_PASSPHRASE`, Default `abcd`
|
||||
|
||||
### robot.json
|
||||
|
||||
`data/robot/robot.json` ist die zentrale Konfigurationsdatei für einen konkreten Roboter.
|
||||
Sie wird von `robot/RobotConfig.js` beim Start synchron gelesen. Fehlt die Datei, startet
|
||||
der Driver mit Fallback-Defaults und loggt eine Warnung.
|
||||
|
||||
Relevante Abschnitte für den Driver:
|
||||
|
||||
```json
|
||||
{
|
||||
"kinematics": { "type": "arm3segmentlinearx" },
|
||||
"motion": { "defaultFeedrate": 1000, "speedMode": "legacy" },
|
||||
"controllers": {
|
||||
"base": { "ip": "fluidNcBase.local", "port": 2300, "protocol": "telnet", "axes": ["x","y","z"] },
|
||||
"elbow": { "ip": "fluidNcEllbow.local", "port": 5000, "protocol": "telnet", "axes": ["a",null,null] },
|
||||
"hand": { "ip": "fluidNcHand.local", "port": 5000, "protocol": "telnet", "axes": ["c","e","b"] }
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Armlängen werden aus dem `links`-Abschnitt abgeleitet (`Arm1.skeleton.to[1]` → l1 usw.).
|
||||
Env-Variablen haben Vorrang vor robot.json (nützlich für Tests und schnelle Korrekturen).
|
||||
|
||||
Snapshots werden automatisch vor jedem PUT angelegt (`data/robot/robot_YYYYMMDD_HHmmss.json`).
|
||||
Snapshots sind nicht im Repo (`.gitignore`), `robot.json` selbst schon.
|
||||
|
||||
### Telnet-Sender-Konfiguration
|
||||
|
||||
In `startRobot.js` werden drei `TelnetSenderGRBL` Instanzen erzeugt:
|
||||
`startRobot.js` erzeugt die `TelnetSenderGRBL`-Instanzen dynamisch aus `cfg.controllers`
|
||||
(geladen von `robot/RobotConfig.js`). Die Defaults entsprechen drei Controllern:
|
||||
|
||||
- `telnetSender1` → Basisachse(n): `x`, `y`, `z`
|
||||
- `telnetSender2` → Ellbogenachse: `a`
|
||||
- `telnetSender3` → Handachsen: `c`, `e`, `b`
|
||||
| Key | Default-IP | Port | Achsen |
|
||||
|-----|-----------|------|--------|
|
||||
| `base` | `fluidNcBase.local` | 2300 | `x, y, z` |
|
||||
| `elbow` | `fluidNcEllbow.local` | 5000 | `a` |
|
||||
| `hand` | `fluidNcHand.local` | 5000 | `c, e, b` |
|
||||
|
||||
Die Achszuordnung kann in `robot/TelnetSenderGRBL.js` durch Anpassung der Konstruktorparameter geändert werden.
|
||||
IPs können per Env-Variable überschrieben werden (`GRBL_BASE_IP`, `GRBL_ELLBOW_IP`,
|
||||
`GRBL_HAND_IP`). Alles andere (Port, Achsen, Controller-Anzahl) wird in `robot.json`
|
||||
konfiguriert.
|
||||
|
||||
## Serverschnittstellen
|
||||
|
||||
@@ -124,6 +169,9 @@ Die Achszuordnung kann in `robot/TelnetSenderGRBL.js` durch Anpassung der Konstr
|
||||
- API-Endpunkte:
|
||||
- `/api/status`
|
||||
- `/api/position`
|
||||
- `/api/robot` — `GET`: aktuelle `robot.json`; `PUT`: überschreibt sie (Auth erforderlich)
|
||||
- `/api/robot/history` — Liste aller Snapshots
|
||||
- `/api/robot/history/:ts` — einen bestimmten Snapshot abrufen
|
||||
|
||||
## Wichtige Dateien
|
||||
|
||||
@@ -134,6 +182,9 @@ Die Achszuordnung kann in `robot/TelnetSenderGRBL.js` durch Anpassung der Konstr
|
||||
- `robot/kinematics/Arm3SegmentLinearX.js` — konkrete Kinematik (Modell + Inverse/Vorwärts), Default-Arm
|
||||
- `robot/kinematics/Arm3SegmentRotaryBase.js` — Kinematik für den Joy-IT „Grab-It" (Robot02), 5 Achsen + Greifer mit Drehbasis (`ROBOT_KINEMATICS=grabit`)
|
||||
- `robot/KinematicsFactory.js` — wählt die Kinematik per Umgebungsvariable
|
||||
- `robot/RobotConfig.js` — liest `data/robot/robot.json`, gibt typisierten Konfigurations-Record zurück
|
||||
- `server/RobotConfigService.js` — REST-Endpunkte `/api/robot*` (lesen/schreiben, Snapshots, Auth)
|
||||
- `data/robot/robot.json` — zentrale Roboter-Konfiguration (Single Source of Truth)
|
||||
- `robot/GCodeParser.js` — wandelt rohe Nachrichten in strukturierte Befehlsobjekte
|
||||
- `robot/RobotController.js` — wendet geparste Befehle auf das Modell an (Steuerlogik)
|
||||
- `robot/GCode.js` — Fassade + Datei-Befehle
|
||||
@@ -143,9 +194,10 @@ Die Achszuordnung kann in `robot/TelnetSenderGRBL.js` durch Anpassung der Konstr
|
||||
|
||||
## Laufzeitvoraussetzungen
|
||||
|
||||
- Das Verzeichnis `logs/` muss im Arbeitsverzeichnis existieren, da `InputWS.js` dort `pings.log` und `gcode_commands.log` schreibt.
|
||||
- HTTPS-Zertifikate: `https/localhost.key` und `https/localhost.pem` (Passphrase aktuell hardcoded `abcd`).
|
||||
- Die Telnet-Sender werden erst nach 5 Sekunden zum Roboter hinzugefügt, damit die Verbindungen Zeit haben aufzubauen.
|
||||
- HTTPS-Zertifikate: `https/localhost.key` und `https/localhost.pem` (Passphrase via `HTTPS_PASSPHRASE`, Default `abcd`).
|
||||
- `data/robot/robot.json` — wird beim Start eingelesen; fehlt die Datei, startet der Driver mit Defaults + Warnung.
|
||||
- `logs/` wird beim Start automatisch angelegt (`fs.mkdirSync('logs', { recursive: true })` in `startRobot.js`).
|
||||
- Telnet-Sender werden sofort beim Start als `cmdReceivers` registriert; interne Reconnect-Logik überbrückt verzögerte Controller-Verbindungen automatisch.
|
||||
|
||||
## ToDo / Open Tasks
|
||||
|
||||
@@ -163,9 +215,10 @@ Architektur- und Refactoring-Aufgaben sind in `doc/ToDo_*.md` dokumentiert:
|
||||
| `doc/ToDo_6b_FileHandling.md` | File-Handling: fehlende Befehle, Cursor im Speicher, Fehler-Feedback | offen |
|
||||
| `doc/ToDo_7_Tests.md` | Testabdeckung und Stabilität | teilweise |
|
||||
| `doc/ToDo_8_Bugs.md` | Bekannte konkrete Bugs | teilweise |
|
||||
| `doc/ToDo_9_HardwareFeedback.md` | Hardware-Feedback-Loop (GRBL-Antworten, Command-Queue, Positionsabgleich) | offen |
|
||||
| `doc/ToDo_9_HardwareFeedback.md` | Hardware-Feedback-Loop (GRBL-Antworten, Command-Queue, Positionsabgleich) | teilweise (Baustein Port→Motor ✅, Pakete 1–6 offen) |
|
||||
| `doc/ToDo_10_VerbindungsVerlust.md` | Verbindungsverlust erkennen, Watchdog, UI-Statusanzeige | offen |
|
||||
| `doc/ToDo_12_InverseKinematikConfig_ROADMAP.md` | Austauschbare Kinematik: RobotBase + Robot7M, Env-Konfiguration | offen |
|
||||
| `doc/ToDo_12_InverseKinematikConfig_ROADMAP.md` | Austauschbare Kinematik: RobotBase, KinematicsFactory, Grab-It | ✅ erledigt |
|
||||
| `doc/ToDo_14_robot_json_service.md` | robot.json als REST-Service, RobotConfigService, RobotConfig | teilweise (Schritte 1–4 in appRobotDriver ✅, Schritte 5–7 offen) |
|
||||
| `doc/ToDo_49_Cleanup.md` | Pre-Release-Cleanup: tote Code, Zertifikate, ToDos, README | offen |
|
||||
|
||||
### Empfohlene Bearbeitungsreihenfolge
|
||||
@@ -191,5 +244,5 @@ Kurzübersicht weiterer offener Punkte:
|
||||
- [ ] `FFirst`/`FLast`-Befehle in `GCode.receiveFC()` implementieren
|
||||
- [ ] `ROBOT_USE_SPEED_CALC` und `motorSpeeds` im echten Betrieb prüfen
|
||||
- [ ] `FluidNCClient.js` evaluieren: als Ersatz oder Ergänzung zu `TelnetSenderGRBL`?
|
||||
- [ ] HTTPS-Konfiguration und Zertifikatsverwaltung verbessern (Passphrase aus Env-Variable)
|
||||
- [ ] `logs/`-Verzeichnis beim Start automatisch anlegen
|
||||
- [x] HTTPS-Passphrase aus Env-Variable (`HTTPS_PASSPHRASE`) — erledigt
|
||||
- [x] `logs/`-Verzeichnis beim Start automatisch anlegen — erledigt (`startRobot.js`)
|
||||
|
||||
Reference in New Issue
Block a user