Files
appRobotVideoControls/documentation/Phase1_Phase2.tex
chk 5a7176920a Phase 1 abgeschlossen: Positionen werden erkannt.
Positionen aus den Merkern heraus erkennbar. Viele Bilder gleichzeitig verarbeitbar.
2026-05-25 22:16:11 +02:00

348 lines
6.0 KiB
TeX

\documentclass[a4paper,11pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{geometry}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{listings}
\usepackage{xcolor}
\title{Phase 2 --- Kinematic-Constrained Multi-Camera Solver}
\author{}
\date{}
\begin{document}
\maketitle
\section{Ziel}
Nach Phase 1 existiert:
\begin{itemize}
\item ein gemeinsames Weltkoordinatensystem
\item Kameraposen aller Kameras
\item bekannte absolute Markerpositionen
\item fusionierte Beobachtungen mehrerer Kameras
\end{itemize}
Phase 2 erweitert das System um:
\begin{itemize}
\item Rigid-Body Constraints
\item mechanische Zusammenhänge
\item Gelenke
\item relative Marker-Geometrien (\texttt{relPos})
\item Stabilisierung bei wenigen sichtbaren Markern
\end{itemize}
\section{Ausgangslage}
Aktuell wird jeder Marker unabhängig behandelt.
Das ist suboptimal, weil:
\begin{itemize}
\item viele Marker nur kurz sichtbar sind
\item oft nur 1--2 Marker eines Bauteils sichtbar sind
\item solvePnP bei wenigen Markern instabil wird
\item Markerrauschen direkt in die Weltkoordinaten eingeht
\end{itemize}
Mechanisch sind die Marker jedoch nicht unabhängig.
Mehrere Marker gehören jeweils zu:
\begin{itemize}
\item Arm1
\item Arm2
\item Joint1
\item Base
\item Finger1
\item Finger2
\end{itemize}
und bilden jeweils starre Körper (Rigid Bodies).
\section{Grundidee}
Statt einzelne Marker zu lösen:
\begin{verbatim}
Marker -> Welt
\end{verbatim}
wird gelöst:
\begin{verbatim}
RigidBody -> Welt
\end{verbatim}
und daraus:
\begin{verbatim}
Marker = RigidBody * relTransform
\end{verbatim}
\section{Vorteil}
Schon ein einzelner sichtbarer Marker kann:
\begin{itemize}
\item einen ganzen Körper stabilisieren
\item andere unsichtbare Marker indirekt bestimmen
\end{itemize}
Beispiel:
Wenn Marker 198 sichtbar ist
und Marker 229 relativ dazu bekannt ist,
dann kann Marker 229 geschätzt werden,
auch wenn er aktuell unsichtbar ist.
\section{Erwartete Verbesserungen}
\subsection{Stabilität}
Deutlich stabilere Pose-Schätzung bei:
\begin{itemize}
\item Motion Blur
\item wenigen sichtbaren Markern
\item schlechten Blickwinkeln
\item Teilverdeckungen
\end{itemize}
\subsection{Konsistenz}
Marker eines Bauteils bleiben:
\begin{itemize}
\item geometrisch korrekt
\item starr
\item ohne unrealistische Verzerrungen
\end{itemize}
\subsection{Multi-Camera-Verkettung}
Kameras können indirekt gekoppelt werden.
Beispiel:
Cam1 sieht:
\begin{itemize}
\item Marker 1,2,3
\end{itemize}
Cam2 sieht:
\begin{itemize}
\item Marker 3,198
\end{itemize}
Cam3 sieht:
\begin{itemize}
\item Marker 198,229
\end{itemize}
Dadurch wird:
\begin{itemize}
\item Arm1 relativ zur Welt bestimmbar
\item obwohl keine einzelne Kamera alles sieht
\end{itemize}
\section{Benötigte Daten}
\subsection{Bereits vorhanden}
\subsubsection{Absolute Marker}
\begin{verbatim}
"position":[x,y,z]
\end{verbatim}
für Board-Marker.
\subsubsection{Relative Markerpositionen}
\begin{verbatim}
"relPos":[x,y,z]
\end{verbatim}
für Marker auf einem Rigid Body.
\subsubsection{Body-Zuordnung}
\begin{verbatim}
"on":"Arm1"
\end{verbatim}
\subsubsection{Gelenke}
\begin{verbatim}
"type":"revolute"
"axis":[1,0,0]
\end{verbatim}
\section{Noch fehlende Daten}
\subsection{Marker-Orientierung relativ zum Body}
Aktuell existiert nur:
\begin{verbatim}
"relPos"
\end{verbatim}
Empfohlen wird zusätzlich:
\begin{verbatim}
"relRot":[rx,ry,rz]
\end{verbatim}
oder alternativ:
\begin{verbatim}
"normal":[x,y,z]
"up":[x,y,z]
\end{verbatim}
Denn Marker besitzen nicht nur Position,
sondern auch Orientierung.
Das verbessert spätere Pose-Fits deutlich.
\section{Geplante Solver-Strategie}
\subsection{Phase 2A --- Rigid Body Fit}
Zunächst:
\begin{itemize}
\item pro Element einen starren Körper fitten
\item noch keine Gelenkoptimierung
\end{itemize}
Beispiel:
\begin{verbatim}
T_world_arm1
\end{verbatim}
wird geschätzt.
Alle Marker von Arm1 folgen daraus automatisch.
\subsection{Phase 2B --- Joint Constraints}
Danach:
\begin{itemize}
\item Gelenkachsen erzwingen
\item Rotationen einschränken
\item mechanische Grenzen verwenden
\end{itemize}
Beispiel:
\begin{verbatim}
Arm2 darf sich nur um Y drehen
\end{verbatim}
\subsection{Phase 2C --- Global Optimization}
Später optional:
\begin{itemize}
\item vollständiges Bundle Adjustment
\item gleichzeitige Optimierung aller:
\begin{itemize}
\item Kameras
\item Marker
\item Bodies
\item Gelenkwinkel
\end{itemize}
\end{itemize}
\section{Wichtige Architekturentscheidung}
NICHT:
\begin{verbatim}
Marker einzeln lösen
\end{verbatim}
SONDERN:
\begin{verbatim}
Bodies + Constraints lösen
\end{verbatim}
Marker werden damit Beobachtungen,
nicht mehr primäre Zustände.
\section{Geplante Datenstruktur}
\subsection{Weltpose eines Körpers}
\begin{verbatim}
{
"body":"Arm1",
"worldPose":{
"position":[x,y,z],
"rotationMatrix":[...]
}
}
\end{verbatim}
\subsection{Relative Markerdefinition}
\begin{verbatim}
{
"id":198,
"on":"Arm1",
"relPos":[x,y,z],
"relRot":[rx,ry,rz]
}
\end{verbatim}
\section{Phase 1 Reminder}
Phase 1 bleibt weiterhin wichtig:
\begin{itemize}
\item alle Kameras finden
\item alle Detection-Dateien laden
\item gemeinsame Marker fusionieren
\item Weltkoordinaten berechnen
\item Qualitätsmetriken speichern
\item auch schlechte / unvollständige Beobachtungen abspeichern
\end{itemize}
Die Ergebnisse von Phase 1 dienen als Eingang für Phase 2.
\section{Zielbild}
Langfristig entsteht:
\begin{itemize}
\item ein globales Robotermodell
\item mit mehreren Kameras
\item mehreren Rigid Bodies
\item Gelenken
\item Unsicherheiten
\item Qualitätsmetriken
\item temporaler Stabilisierung
\end{itemize}
basierend auf:
\begin{itemize}
\item ArUco-Beobachtungen
\item Mechanik
\item Kinematik
\item Multi-View-Geometrie
\end{itemize}
\end{document}