Phase 1 abgeschlossen: Positionen werden erkannt.
Positionen aus den Merkern heraus erkennbar. Viele Bilder gleichzeitig verarbeitbar.
This commit is contained in:
248
documentation/Phase1.tex
Normal file
248
documentation/Phase1.tex
Normal 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}
|
||||
Reference in New Issue
Block a user