Einleitung

3D-Vorrichtungen in Tulip

Tulip 3D-Marker-Vorrichtungen, da dies die absolut genaueste Methode ist, um Objekte in einer sehr störungsbehafteten Umgebung wie einer Fertigungshalle mit hoher Präzision zu verfolgen. Die Marker lassen sich leicht an Gegenständen befestigen. Man kann sie an einem Behälter, einem Gabelstapler, einem Sattelzug oder einem winzigen Uhrmacherwerkzeug anbringen – sie funktionieren in jedem Maßstab, solange die Kamera sie erfassen kann. Ein klassischer Anwendungsfall Schablonen ist natürlich die Verfolgung von Schablonenobjekten, in die das Werkstück passt, aber dank der 3D-Fähigkeiten können wir nun auch komplexe Objekte verfolgen, indem Marker auf verschiedenen Oberflächen des Objekts angebracht werden.

Vorrichtungen bestehen aus einer Gruppe von 3D-Markern. Die 3D-Marker bestimmen einen Punkt auf dem 3D-Objekt, der im „Koordinatensystem“ (ein Koordinatensystem besteht aus den drei Achsen X, Y und Z, die zur Definition von Position und Ausrichtung dienen) des Objekts fixiert ist, vorausgesetzt, das Objekt ist ein starrer Körper. Wann immer wir den Marker sehen, wissen wir, dass er an derselben Stelle am Objekt angebracht ist. Die Jig-Markergruppe definiert ein vollständiges Objekt. Jigs können komplexe 3D-Formen definieren, wobei einige der Marker sichtbar und andere verborgen sind. Die sichtbaren Marker helfen uns, eine Position und Ausrichtung für das Objekt zu finden. Wenn die verborgenen Marker sichtbar werden, kompensieren sie die anderen Marker, die nun verborgen sind.

Optimierung der Bündelausgleichsberechnung

Bei der Definition einer Vorrichtung anhand von Markern erfassen wir zahlreiche Ansichten des markierten Objekts aus verschiedenen Blickwinkeln in Bezug auf die Kamera. Jedes von der Kamera aufgenommene Bild liefert eine weitere „Ansicht“ des Objekts mit seinen Markern. In jedem Bild berechnen wir die Position der Marker auf dem Objekt und ihre Beziehungen zueinander (Transformationen). Nachdem wir genügend Ansichten erfasst haben, kombinieren wir diese zu einem ganzheitlichen 3D-Modell des Objekts – auch bekannt als der Prozess der „Registrierung“. Aus verschiedenen Gründen, die mit der Optik und der numerischen Stabilität der Berechnungen zusammenhängen, stimmen die Ansichten rund um das Objekt jedoch nicht immer perfekt überein. Je mehr Ansichten wir vom Objekt aufnehmen, desto größer wird der kumulative Fehler bei der Registrierung, bis die endgültige Registrierung möglicherweise unbrauchbar ist. Hier kommt die „Bündelausgleichung“ ins Spiel.

Die Bündeloptimierung (Bundle Adjustment, BA) ist ein numerischer Optimierungsprozess, der den kumulativen Fehler bei der Registrierung mehrerer Kamerablickwinkel zur Rekonstruktion einer Geometrie ausgleicht. Bei der herkömmlichen BA werden fast alle Parameter der Rekonstruktion in die Optimierung einbezogen, einschließlich der optischen Modellierung der Kamera. Bevor wir jedoch den Ablauf der BA erläutern, sollten wir die relevanten Parameter definieren, die optimiert werden müssen. Wir empfehlen dringend, das hervorragende Buch von Prof. Richard SzeliskiComputervision: Algorithms and Applications, Springer Verlag, 2011 (Kapitel 7, S. 320) heranzuziehen .

Kamera-Objekt-Pose mit 3D-Markern

Wenn eine Kamera auf einen Marker blickt, bei dem es sich um ein flaches Objekt handelt, lässt sich die Ausrichtung des Markers relativ zum Kamerazentrum berechnen. Betrachten Sie die folgende Abbildung:

Bündelt 3D-Jigs in Computervision

Der Marker ist in der Kameraansicht sichtbar und wird auf die Bildebene projiziert – ein konzeptionelles Konstrukt, das dabei hilft, die Umwandlung zwischen 3D- und 2D-Pixelkoordinaten zu formulieren. Wenn wir jedoch ein Bild der Szene mit dem Marker aufnehmen, kennen wir die Parameter des 3D-Punkts nicht; wir können lediglich erkennen, wo diese 3D-Punkte auf das 2D-Bild projiziert wurden. Diese Projektion lässt sich durch die folgende Gleichung beschreiben:

Bündelt 3D-Jigs in Computervision

X, Y und Z sind die 3D-Koordinaten beispielsweise des Markermittelpunkts, während x und y die 2D-Pixelpositionen der Ecken auf dem Bild darstellen. Dies verdeutlicht die Mehrdeutigkeit der Parameter, also eine fehlende Information, die dadurch entsteht, dass ein 3D-Punkt in der realen Welt an einer beliebigen Stelle auf der Verbindungslinie zwischen dem Kameramittelpunkt und dem tatsächlichen 3D-Punkt liegen kann (siehe die orangefarbenen Punkte im Diagramm). Mit anderen Worten: Objekte beliebiger Größe können auf dem Bild in beliebiger Größe erscheinen, alles hängt von ihrem Abstand zur Kamera ab. In dieser Gleichung sind auch die 3D-Rotation (r-Parameter) und die Translation (t-Parameter) des Objekts oder umgekehrt der Kamera enthalten, ohne Einschränkung der Allgemeingültigkeit. Die Parameter f und c sind die „intrinsischen Parameter“, die die Optik der Kamera modellieren (in diesem einfachen Beispiel hier sehr grob).

Dennoch besteht eine lineare Beziehung zwischen den 3D-Punkten und den 2D-Punkten, und hätten wir alle Parameter dieser Gleichung gekannt, könnten wir Folgendes berechnen: (1) die reale 3D-Position des Markers anhand der 2D-Pixelkoordinaten und (2) die Drehung ri sowie die Verschiebung tx, y, z des Markers relativ zur Kamera. Man beachte, dass wir bei der Arbeit mit 2D-Koordinaten den Parameter in unserer Gleichung nicht einfach weglassen können; um die Pixelpunkte zu erhalten, würden wir vielmehr durch den letzten Eintrag im Vektor dividieren: x'=λx, x =x'/λ, y'=λy, y=y'/λ.

Wenn genügend entsprechende Punkte von 2D nach 3D vorliegen, können wir die obige Gleichung in ein System (homogener) linearer Gleichungen umformulieren, sodass wir R und t bestimmen können. Mithilfe der 3D-Marker erhalten wir für jeden Marker mindestens vier solcher entsprechenden 2D-3D-Punktpaare. Die 2D-Punkte ermitteln wir, indem wir das Bild betrachten und Ecken identifizieren. Die 3D-Punkte ergeben sich aus der Anordnung des Markers, die ebenfalls unserer Kontrolle unterliegt (da wir den Marker gedruckt haben). Der gesamte Prozess der Posenermittlung wird als „Perspective-n-Point“ bezeichnet, und es gibt viele Ansätze und Algorithmen zu seiner Lösung. So würde man beispielsweise in Python mit OpenCV die Kameraposition aus einer Menge ausgerichteter 2D-3D-Punkte ermitteln:

 _, R, t = cv2.solvePnP(aligned_3d, aligned_2d, K, dc)

Das Optimierungsproblem

Beschriften wir die letzte „Projektions“-Operation wie folgt:

Bündelt 3D-Jigs in Computervision
$$P_{2D}=\mathrm{Proj}([R|t], P_{3D})$$

Das bedeutet, dass wir die 2D-Pixelposition (P2D) erhalten, indem wir den 3D-Punkt P3D sowie die Rotation R und die Translation t zwischen der Kamera und dem Objekt projizieren. Das Hauptproblem bei diesem Projektionsverfahren besteht darin, dass es auf Berechnungen basiert, die über die 2D-Punkte in Pixelkoordinaten durchgeführt werden, die nicht sehr genau sind und zudem auf das Pixelraster quantisiert werden. Wenn wir die 3D-Punkte neu projizieren (sie zurück auf das Bild in 2D projizieren), nachdem wir die Objektpose [R|t] ermittelt haben, finden wir die 2D-Positionen oft mit einem Versatz gegenüber ihren Positionen im Bild. Das folgende Bild zeigt die Versätze, die in der Regel in extremen Situationen wie einem starken Winkel zur Kamera oder bei Unschärfe stärker auftreten.

3D-Vorrichtungen in Computervision

Unser Ziel ist es, die Kamerapositionsparameter so zu bestimmen, dass alle diese 2D-Versätze so gering wie möglich sind. Formuliert man dies mathematisch, möchten wir das folgende Minimierungsproblem lösen, bei dem nach dem optimalen [R|t] gesucht wird, das die Residuen minimiert:

Gleichung
\hat{[R|t]} = \arg\min_{[R|t]} \sum_i \Vert \mathrm{Proj}([R|t],P_i^{\mathrm{3D}}) - P_i^{\mathrm{2D}} \Vert^2

Die Differenz zwischen dem projizierten 3D-Punkt und dem 2D-Punkt wird als Residual bezeichnet. Im Allgemeinen bezeichnen wir dieses Problem als Problem der kleinsten Quadrate, da wir das Residual quadrieren. Dieser spezielle Fall ist ein nichtlineares Problem der kleinsten Quadrate, da der Operator Proj(.) nichtlinear ist. Mit dieser Formulierung können wir auch beispielsweise die intrinsischen Kameraparameter in das Optimierungsproblem einbeziehen und auch für diese optimale Werte finden:

Gleichung
\hat{[R|t]},\hat{\{P^\mathrm{3D}\}},\hat{K} = \mathop{\arg\min}_{[R|t],\{P^\mathrm{3D}\},K} \sum_i \Vert \mathrm{Proj}([R|t],P_i^{\mathrm{3D}},K) - P_i^{\mathrm{2D}} \Vert^2

Dies ist ein Beispiel für die Berechnung der Abweichungen in Python mit OpenCV anhand entsprechender 2D-3D-Punktpaare und die Ausgabe einer Liste der Abweichungen:

def calcResiduals(Rt):
 projPts2d,_ = cv2.projectPoints(pts3d, Rt[:3], Rt[3:], K, None)
 return (np.squeeze(projPts2d2) - pts2d21).ravel()

Glücklicherweise gibt es zahlreiche Algorithmen und Softwarepakete zur Lösung nichtlinearer Probleme der kleinsten Quadrate, wie beispielsweise den Ceres Solver, verschiedene MATLAB-Methoden, SciPy für Python und viele andere. Mit SciPy und OpenCV könnte man das Problem beispielsweise wie folgt lösen:

res = scipy.optimize.least_squares(calcResiduals, 
 np.hstack([
 cv2.Rodrigues(R)[0], 
 t[np.newaxis]
 ]).ravel())

Lösung der BA für 3D-Vorrichtungen

Bisher haben wir BA allgemein behandelt, doch unsere Optimierungsziele für 3D-Jigs unterscheiden sich ein wenig davon. Wenn wir unsere 3D-Jigs erstellen, erstellen wir im Grunde genommen eine 3D-Karte. Das Kartieren (und die Lokalisierung) ist ein bekanntes Problem beispielsweise in der autonomen Navigation und Odometrie, wo sich ein Fahrzeug anhand von Kameraaufnahmen in der Welt orientieren muss. Unsere Vorrichtungs-Kartierungstechnik ähnelt SLAM-Algorithmen (Simultaneous Localization and Mapping), da sie schrittweise eine Karte der beobachteten Welt erstellt und gelegentlich BA darauf anwendet, um Restfehler aus den verschiedenen linearen Schätzalgorithmen zu reduzieren.

3D-Vorrichtungen in Computervision

Wie im ersten Abschnitt erwähnt, sehen wir in einem bestimmten Bild möglicherweise einige Marker, andere jedoch nicht, und im Verlauf der Abbildung erhalten wir mehr Hinweise auf die Position der Marker zueinander. Wir beginnen mit den ersten sichtbaren Markern und notieren ihre 3D-Struktur, wobei wir davon ausgehen, dass sich diese Struktur nicht ändern wird. Beispielsweise wird die Transformation zwischen Marker 1 und Marker 2 als T12 notiert. In einem späteren Bild sehen wir Marker 1 nicht mehr, aber Marker 3 wird sichtbar, während Marker 2 weiterhin sichtbar bleibt. Wir notieren die Transformation von 2 nach 3 mit T23 und die von 1 nach 3 durch Verkettung der Transformationen: T13 = T12T23.

Der Abbildungsprozess führt zu weiteren Fehlern in der Karte, die sich mit dem bereits erwähnten intrinsischen Fehler bei der Bestimmung der 3D-Position des Markers summieren. Die Verkettung der Transformationen verstärkt diese Fehler so stark, dass es zu degenerierten Fällen kommen kann. Wir müssen BA anwenden, um diese kumulierten Fehler zu mindern, da der Jig-Abbildungsprozess andernfalls fehlschlägt.

Eine Möglichkeit zur Optimierung besteht darin, die Transformationen festzulegen, die wir aus der Kamerapositionsschätzung erhalten, was der zuvor beschriebenen BA-Formulierung ähneln würde. Wir suchen nach einem CamP, der die Residuen minimiert, wobei die 3D-Punkte gegeben sind:

Computervision
\hat{\mathrm{CamP}} = \arg\min_{\mathrm{CamP}} \sum_i \Vert \mathrm{Proj}(\mathrm{CamP},P_i^{\mathrm{3D}}) - P_i^{\mathrm{2D}} \Vert^2

Wir stellen jedoch fest, dass die Kameraposition aus den 3D-Punkten abgeleitet wird (über eine 2D-3D-Entsprechung). Daher könnten wir die Koordinaten der 3D-Punkte selbst optimieren und die Kameraposition daraus neu berechnen. Wir legen die Kameraposition fest und minimieren auf der Grundlage der 3D-Punkte, wobei wir nach den optimalen 3D-Punkten suchen, die den 2D-Reprojektionsfehler minimieren:

Computervision
\hat{\{P^{\mathrm{3D}}\}} = \arg\min_{\{P^{\mathrm{3D}}\}} \sum_i \Vert \mathrm{Proj}(\mathrm{CamP},P_i^{\mathrm{3D}}) - P_i^{\mathrm{2D}} \Vert^2

Dieser Trick hilft uns in erster Linie dabei, einen optimalen Satz von 3D-Punkten auf dem Objekt zu erhalten, wobei die Abweichungen gegenüber den ursprünglichen 2D-Punkten aus den Bildern minimal sind. Wir bewahren die Beziehung zwischen den 3D-Kartenpunkten und den IDs ihrer Marker bei, sodass wir zur Laufzeit mit solvePnP 2D-3D-Entsprechungen finden und die Objektpose rekonstruieren können. Bei einem neu eingehenden Bild lokalisieren wir die 2D-Positionen der Markerecken und ordnen sie den 3D-Punkten in der Karte zu, sodass wir insgesamt die Pose des Objekts aus vielen 2D-3D-Punkten gemeinsam ermitteln und den Fehler ausgleichen können.

Es ist deutlich zu erkennen, dass nach der Durchführung der BA auf der 3D-Jig-Karte die 2D-Versätze reduziert werden und die Schätzung der Objektposition deutlich besser ausfällt.

Schlussfolgerungen

Vorrichtungen in Tulip bieten eine Vielzahl von Anwendungsmöglichkeiten für Erfassungsvorgänge in der Fertigung. Mit den neuen 3D-Vorrichtungsfunktionen lassen sich neue Anwendungsfälle realisieren, wie beispielsweise die Verfolgung komplexer Werkzeuge, die aus verschiedenen Blickwinkeln sichtbar sind, beispielsweise Handwerkzeuge. Durch den Einsatz von Vorrichtungs-Mapping und Bündelausgleich sind wir in der Lage, komplexe Objektkarten mit minimalen Fehlern und optimierter Geometrie zu erstellen. Die Vorrichtungen stehen in Tulip zur Verfügung, wobei die Optimierung bereits integriert ist. Nutzen Sie sie, um Ihre Werkzeuge, Arbeitsstationen und sogar Materialien zu verfolgen.