G92 doku & E-Stop-Doku

This commit is contained in:
chk
2026-06-25 19:20:14 +02:00
parent b96a538b89
commit 497d0fbc7b
7 changed files with 711 additions and 0 deletions

115
doc/Info_G92.md Normal file
View File

@@ -0,0 +1,115 @@
# G92 - Homing
die appRobotHoming ermittelt die Position der Gelenke (per Foto oder sonstigen Infos).
Diese werden wie folgt behandelt und umgerechnet.
---
## Befehlsformat
```
G92 X<mm> Y<°> Z<°> A<°> B<°> C<°> E<mm>
```
| Achse | Bedeutung | Einheit |
|-------|-----------------------------------|---------|
| X | Lineare Schiene (xMotor) | mm |
| Y | Schulterwinkel α (alpha) | Grad |
| Z | Ellenbogenwinkel β (beta) | Grad |
| A | Handgelenk 1 (a) | Grad |
| B | Handgelenk 2 (b) | Grad |
| C | Handgelenk 3 (c) | Grad |
| E | Greifer-Öffnung (ein Finger) | mm |
**Beispiel (tatsächlicher Homing-Aufruf):**
```
G92 X158.14 Y4.19 Z57.74 A91.85 B-45.46 C-69.92 E21.20
```
→ Y = 4,19°, Z = 57,74° usw. — alle Winkel direkt in Grad wie in FluidNC/GCode-Konvention.
---
## Interne Verarbeitung (`RobotController.js`)
Winkel-Achsen werden von Grad nach Radiant umgerechnet (D = 180/π):
```
robot.alpha = Y / D (intern: Radiant)
robot.beta = Z / D
robot.a = A / D
robot.b = B / D
robot.c = C / D
```
X bleibt mm, keine Umrechnung.
**Greifer E** wird **nach** B und C gesetzt, damit die kinematische Kopplung stimmt:
```
robot.e = E (Finger-Öffnung, mm)
robot.eMotor = gripperMotorFromOpening(e) (abgeleiteter Motorwert)
```
Bei `Arm3SegmentLinearX`: `eMotor = e b c` (Sehnenkompensation durch Handgelenk).
Bei `Arm3SegmentRotaryBase`: `eMotor = e` (keine Kopplung).
---
## Variante M92 (intern / Test)
```
M92 X<mm> Y<rad> Z<rad> A<rad> B<rad> C<rad> E<mm>
```
Winkel werden **roh als Radiant** übernommen. Für Skripte und Tests, nicht für Homing aus appRobotHoming.
---
## Weiterleitung an FluidNC-Instanzen
Nach dem Setzen der internen Motorslots ruft `robot.sendCommand('G92')` auf jedem registrierten `TelnetSenderGRBL` `execCommand('G92', mOld, mNew)` auf.
Jede Instanz bekommt ihren eigenen `G92`-Befehl mit den Port-Inverse-Achswerten (Rückumrechnung Radiant → Grad, mit Kopplung):
| Instanz | FluidNC-Achsen | Formel |
|---------|----------------------------|-----------------------------------------------------------|
| base | x = xMotor | direkt mm |
| | y = α → Grad | `alpha × D` |
| | z = β−α → Grad | `(beta alpha) × D` |
| elbow | x = a → Grad | `a × D` |
| hand | x = cb → Grad | `(c b) × D` |
| | y = eMotor | direkt (mm oder gekoppelter Motorwert) |
| | z = b → Grad | `b × D` |
`G92` bekommt **kein** `G90`-Prefix und keinen Vorschub — nur die geänderten Achsen werden angehängt. Jede Instanz übernimmt den Werkstück-Koordinaten-Offset (WPos) ohne Bewegung.
**Hinweis:** Nur Achsen mit gesetztem `*MotorChanged`-Flag werden gesendet. Bleibt ein Wert gegenüber dem letzten Driver-Zustand unverändert, schickt die jeweilige Instanz keinen G92 für diese Achse. Nach einem Neustart des Drivers sind alle Flags gesetzt → alle Achsen werden gesendet.
---
## Reporting (`M114` / Web-UI)
| Feld | Quelle | Einheit | Anzeige in public/app.js |
|--------------------|----------------|---------|------------------------------------------|
| `position.x/y/z` | Workspace | mm | direkt |
| `position.a/b/c` | phi/theta/psi | rad | `× 180/π` → Grad |
| `position.e` | `robot.e` | mm | direkt (Greifer-Öffnung) |
| `motorCounts.x` | xMotor | mm | direkt |
| `motorCounts.y/z` | alpha/beta | rad | `× 180/π` → Grad |
| `motorCounts.a/b/c`| a/b/c | rad | `× 180/π` → Grad |
| `motorCounts.e` | `robot.eMotor` | mm | direkt (abgeleiteter Motorwert) |
---
## Behobene Fehler (Kontext)
**Ursprüngliches Problem:** `G92 X158.14 Y4.19 Z57.74 …` lieferte korrekte X-Werte, aber Y≈240 und Z≈3308 im Ergebnis. Ursache: Winkel wurden als Radiant interpretiert, intern aber mit `× D` auf Grad umgerechnet — doppelte Skalierung.
**Drei Korrekturen:**
1. **Grad-Interpretation:** G92 rechnet Eingabe-Winkel jetzt mit `÷ D` in Radiant um (statt roh zu übernehmen).
2. **Greifer-Motorwert:** `robot.e` (Öffnung) wurde gesetzt, aber `sendCommand()` überträgt `robot.eMotor`. Fix: `eMotor = gripperMotorFromOpening(e)` direkt im G92-Zweig, nach dem Setzen von B/C.
3. **Web-UI-Anzeige:** `state-e` zeigte `motorCounts.e × 180/π` (mm × 57,3 = Unsinn). Fix: zeigt jetzt `position.e` (mm direkt).