Bibliothèque de nuages ​​de points, enregistrement robuste de deux nuages ​​de points

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:

Enregistrement par paire PCL

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:

  1. Acquisition de données: un nuage d’entrée et un nuage de référence sont introduits dans l’algorithme.

  2. 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:

    1. il a une définition claire, de préférence mathématiquement bien fondée,
    2. il occupe une position bien définie dans l’espace image,
    3. la structure de l’image locale autour du point d’intérêt est riche en contenu d’informations locales

    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

  3. 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

  4. 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 > 
  5. 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

  6. 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:

  • Enregistrement PCL Point Cloud
  • Enregistrement avec la bibliothèque de nuages ​​de points
  • Enregistrement PCL – Présentation
  • PCL – Fonctionnement des fonctionnalités

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:

  1. Détecter les clés dans les deux nuages ​​de points
  2. Estimer les caractéristiques de ces points-clés
  3. Match des fonctionnalités et obtenir des correspondances
  4. Supprimez les doublons et appliquez la boucle RANSAC-ish pour récupérer les éléments internes
  5. Obtenir la transformation initiale et l’appliquer à un nuage de points
  6. Une fois les deux nuages ​​alignés, appliquez l’enregistrement ICP pour le raffinement.

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/