Aller au contenu principal

Nuages de points

Qu'est-ce que c'est ?

À partir des images de profondeur que nous renvoie la caméra, une des façons les plus simple de représenter en 3D ce que voit la caméra est un nuage de points. Un nuage de points est simplement un ensemble de points situés dans l'espace.

Pour manipuler plus simplement des nuages de points, on peut utiliser la librairie open3d (open3d.geometry.PointCloud), c'est en tout cas celle qui est utilisée dans ce projet.

Génération

Il faut donc pouvoir générer ces nuages de points : c'est relativement simple si on utilise la vue d'une caméra statique (on calcule directement le nuage à partir de la profondeur des pixels), mais cela devient bien plus complexe si l'on veut scanner en 3D une zone, car il faut prendre en compte les mouvements de la caméra entre les images.

Pour cela, j'ai testés différentes solution :

  • Dans un premier temps, j'ai essayé de le faire moi même, en suivant les rotations à partir de l'IMU intégré à la caméra, et en suivant les translations en regardant différents points de l'espace et en estimant le déplacement de la caméra par rapport à la moyenne de déplacement de ces points. Cela s'est révélé être bien plus complexe que prévu, car il faut pouvoir synchroniser très précisément les données récoltées et corriger les erreurs, notamment celles de la génération de la profondeur de l'image.
  • Une solution plus simple a été d'utiliser un logiciel fait pour la modélisation en 3D de l'environnement comme RTAB-Map. Il permet de scanner en 3D un environnement en utilisant toutes sortes de périphériques, dont les caméras OAK, et permet de visualiser et enfin d'exporter un nuage de point global en appliquant des filtres dessus. Le logiciel fonctionne correctement dans l'ensemble, mais ne modélise pas très bien les surfaces planes. Par exemple, une table va se retrouver avec trous dedans, il est donc difficile de se baser sur ces données pour la reconnaissance par la suite.
  • Enfin, la librairie SpectacularAI, développée pour supporter notamment les caméras OAK, permet d'effectuer la même chose en Python, et fonctionne particulièrement bien. Cependant, c'est une librairie qui est payante dans le cas d'une utilisation commerciale.
Note

Il est prévu que les prochains modèles de caméras de Luxonis embarquent des algorithmes de SLAM (Simultaneous Localization And Mapping). Cela pourrait donc être utilisé pour directement effectuer le mapping sans passer par une librairie externe.

Pour les données de tests, on a utilisé SpectacularAI, car c'est ce qui donnait les meilleurs résultats.

Reconnaissance

Une fois que l'on a les nuages de points voulus, il faut pouvoir les superposer. Il existe un certain nombre de méthodes permettant de le faire (on peut mentionner CPD, SVR ou encore ICP). Pour l'appliquer à nos données, on a utilisé la librairie probreg qui implémente tout un ensemble de ces méthodes, tout en supportant open3d. La méthode utilisée dans le projet est FilterReg, car c'est celle qui semble le mieux fonctionner, et a l'avantage d'être assez rapide.

Même si cette méthode est assez rapide, un trop grand nombre de points va quand même rendre la reconnaissance très longue, voir faire crasher la méthode (plusieurs millions de points, ce qui est en réalité assez rapidement atteint). Il faut donc filtrer les points qu'on utilise. Il est notamment possibler de filtrer les points d'un nuage de points avec open3d, ce qui permet de simplifier le nuage de points sans perdre la forme globale.
Cependant, la reconnaissance à tendance à faire pivoter dans tous les sens le nuage de point "local" (généré à partir de la vue d'une caméra statique), ce qui est incorrect. D'après nos essais, il semble que rajouter un ensemble de points représentants le sol permet d'améliorer la qualité de la reconnaissance, car le nuage de points ne va pas se retourner et à plus de chances de trouver sa correspondance sur le nuage de points "global" (généré par un scan de la zone).
Enfin, même en appliquant ces 2 astuces, la reconnaissance a des chances d'échouer et de placer le nuage de points local au mauvais endroit. Pour avoir les meilleurs résultats, on estime d'abord manuellement la position de la caméra dans la zone, et on indique la position correspondante à l'algorithme de reconnaissance.