Ich muss die Transformations- und Rotationsdifferenz zwischen zwei 3D-Punktwolken finden. Dafür sehe ich PCL, wie es ideal erscheint.
Bei sauberen Testdaten funktioniert Iterativ am nächsten, aber es ergeben sich merkwürdige Ergebnisse (obwohl ich es möglicherweise falsch implementiert habe ...)
Ich habe pcl::estimateRigidTransformation
funktioniert, und es scheint besser, obwohl ich nehme an, wird mit lauten Daten schlechter umgehen.
Meine Frage ist:
Die zwei Wolken werden laut sein, und obwohl sie die gleichen Punkte enthalten sollten, wird es einige Diskrepanzen geben. Was ist der beste Weg, damit umzugehen?
Sollte ich zu Beginn entsprechende Features in den beiden Clouds finden und dann estimateTransform
verwenden? Oder sollte ich eine Funktion RANSAC
betrachten, um Ausreißer zu entfernen? Ist ICP
ein besserer Weg als estimateRigidTransform
?
Die Einrichtung eines robusten Punktwolken-Registrierungsalgorithmus kann eine Herausforderung darstellen, bei der verschiedene Optionen, Hyperparameter und Techniken korrekt eingestellt werden, um starke Ergebnisse zu erzielen.
Allerdings enthält die Point Cloud-Bibliothek eine ganze Reihe vorimplementierter Funktionen, um diese Art von Aufgabe zu lösen. Das einzige, was noch zu tun ist, ist zu verstehen, was jeder Block macht, und dann eine sogenannte ICP-Pipeline aufzubauen, die aus diesen Blöcken besteht, die aufeinander gestapelt sind.
Eine ICP-Pipeline kann zwei verschiedenen Pfaden folgen:
1. Iterativer Registrierungsalgorithmus
Der einfachere Pfad beginnt sofort, indem er einen iterativen Algorithmus für den nächstgelegenen Punkt auf der Eingangs-Wolke (IC) anwendet, um ihn mit der festen Referenz-Wolke (RC) zu berechnen, indem immer die Methode des nächsten Punktes verwendet wird. Der ICP nimmt eine optimistische Annahme an, dass die zwei Punktwolken nahe genug sind (gute Vorperiode von Rotation R und Translation T), und die Registrierung konvergiert ohne weitere anfängliche Ausrichtung.
Dieser Pfad kann natürlich in einem lokalen Minimum hängen bleiben und daher sehr schlecht funktionieren, da er anfällig dafür ist, durch irgendwelche Ungenauigkeiten in den gegebenen Eingabedaten getäuscht zu werden.
2. Feature-basierter Registrierungsalgorithmus
Um dies zu überwinden, haben die Menschen daran gearbeitet, alle Arten von Methoden und Ideen zu entwickeln, um die schlechte Registrierung zu überwinden. Im Gegensatz zu einem rein iterativen Registrierungsalgorithmus ist eine featurebasierte Registrierung zunächst darauf angewiesen, höhere Hebelkorrespondenzen zwischen den beiden Punktwolken zu finden, um den Prozess zu beschleunigen und die Genauigkeit zu verbessern. Die Methoden werden gekapselt und dann in die Registrierungsziffer eingebettet, um ein vollständiges Registrierungsmodell zu bilden.
Das folgende Bild aus der PCL-Dokumentation zeigt eine solche Registrierungs-Pipeline:
Wie Sie sehen können, sollte eine paarweise Registrierung durch verschiedene Berechnungsschritte laufen, um die beste Leistung zu erbringen. Die einzelnen Schritte sind:
Datenerfassung: Eine Eingangswolke und eine Referenzwolke werden in den Algorithmus eingegeben.
Schätzung von Schlüsselpunkten: Ein Schlüsselpunkt ( Interessenpunkt ) ist ein Punkt innerhalb der Punktwolke das hat die folgenden Eigenschaften:
Solche hervorstechenden Punkte in einer Punktwolke sind so nützlich, weil ihre Summe eine Punktwolke charakterisiert und dabei hilft, verschiedene Teile davon unterscheidbar zu machen.
%Vor%Detaillierte Informationen: PCL-Keypoint - Dokumentation
Beschreibung der Schlüsselpunkte - Feature-Deskriptoren: Nachdem wir die Schlüsselpunkte erkannt haben, berechnen wir einen Deskriptor für jeden von ihnen. "Ein lokaler Deskriptor eine kompakte Darstellung der lokalen Nachbarschaft eines Punktes. Im Gegensatz zu globalen Deskriptoren, die ein vollständiges Objekt oder eine Punktwolke beschreiben, versuchen lokale Deskriptoren nur in einer lokalen Nachbarschaft um einen Punkt herum Form und Aussehen zu ähneln und eignen sich daher sehr gut dazu in Bezug auf das Matching. " (Dirk Holz et al.)
%Vor%Detaillierte Informationen: PCL-Funktionen - Dokumentation
Korrespondenzschätzung: Die nächste Aufgabe besteht darin, Übereinstimmungen zwischen den in den Punktwolken gefundenen Schlüsselpunkten zu finden. In der Regel nutzt man die berechneten lokalen Featuredeskriptoren aus und vergleicht jedes einzelne mit seinem entsprechenden Gegenstück in der anderen Punktwolke. Aufgrund der Tatsache, dass zwei Scans aus einer ähnlichen Szene nicht notwendigerweise die gleiche Anzahl von Feature-Deskriptoren haben, wie eine Cloud mehr Daten als die andere haben kann, müssen wir einen separaten Korrespondenz-Ablehnungs-Prozess durchführen.
%Vor%Korrespondenzabweisung: Einer der gebräuchlichsten Ansätze zum Zurückweisen von Korrespondenz ist RANSAC (Stichprobenkonsens). Aber PCL kommt mit mehr Zurückweisungsalgorithmen, die es wert sind, sie genauer zu betrachten:
%Vor%Detaillierte Informationen: Registrierung des PCL-Moduls - Dokumentation
Transformation Estimation: Nachdem robuste Korrespondenzen zwischen den beiden Punktwolken berechnet wurden, wird ein Absoluter Orientierungsalgorithmus verwendet, um eine 6DOF Transformation (6 Freiheitsgrade) zu berechnen, die auf die Eingangswolke angewendet wird Referenzpunktwolke. Es gibt viele verschiedene algorithmische Ansätze, aber PCL enthält eine Implementierung, die auf der Singular Value Decomposition (SVD) basiert. Es wird eine 4x4-Matrix berechnet, die die Rotation und Translation beschreibt, die für die Anpassung der Punktwolken benötigt wird.
%Vor%Detaillierte Informationen: Registrierung des PCL-Moduls - Dokumentation
Weiterführende Literatur:
Wenn Ihre Wolken laut sind und Ihre anfängliche Ausrichtung nicht sehr gut ist, vergessen Sie die Anwendung von ICP von Anfang an. Versuchen Sie, Schlüsselpunkte in Ihren Clouds zu erhalten, und schätzen Sie dann die Funktionen dieser Schlüsselpunkte. Sie können verschiedene Schlüsselpunkt- / Feature-Algorithmen testen und den Algorithmus auswählen, der für Ihren Fall besser ist.
Dann können Sie diese Merkmale zuordnen und Übereinstimmungen erhalten. Filtern Sie diese Korrespondenzen in einer RANSAC-Schleife, um Inliers zu erhalten, mit denen Sie eine Anfangstransformation erhalten. CorrespondenceRejectorSampleConsensus
wird Ihnen in diesem Schritt helfen.
Sobald Sie diese Umwandlung angewendet haben, können Sie ICP für eine abschließende Verfeinerung verwenden.
Die Pipeline ist etwas wie:
HINWEIS: Diese Pipeline ist nur sinnvoll, wenn beide Punktwolken im gleichen Maßstab sind. In anderen Fällen müssen Sie den Skalierungsfaktor zwischen den Wolken berechnen.
Sie können super 4pcs für die globale Registrierung verwenden. ICP ist eine lokale Methode, wie zum Beispiel die Gradientenabsenkung, die von der anfänglichen Antwort abhängt.
Weitere Informationen: Ссылка
Tags und Links c++ point-cloud-library point-clouds