Map3D
Cette classe permet d'effectuer la superposition de deux nuages de points pour déterminer la position d'un nuage "local" (qui sera celui de la caméra) dans un nuage "global" (qui sera celui de l'évènement). Les algorithmes permettant de le faire ne sont pas simples à comprendre ou à implémenter, on fait donc appel à la librairie probreg qui implémente plusieurs de ces algorithmes.
On va en général commencer par préparer les nuages de points, c'est-à-dire les simplifier, car avoir trop de points est inutile et ralentit de façon significative le fonctionnement des algorithmes. Pour cela, on va "voxeliser" les nuages de points (arrondir les coordonnées des points), et supprimer des points isolés (probablement présents à cause d'erreurs de modélisation).
Une autre chose que l'on peut ajouter à la préparation est l'ajout d'un "sol" dans le nuage de points "local". En effet, la caméra ne perçoit pas toujours le sol, et ajouter un sol approximatif en fonction de la hauteur estimée de la caméra permet quelques fois d'améliorer la précision du placement de la caméra, ainsi que d’empêcher que l'algorithme ne fasse n'importe quoi en retournant la détection.
Il y a deux fonctions permettant de lancer la reconnaissance :
match: cette fonction prépare et lance l'algorithme de reconnaissance de nuages de points, et renvoie un objet contenant la position et rotation estimée de la caméra dans le nuage de points globalbackground_match: cette fonction permet de lancer la reconnaissance dans un nouveau thread, ce qui permet de ne pas bloquer le reste du script lorsqu'on effectue la reconnaissance. Pour récupérer le résultat de l'algorithme, il faut vérifier la variableresultde l'objet Map3D, ayant une valeur différente deNonelorsque la reconnaissance est terminée