Je dois trouver la différence de transformation et de rotation entre deux nuages de points 3D. Pour cela, je regarde PCL, car cela semble idéal.
Sur des données de test propres, le point le plus proche est itératif, mais donne des résultats étranges (même si je l’ai mal implémenté …). pcl::estimateRigidTransformation
fonctionne, et cela semble mieux, même si je suppose que les données bruitées seront plus mauvaises.
Ma question est:
Les deux nuages seront bruyants et, même s’ils doivent contenir les mêmes points, il y aura des divergences. Quelle est la meilleure façon de gérer cela?
Devrais-je trouver les caractéristiques correspondantes dans les deux nuages pour commencer et utiliser ensuite estimateTransform
? Ou devrais-je regarder une fonction RANSAC
pour supprimer les valeurs éloignées? ICP
est-il un meilleur moyen d’aller que estimateRigidTransform
?
La configuration d’un algorithme d’enregistrement de nuage de points robuste peut être une tâche ardue, car il est nécessaire de définir correctement différentes options, hyperparameters et techniques pour obtenir des résultats probants.
Cependant, la bibliothèque de nuages de points est fournie avec un ensemble de fonctions pré-implémentées pour résoudre ce type de tâche. La seule chose qui rest à faire est de comprendre ce que fait chaque bloc, puis de mettre en place un “pipeline ICP” constitué de ces blocs empilés les uns sur les autres.
Un pipeline ICP peut suivre deux chemins différents:
1. Algorithme d’enregistrement itératif
Le chemin le plus facile commence immédiatement en appliquant un algorithme itératif au point le plus proche sur le nuage en entrée (IC) pour le calculer avec le nuage en référence fixé (RC) en utilisant toujours la méthode du point le plus proche. Le PCI prend pour acquis, de manière optimiste, que les deux nuages de points sont suffisamment proches (bien avant la rotation R et la translation T) et que l’enregistrement convergera sans nouvel alignement initial.
Bien entendu, ce chemin peut se coincer dans un minimum local et donc très mal fonctionner car il est sujet à se laisser berner par tout type d’inexactitude dans les données d’entrée données.
2. Algorithme d’enregistrement basé sur les fonctionnalités
Pour surmonter cela, les gens ont travaillé à développer toutes sortes de méthodes et d’idées pour surmonter les mauvais enregistrements. Contrairement à un algorithme d’enregistrement purement itératif, un enregistrement basé sur les caractéristiques demande d’abord de trouver des correspondances de levier plus élevées entre les deux nuages de points afin d’accélérer le processus et d’améliorer la précision. Les méthodes sont encapsulées puis intégrées dans la ligne d’inscription pour former un modèle d’enregistrement complet.
L’image suivante de la documentation PCL montre un tel pipeline d’enregistrement:
Comme vous pouvez le constater, un enregistrement par paire doit s’effectuer selon différentes étapes de calcul afin de donner les meilleurs résultats. Les étapes simples sont:
Acquisition de données: un nuage d’entrée et un nuage de référence sont introduits dans l’algorithme.
Estimation des points clés: Un point clé ( point d’intérêt ) est un point dans le nuage de points qui présente les caractéristiques suivantes:
Ces points saillants dans un nuage de points sont très utiles car leur sum caractérise un nuage de points et permet de distinguer différentes parties de celui-ci.
pcl::NarfKeypoint pcl::ISSKeypoint3D< PointInT, PointOutT, NormalT > pcl::HarrisKeypoint3D< PointInT, PointOutT, NormalT > pcl::HarrisKeypoint6D< PointInT, PointOutT, NormalT > pcl::SIFTKeypoint< PointInT, PointOutT > pcl::SUSANKeypoint< PointInT, PointOutT, NormalT, IntensityT >
Informations détaillées: PCL Keypoint – Documentation
Description des points clés – Descripteurs de caractéristiques: Après la détection des points clés, nous calculons ensuite un descripteur pour chacun d’eux. “Un descripteur local est une représentation compacte du voisinage local d’un point. Contrairement aux descripteurs globaux décrivant un object complet ou un nuage de points, les descripteurs locaux tentent de ne ressembler à la forme et à l’apparence que dans un voisinage local autour d’un point et sont donc très appropriés pour le représenter. en termes de correspondance. ” (Dirk Holz et al.)
pcl::FPFHEstimation< PointInT, PointNT, PointOutT > pcl::NormalEstimation< PointInT, PointOutT > pcl::NormalEstimationOMP< PointInT, PointOutT > pcl::OURCVFHEstimation< PointInT, PointNT, PointOutT > pcl::PrincipalCurvaturesEstimation< PointInT, PointNT, PointOutT > pcl::IntensitySpinEstimation< PointInT, PointOutT >
Informations détaillées: Fonctions PCL – Documentation
Estimation de la correspondance: la tâche suivante consiste à trouver des correspondances entre les points clés trouvés dans les nuages de points. Habituellement, on tire parti des descripteurs de fonction locaux calculés et associe chacun d’eux à son homologue correspondant dans l’autre nuage de points. Toutefois, étant donné que deux parsings d’une même scène ne comportent pas nécessairement le même nombre de descripteurs de caractéristiques qu’un nuage pouvant contenir plus de données que l’autre, nous devons exécuter un processus de rejet de correspondance séparé.
pcl::registration::CorrespondenceEstimation< PointSource, PointTarget, Scalar > pcl::registration::CorrespondenceEstimationBackProjection< PointSource, PointTarget, NormalT, Scalar > pcl::registration::CorrespondenceEstimationNormalShooting< PointSource, PointTarget, NormalT, Scalar >
Rejet des correspondances: L’une des méthodes les plus courantes pour rejeter les correspondances consiste à utiliser le RANSAC (consensus aléatoire). Mais PCL vient avec plus d’algorithmes de rejet qu’il vaut la peine de regarder de plus près:
pcl::registration::CorrespondenceRejectorSampleConsensus< PointT > pcl::registration::CorrespondenceRejectorDistance pcl::registration::CorrespondenceRejectorFeatures::FeatureContainer< FeatureT > pcl::registration::CorrespondenceRejectorPoly< SourceT, TargetT >
Informations détaillées: Inscription du module PCL – Documentation
Estimation de la transformation: Après avoir calculé des correspondances robustes entre les deux nuages de points, un algorithme d’orientation absolue est utilisé pour calculer une transformation à 6 degrés de liberté (6 degrés de liberté) appliquée au nuage d’entrée pour correspondre au nuage de points de référence. Il existe différentes approches algorithmiques pour le faire. PCL inclut toutefois une implémentation basée sur la décomposition en valeurs singulières (SVD). Une masortingce 4×4 est calculée qui décrit la rotation et la translation nécessaires pour correspondre aux nuages de points.
pcl::registration::TransformationEstimationSVD< PointSource, PointTarget, Scalar >
Informations détaillées: Inscription du module PCL – Documentation
Lectures complémentaires:
Si vos nuages sont bruyants et que votre alignement initial n’est pas très bon, oubliez l’application ICP depuis le début. Essayez d’obtenir des points-clés sur vos nuages, puis d’estimer les caractéristiques de ces points-clés. Vous pouvez tester différents algorithmes de points-clés / fonctions et choisir celui qui convient le mieux à votre cas.
Ensuite, vous pouvez faire correspondre ces caractéristiques et obtenir des correspondances. Filtrez ces correspondances dans une boucle RANSAC pour obtenir les inliers que vous utiliserez pour obtenir une transformation initiale. CorrespondenceRejectorSampleConsensus
vous aidera dans cette étape.
Une fois que vous avez appliqué cette transformation, vous pouvez utiliser ICP pour un raffinement final.
Le pipeline est quelque chose comme:
REMARQUE: Ce pipeline n’est utile que si les deux nuages de points sont à la même échelle. Dans les autres cas, vous devez calculer le facteur d’échelle entre les nuages.
Vous pouvez utiliser super 4pcs pour l’enregistrement global. ICP est une méthode locale telle que la descente de gradient qui dépend de la réponse initiale.
plus d’infos: http://geometry.cs.ucl.ac.uk/projects/2014/super4PCS/