Phase 1 abgeschlossen: Positionen werden erkannt.

Positionen aus den Merkern heraus erkennbar. Viele Bilder gleichzeitig verarbeitbar.
This commit is contained in:
chk
2026-05-25 22:16:11 +02:00
parent f37097ea96
commit 5a7176920a
11 changed files with 3005 additions and 120 deletions

248
documentation/Phase1.tex Normal file
View File

@@ -0,0 +1,248 @@
\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{geometry}
\geometry{margin=2.5cm}
\title{Mathematische Beschreibung von \texttt{3\_fuse\_markers\_world.py}}
\author{}
\date{}
\begin{document}
\maketitle
\section{Ziel}
Das Script fusioniert mehrere ArUco-Detektionen aus mehreren Kameras zu einem gemeinsamen Weltmodell.
Gegeben sind:
\begin{itemize}
\item Kameraposen im Weltkoordinatensystem
\item 2D Marker-Detektionen pro Kamera
\item Kameraintrinsics
\item Markergröße
\end{itemize}
Gesucht sind:
\begin{itemize}
\item Weltposition aller Marker
\item Markerorientierungen
\item Qualitätsmetriken
\end{itemize}
\section{Koordinatensysteme}
Verwendete Systeme:
\begin{itemize}
\item Weltkoordinatensystem $W$
\item Kamerakoordinatensystem $C$
\item Markerkoordinatensystem $M$
\end{itemize}
\section{solvePnP}
Für jeden Marker wird mittels OpenCV solvePnP berechnet:
\[
X_C = R_{CM} X_M + t_{CM}
\]
Dabei gilt:
\begin{itemize}
\item $R_{CM}$ = Rotation Marker $\rightarrow$ Kamera
\item $t_{CM}$ = Translation Marker $\rightarrow$ Kamera
\end{itemize}
\section{Kamerapose}
Aus der vorher berechneten Kamerapose:
\[
X_W = R_{WC} X_C + t_{WC}
\]
mit:
\[
t_{WC} = C_W
\]
(Kameraposition in Weltkoordinaten)
\section{Markerposition in Weltkoordinaten}
Markerzentrum:
\[
p_M =
\begin{bmatrix}
0 \\
0 \\
0
\end{bmatrix}
\]
Markerposition im Kamerasystem:
\[
p_C = R_{CM} p_M + t_{CM}
\]
Da $p_M = 0$:
\[
p_C = t_{CM}
\]
Transformation ins Weltkoordinatensystem:
\[
p_W = R_{WC} p_C + t_{WC}
\]
Somit:
\[
p_W = R_{WC} t_{CM} + t_{WC}
\]
\section{Markerrotation in Weltkoordinaten}
Die Markerrotation relativ zur Kamera:
\[
R_{CM}
\]
Die Kamerarotation relativ zur Welt:
\[
R_{WC}
\]
Markerrotation relativ zur Welt:
\[
R_{WM} = R_{WC} R_{CM}
\]
Dies ist die zentrale Rotationsgleichung des Scripts.
\section{Gewichtung der Beobachtungen}
Mehrere Kameras können denselben Marker beobachten.
Für jede Beobachtung wird ein Gewicht berechnet:
\[
w_i =
w_{\text{confidence}}
\cdot
w_{\text{area}}
\cdot
w_{\text{view}}
\cdot
w_{\text{reprojection}}
\]
Typische Faktoren:
\begin{itemize}
\item Marker Confidence
\item Markergröße in Pixel
\item Sichtwinkel
\item Distanz zum Bildrand
\item Reprojektionsfehler
\end{itemize}
\section{Gewichtete Positionsfusion}
Die endgültige Markerposition:
\[
p =
\frac{
\sum_i w_i p_i
}{
\sum_i w_i
}
\]
Dies entspricht einem gewichteten Mittelwert.
\section{Rotationsfusion}
Rotationen werden gesammelt:
\[
R_1, R_2, ..., R_n
\]
Eine einfache erste Näherung:
\begin{itemize}
\item Eulerwinkel mitteln
\item oder Quaternionen mitteln
\end{itemize}
Später empfohlen:
\begin{itemize}
\item SVD-basierte Rotationsmittelung
\item Lie-Group Mittelung auf $SO(3)$
\end{itemize}
\section{Qualitätsmetriken}
Das Script berechnet:
\begin{itemize}
\item Anzahl beobachtender Kameras
\item Positionsstreuung
\item Reprojektionsfehler
\item Gesamtgewicht
\item Sichtwinkel
\end{itemize}
Beispiel:
\[
\sigma =
\sqrt{
\frac{1}{N}
\sum_i ||p_i - \bar{p}||^2
}
\]
\section{Rigid-Body Erweiterung}
Später können Marker über bekannte Relativpositionen gekoppelt werden.
Beispiel:
\[
p_{M2} = p_{M1} + R_{Body} \Delta p
\]
Dadurch können Marker rekonstruiert werden, selbst wenn sie nicht direkt sichtbar sind.
\section{Spätere Erweiterungen}
Geplant:
\begin{itemize}
\item Bundle Adjustment
\item Kinematic Constraints
\item Joint Solver
\item Graph Optimization
\item Temporal Tracking
\end{itemize}
\end{document}