kurse:ef05a-2021:kurven:xmastree-math

Bestimmung der Positionen der LED

Grundidee:

  • Koordinatensystem festlegen: Nullpunkt am Boden unter dem Stamm, $z$-Achse durch den Stamm nach oben. $x$/$y$-Achsen so, dass ein Rechtshändiges System entsteht. Einheit 1 cm.
  • Baum mit Webcam filmen, Position der Kamera im Koordinatensystem ausmessen.
  • Jede LED einzeln ein- und wieder ausschalten.
  • Position einer LED auf dem Bild der Webcam als hellster Punkt abschätzen.
  • Bild-Koordinaten in Raumkoordinaten umrechnen.
  • Ergibt eine räumliche Gerade, auf der die LED liegt.
  • Wiederholung der Messung von einer anderen Kameraposition (ungefähr $90^\circ$ um die $z$-Achse gedreht).
  • «Schnittpunkte» der Geraden im Raum für jede LED bestimmen (bzw. der Punkt der am nächsten bei beiden Geraden liegt).
  • Sind die Raumkoordinaten einer LED bekannt, kann aus denen und der aktuellen Zeit in Sekunden die Farbe berechnet werden.

Mathematische Knacknüsse

  • Sei $K$ die Position der Kamera und $\vec n$ der auf die $x$/$y$-Ebene projizierte Vektor $\vec{OK}$.
  • Sei $B$ die Ebene durch die $z$-Achse mit Normalvektor $\vec n$.

Wir nehmen vereinfachend an, dass die Ebene $B$ unverzerrt von der Webcam abgebildet wird (bis auf Drehung und Streckung). Das stimmt ziemlich gut, wenn die Kamera horizontal gerade aus schaut (d.h. nicht nach oben oder unten). Und die Kameralinse sollte verzerrungsfrei abbilden, was an den Bildrändern wohl eher nicht stimmt.

  • Wir markieren auf dem Bild der Webcam die Punkte $O=(0,0,0)$ (Punkt auf dem Boden unter dem Stamm) und den Punkt $S=(0,0,180)$ (Spitze des Baums).
  • Damit haben wir folgende Koordinatensysteme:
    • Bildkoordinaten der Webcam: Nullpunkt oben links, positive $x$-Achse nach rechts, positive $y$-Achse nach unten. Einheit 1 Pixel, Bildgrösse typischerweise $640 \times 480$.
    • Koordinaten auf der Ebene $B$: Nullpunkt auf dem Punkt $O$ (Punkt auf dem Boden unter dem Stamm), positive $x$-Achse nach links, positive $y$-Achse nach oben (in Richtung $\vec{OS}$).
    • Räumliche Koordinaten der Punkte der Ebene $B$.

Gegebene Grössen: Räumlicher Punkt $K$, Bildkoordinaten von $O$, $S$ und $L_0$ (Bildkoordinaten der LED).

Gesuchte Grössen: Räumlicher Punkt $L$ auf der Ebene $B$. Damit ist die Parameterdarstellung der Geraden, auf der die LED liegt $\vec{OK}+t \cdot \vec{KL}$.

Umsetzung in Python: https://github.com/techlabksbg/xmastree/blob/main/other/spatial-recognition/main.py

Gegebene Grössen: Punkte $K_1$, $L_1$ und $K_2$, $L_2$.

Gesuchte Grössen: Punkt $P$, der am nächsten bei $K_1L_1$ und $K_2L_2$ liegt.

Umsetzung in Python: https://github.com/techlabksbg/xmastree/blob/main/other/spatial-recognition/compute.py

Gegebene Grössen: Raumkoordinaten $P$ einer LED, Zeit $t$ in Sekunden.

Gesuchte Grössen: Farbe von $P$ (in RGB oder HSV).

  • kurse/ef05a-2021/kurven/xmastree-math.txt
  • Last modified: 2021/12/02 09:28
  • by Ivo Blöchliger