Files
appRobotHoming/doc/04_y_achse.md
2026-06-10 21:26:40 +02:00

128 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Bestimmung der Y-Rotationsachse aus Marker-Positionen
## Problem
Wenn der Roboter um seine Y-Achse rotiert, bewegt sich jeder erkannte Marker auf einem **Kreisbogen** im 3D-Raum. Ziel ist es, Lage und Richtung dieser Rotationsachse aus den beobachteten Marker-Positionen (x, y, z) zu mehreren Zeitstempeln zu berechnen.
---
## Reichen zwei Positionen?
**Nein.** Zwei Punkte P₁, P₂ desselben Markers definieren nur eine Strecke. Die Rotationsachse muss durch die senkrechte Mittelebene dieser Strecke laufen aber *wo* genau in dieser Ebene und in welcher Richtung bleibt unbestimmt. Das System ist unterbestimmt.
| Beobachtungen | Bestimmbar? | Begründung |
|---|---|---|
| 1 Marker, 2 Positionen | Nein | Achse liegt irgendwo auf einer Halbebene |
| 1 Marker, 3 Positionen | **Ja** | Eindeutiger Umkreis → eindeutige Achse |
| N Marker, je ≥ 3 Positionen | Ja, überbestimmt | Least-Squares, robuster gegenüber Messrauschen |
---
## Mathematik: 1 Marker, 3 Positionen
Gegeben: P₁, P₂, P₃ ∈ ℝ³ (derselbe Marker zu drei verschiedenen Rotationswinkeln).
Da die Rotation starr ist, liegen P₁, P₂, P₃ auf einem **Kreis**, dessen Ebene senkrecht zur Rotationsachse steht.
### Schritt 1 Achsenrichtung (Normalenvektor der Kreisebene)
```
v₁ = P₂ P₁
v₂ = P₃ P₁
n = (v₁ × v₂) / |v₁ × v₂| ← Einheitsvektor entlang der Rotationsachse
```
### Schritt 2 Mittelpunkt des Kreises (Umkreismittelpunkt)
Der Umkreismittelpunkt C liegt in der Ebene der drei Punkte und ist von allen drei Punkten gleich weit entfernt. Er ist ein Punkt **auf der Rotationsachse**.
Berechnung über Baryzentrischen Koordinaten:
```
a² = |P₂ P₃|²
b² = |P₁ P₃|²
c² = |P₁ P₂|²
w₁ = a²·(b² + c² a²)
w₂ = b²·(a² + c² b²)
w₃ = c²·(a² + b² c²)
C = (w₁·P₁ + w₂·P₂ + w₃·P₃) / (w₁ + w₂ + w₃)
```
### Schritt 3 Rotationsachse
```
Achse: r(t) = C + t·n, t ∈
```
---
## Mathematik: N Marker, je ≥ 3 Positionen (Least Squares)
Jeder Marker i liefert:
- einen Schätzwert **Cᵢ** (Umkreismittelpunkt, Punkt auf der Achse)
- einen Schätzwert **nᵢ** (Normalenvektor, Achsenrichtung)
### Achsenrichtung (gemittelt / PCA)
Wegen möglichem Vorzeichenambiguität alle nᵢ auf dasselbe Halbraum ausrichten, dann:
```
n̄ = mean(nᵢ) / |mean(nᵢ)|
```
Robuster: **PCA** über die Matrix der nᵢ-Vektoren → erster Hauptkomponentenvektor.
### Achsenposition (Least Squares)
Minimiere die quadratischen Abstände aller Umkreismittelpunkte Cᵢ zur gesuchten Geraden `r(t) = A + t·n̄`:
```
Abstand² von Cᵢ zur Achse = |Cᵢ A|² ((Cᵢ A)·n̄)²
```
Ableitung null setzen liefert:
```
A = C̄ (C̄·n̄)·n̄ + (C̄·n̄)·n̄ = C̄ (Referenzpunkt = Schwerpunkt der Cᵢ)
```
d. h., der **Schwerpunkt der Umkreismittelpunkte** ist der optimale Referenzpunkt auf der Achse. Die Achsenrichtung n̄ bleibt unverändert.
**Verbleibender Fehler** (Residuum pro Marker):
```
εᵢ = |(Cᵢ C̄) ((Cᵢ C̄)·n̄)·n̄|
```
Große εᵢ deuten auf einen fehlerhaften Marker oder eine nicht-rotatorische Bewegungskomponente hin.
---
## Praktische Empfehlung
- **Mindestens 3 Zeitstempel** pro Marker, verteilt über einen Winkelbereich von ≥ 30° (sonst ist der Kreis numerisch schlecht konditioniert).
- **34 Marker** mit je 3 Positionen sind ausreichend für eine stabile Schätzung.
- Die Rotationswinkel müssen nicht bekannt sein nur die 3D-Koordinaten der Marker.
- Bei sehr kleinen Winkeln (< 10°) ist die Bestimmung numerisch instabil; größere Drehungen bevorzugen.
---
## Zusammenfassung
```
Eingabe: Marker-Positionen P[marker][timestamp] ∈ ℝ³
(mind. 3 Timestamps pro Marker, mind. 1 Marker)
Pro Marker:
1. n_i = normalize((P2-P1) × (P3-P1)) ← Achsenrichtung
2. C_i = Umkreismittelpunkt(P1, P2, P3) ← Punkt auf Achse
Kombination:
3. n̄ = normalize(mean(n_i)) ← beste Achsenrichtung
4. C̄ = mean(C_i) ← bester Referenzpunkt
Ergebnis: Rotationsachse r(t) = C̄ + t·n̄
```