348 lines
6.0 KiB
TeX
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} |