Einführung

3D-Vorrichtungen in Tulip Vision

Tulip verwendet 3D-Markierungsschablonen, weil dies die absolut genaueste Methode ist, um Objekte in einer sehr lauten Umgebung, wie z.B. in der Werkstatt, in hoher Genauigkeit zu verfolgen. Die Jig-Marker lassen sich leicht auf Dinge kleben. Man kann sie auf einen Mülleimer, einen Gabelstapler, einen Sattelschlepper oder ein winziges Uhrmacherwerkzeug kleben - sie funktionieren in jedem Maßstab, solange die Kamera sie erfassen kann. Ein klassisches Anwendungsfall für Vorrichtungen ist natürlich die Verfolgung von Vorrichtungsobjekten, in die das Werkstück passt, aber mit den 3D-Fähigkeiten fügen wir die Möglichkeit hinzu, komplexe Objekte zu verfolgen, mit Markierungen, die auf verschiedenen Oberflächen des Objekts angebracht sind.

Jigs werden aus vielen gruppierten 3D-Markern hergestellt. Die 3D-Marker zeigen eine Stelle auf dem 3D-Objekt an, die im "Rahmen" des Objekts fixiert ist (ein Rahmen sind die 3 Achsen, die zur Definition von Position und Ausrichtung verwendet werden, die X-, Y- und Z-Achse), vorausgesetzt, das Objekt ist ein starrer Körper. Wann immer wir die Markierung sehen, wissen wir, dass sie an demselben Punkt des Objekts angebracht ist. Die Jig-Marker-Gruppe - definiert ein komplettes Objekt. Jigs können komplexe 3D-Formen definieren, wobei einige der Markierungen sichtbar und andere verborgen sind. Die sichtbaren Markierungen helfen uns, die Position und Ausrichtung des Objekts zu bestimmen. Wenn die verborgenen Markierungen sichtbar werden, gleichen sie die anderen Markierungen aus, die jetzt verborgen sind.

Optimierung der Bündelanpassung

Wenn wir eine Vorrichtung aus Markierungen definieren, nehmen wir viele Ansichten des markierten Objekts aus verschiedenen Winkeln in Bezug auf die Kamera auf. Jedes von der Kamera aufgenommene Bild liefert eine weitere "Ansicht" des Objekts mit seinen Markierungen. Und in jedem Bild berechnen wir die Position der Markierungen auf dem Objekt und ihre Beziehungen (Transformationen). Nachdem wir genügend Ansichten aufgenommen haben, kombinieren wir sie zu einem ganzheitlichen 3D-Modell des Objekts, dem Prozess der "Registrierung". Aus verschiedenen Gründen, die mit der Optik und der numerischen Stabilität der Berechnungen zu tun haben, stimmen die Ansichten um das Objekt herum jedoch nicht immer perfekt überein. Je mehr Ansichten wir von dem Objekt machen, desto größer wird der kumulative Fehler bei der Registrierung, bis die endgültige Registrierung möglicherweise unbrauchbar ist. An dieser Stelle kommt die "Bündelanpassung" ins Spiel.

Die Bündelausgleichung (BA) ist ein numerischer Optimierungsprozess, der den kumulativen Fehler aus der Registrierung mehrerer Kameraansichten zur Rekonstruktion einer Geometrie bekämpft. Bei der traditionellen BA werden meist alle Parameter der Rekonstruktion optimiert, einschließlich der optischen Modellierung der Kamera. Doch bevor wir den Prozess der BA erklären, sollten wir die Parameter definieren, die bei der Optimierung eine Rolle spielen. Wir empfehlen das wunderbare Buch von Prof. Richard Szeliski "Computervision: Algorithms and Applications", Springer press, 2011 (Kapitel 7 pp320).

Kamera-Objekt-Pose mit 3D-Markern

Wenn eine Kamera auf einen Marker blickt, der ein flaches Objekt ist, ist es möglich, die Ausrichtung des Markers in Bezug auf den Ursprung der Kamera zu berechnen. Betrachten Sie das folgende Diagramm:

Bündelt 3D-Vorrichtungen in Computervision

Der Marker ist in der Kameraansicht sichtbar und wird auf die Bildebene projiziert - ein konzeptionelles Konstrukt, das die Übersetzung zwischen 3D- und 2D-Pixelkoordinaten formuliert. Wenn wir jedoch ein Bild der Szene mit dem Marker aufnehmen, kennen wir die Parameter des 3D-Punkts nicht. Wir können nur erkennen, wo diese 3D-Punkte auf das 2D-Bild projiziert wurden. Diese Projektion kann durch die folgende Gleichung erfasst werden:

Bündel 3D Vorrichtungen in Computervision

X, Y und Z sind die 3D-Koordinaten z.B. des Zentrums der Markierung, während x und y die 2D-Pixel-Position der Ecken auf dem Bild sind. Das markiert die Mehrdeutigkeit in den Parametern, eine fehlende Information, die durch die Tatsache verursacht wird, dass ein 3D-Punkt in der Welt überall auf dem Strahl zwischen dem Kamerazentrum und dem tatsächlichen 3D-Punkt erscheinen kann (siehe die verblassten orangen Punkte im Diagramm). Mit anderen Worten: Objekte beliebigen Maßstabs können auf dem Bild in beliebiger Größe erscheinen, alles hängt von ihrer Entfernung zur Kamera ab. Wir haben in dieser Gleichung auch die 3D-Rotation (r-Parameter) und die Translation (t-Parameter) des Objekts oder umgekehrt der Kamera, ohne Verlust der Allgemeinheit. Die f- und c-Parameter sind die "intrinsischen Parameter", die die Optik der Kamera modellieren (in diesem Spielzeugbeispiel nur sehr grob).

Nichtsdestotrotz gibt es eine lineare Beziehung zwischen den 3D-Punkten und den 2D-Punkten. Wenn wir alle Parameter in dieser Gleichung kennen würden, könnten wir Folgendes berechnen: (1) die reale 3D-Position des Markers aus den 2D-Pixelkoordinaten und (2) die Rotation ri und die Translation tx,y,z des Markers in Bezug auf die Kamera. Um mit 2D-Koordinaten zu arbeiten, können wir den Parameter in unserer Gleichung nicht einfach weglassen. Um die Pixelpunkte zu erhalten, müssten wir durch den letzten Eintrag im Vektor dividieren: x'=λx, x =x'/λ, y'=λy, y=y'/λ.

Wenn wir genügend korrespondierende Punkte von 2D zu 3D haben, können wir die obige Gleichung in eine Reihe von (homogenen) linearen Gleichungen umwandeln, so dass wir R und t wiederherstellen können. Mit den 3D-Markern können wir mindestens 4 solcher korrespondierenden 2D-3D-Punktpaare für jeden Marker erhalten. Die 2D-Punkte erhalten wir, wenn wir uns das Bild ansehen und die Ecken finden. Die 3D-Punkte ergeben sich aus der Anordnung der Marker, die wir ebenfalls unter Kontrolle haben (da wir die Marker gedruckt haben). Der gesamte Prozess der Wiederherstellung der Pose ist als Perspective-n-Point bekannt und es gibt viele Ansätze und Algorithmen für seine Lösung. So könnte man zum Beispiel die Kameraposition in Python mit OpenCV aus einer Reihe von ausgerichteten 2D-3D-Punkten ermitteln:

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

Das Optimierungsproblem

Lassen Sie uns die letzte "Projektions"-Operation wie folgt vermerken:

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

Das heißt, wir erhalten die 2D-Pixelposition (P2D) aus der Projektion des 3D-Punkts P3D und der Rotation R und Translation t zwischen der Kamera und dem Objekt. Das Hauptproblem bei dieser Art der Projektion ist, dass sie auf Berechnungen basiert, die über die 2D-Punkte in Pixelkoordinaten durchgeführt werden, die nicht sehr genau und außerdem auf dem Pixelraster quantisiert sind. Wenn wir die 3D-Punkte reprojizieren (sie auf das Bild in 2D zurückprojizieren), nachdem wir die Objektposition [R|t] ermittelt haben, finden wir die 2D-Positionen oft mit einem Versatz zu 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 Vorhandensein von Unschärfe in stärkerem Kontrast auftreten.

3D Vorrichtungen in Computervision

Unser Ziel ist es, die Kamerapositionsparameter so zu finden, dass alle diese 2D-Offsets so klein wie möglich sind. Um dies in eine Formel zu fassen, möchten wir das folgende Minimierungsproblem lösen, das nach dem optimalen [R|t] sucht, das die Residuen minimiert:

Gleichung
\hat{[R|t]} = \mathop{\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 reprojizierten 3D-Punkt und dem 2D-Punkt wird als Residuum bezeichnet. Und im Allgemeinen nennen wir dieses Problem ein Problem der kleinsten Quadrate, da wir das Residuum quadrieren. In diesem speziellen Fall handelt es sich um ein nichtlineares Problem der kleinsten Quadrate, da der Operator Proj(.) nichtlinear ist. Mit dieser Formulierung können wir in das Optimierungsproblem z.B. auch die kamerainternen Parameter 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 Residuen in Python mit OpenCV aus entsprechenden 2D-3D-Punktpaaren und die Ausgabe einer Liste von Residuen:

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

Glücklicherweise gibt es viele Algorithmen und Softwarepakete zur Lösung nichtlinearer Kleinste-Quadrate-Probleme, wie den Ceres Solver, verschiedene MATLAB-Methoden, Pythons SciPy und viele andere. Mit SciPy und OpenCV könnte man das Problem zum Beispiel so lösen:

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

Lösen von BA für 3D Jigs

Bisher haben wir BA in allgemeiner Form besprochen, aber unsere Optimierungsziele für 3D-Vorrichtungen sind ein wenig anders. Wenn wir unsere 3D-Vorrichtungen bauen, erstellen wir im Wesentlichen eine 3D-Karte. Mapping (und Lokalisierung) ist ein bekanntes Problem, z.B. in der autonomen Navigation und Odometrie, wo ein Fahrzeug sich auf der Grundlage von Beobachtungen von Kameras in der Welt orientieren muss. Unsere Jig-Mapping-Technik ähnelt den SLAM-Algorithmen (Simultaneous Localization and Mapping), da sie eine Karte der beobachteten Welt inkrementell aufbaut und gelegentlich BA darauf durchführt, um Restfehler aus den verschiedenen linearen Schätzalgorithmen zu reduzieren.

3D-Vorrichtungen in Computervision

Wie bereits im ersten Abschnitt erwähnt, können wir in einem bestimmten Bild einige Marker sehen, andere jedoch nicht. Je weiter die Kartierung fortschreitet, desto mehr Anhaltspunkte erhalten wir über die Position der Marker zueinander. Wir beginnen mit den ersten sichtbaren Markierungen und notieren ihre 3D-Struktur, wobei wir davon ausgehen, dass sich diese Struktur nie ändern wird. Zum Beispiel wird die Transformation zwischen Markierung 1 und Markierung 2 als T12 notiert. In einem späteren Bild sehen wir Markierung 1 nicht mehr, aber Markierung 3 wird sichtbar, während Markierung 2 sichtbar bleibt. Wir notieren die Transformation von 2 nach 3 mit T23 und von 1 nach 3 durch Verkettung der Transformationen: T13 = T12T23.

Der Zuordnungsprozess führt zu weiteren Fehlern in der Karte. Hinzu kommt der bereits erwähnte Fehler bei der Wiederherstellung der 3D-Position der Markierung. Durch die Verkettung von Transformationen werden die Fehler noch verstärkt, bis zu dem Punkt, an dem degenerierte Fälle auftreten können. Wir müssen BA anwenden, um die zusammengesetzten Fehler zu mildern, sonst wird die Jig-Mapping-Prozedur scheitern.

Eine Möglichkeit der Optimierung besteht darin, die Transformationen zu fixieren, die wir aus der Schätzung der Kameraposition erhalten, und das würde ähnlich aussehen wie die BA-Formulierung von vorher. Wir suchen nach einem CamP, das die Residuen minimiert, wenn die 3D-Punkte gegeben sind:

Computervision Gleichung
\hat{\mathrm{CamP}} = \mathop{\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 von den 3D-Punkten abgeleitet wird (durch 2D-3D-Korrespondenz). Daher könnten wir die Koordinaten der 3D-Punkte selbst optimieren und die Kameraposition anhand dieser Punkte neu berechnen. Wir legen die Kameraposition fest und minimieren sie anhand der 3D-Punkte. Dabei suchen wir nach den optimalen 3D-Punkten, die den Restwert der 2D-Reprojektion minimieren:

Computervision Gleichung
\hat{\{P^{\mathrm{3D}}\}} = \mathop{\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 zu erhalten, die sich auf dem Objekt befinden und deren Fehler in Bezug auf die ursprünglichen 2D-Punkte aus den Bildern minimal sind. Wir behalten die Beziehung zwischen 3D-Kartenpunkten und ihrer Marker-ID bei, so dass wir zur Laufzeit 2D-3D-Entsprechungen finden und die Objektposition mit solvePnP wiederherstellen können. Bei einem neuen eingehenden Bild suchen wir die 2D-Positionen der Markierungsecken und gleichen sie mit den 3D-Punkten in der Karte ab. So können wir die Pose des Objekts aus vielen 2D-3D-Punkten zusammen ermitteln und den Fehler ausgleichen.

Wir können deutlich sehen, dass nach der Durchführung der BA auf der 3D-Jig-Map die 2D-Offsets reduziert werden und die Schätzung der Objektposition viel besser ausfällt.

Schlussfolgerungen

Jigs in Tulip Vision bieten eine breite Palette von Anwendungsfällen für die Erfassung von Vorgängen in der Fertigung. Mit den neuen 3D-Jig-Funktionen lassen sich neue Anwendungsfälle erschließen, z. B. die Verfolgung komplexer Werkzeuge, die aus verschiedenen Winkeln sichtbar sind, wie z. B. handgeführte Werkzeuge. Durch die Verwendung von Jig-Mapping und Bündelanpassung sind wir in der Lage, komplexe Objektkarten mit minimalen Fehlern und optimierter Geometrie zu erstellen. Jigs können Sie in Tulip sofort verwenden, wobei die Optimierung bereits integriert ist. Verwenden Sie sie, um Ihre Werkzeuge, Arbeitsgeräte und sogar Materialien zu verfolgen.