logo nomagic vert
1 kh5hxxzrzoocruvavtbjzg

Relever le défi des 16 caméras Intel RealSense

Par Piotr Rybicki

Chez Nomagic, nous apprenons aux robots à comprendre le monde réel. Nul n'ignore que le monde réel est d'une complexité incroyable, et pour certaines tâches, un regard extérieur serait bienvenu. Certains de nos robots partageaient ce besoin, et nous avons donc décidé de leur apporter notre aide.

Dans cet article, nous partageons notre expérience de création d'un système permettant de capturer rapidement des photos couleur et de profondeur à partir de 16 caméras Intel RealSense maximum, avec une utilisation minimale du processeur, grâce au système d'exploitation robotique ROS1. Code source inclus !

connexion physique

À première vue, on pourrait croire qu'il suffit d'acheter quelques hubs USB 3, de connecter toutes les caméras et le tour est joué. Cependant, se procurer suffisamment de ports USB 3 ne représente qu'une difficulté superficielle.

Le véritable défi réside dans la bande passante limitée de l'USB 3. Intel propose un excellent article détaillant les différentes étapes de la connexion de plusieurs caméras. L'essentiel est de maximiser le nombre et la qualité des contrôleurs USB 3 gérant les caméras. Nos PC ne disposant que d'un seul contrôleur USB, nous avons opté pour cette carte PCIe USB, qui possède un contrôleur USB dédié pour chaque port : https://www.delock.com/produkte/2072_Type-A/89365/merkmale.html.

Défi du contrôleur USB pour la caméra RealSense

Pour obtenir le nombre de ports souhaité (16) et garantir que chaque caméra dispose d'une alimentation suffisante, nous avons également acheté quatre hubs USB externes alimentés supplémentaires : https://www.delock.de/produkte/G_64053/merkmale.html.

Concentrateurs USB pour le défi de la caméra RealSense

Connecter toutes les caméras était très amusant :

Sous surveillance extrême

On peut se cacher de beaucoup de robots, mais pas de celui-ci 🙂

La bataille

La plupart du temps, un robot n'a besoin que d'une seule caméra, et même lorsqu'on en utilise plusieurs, il s'agit généralement de 2 à 4 caméras. Connecter 16 caméras à un seul PC semble ambitieux. Alors, on s'est dit : allons-y !

Nous avons installé et activé les caméras une par une, en observant la vidéo de profondeur sur un écran à l'aide de ros-realsense et RViz. Au bout d'un certain temps, nous avons constaté une baisse du nombre d'images par seconde (IPS). Une rapide investigation a permis d'en identifier la cause :

Code FPS

Un des signes que les caméras fonctionnent 🙂

La capture d'écran ci-dessus est probablement familière aux utilisateurs Linux : une utilisation maximale du processeur, ce qui est indésirable, surtout si vous prévoyez d'exécuter d'autres programmes sur la machine. Sur notre PC, une seule caméra consommait environ 1,2 cœur de processeur. L'étape suivante consistait à déterminer la source de cette charge.

Code de chargement du processeur

Profilage du problème

Nous avons effectué un exercice de profilage et constaté que la majeure partie de la charge du processeur était due au post-traitement dans ros-realsense. Chaque image provenant de la caméra est filtrée pour éliminer le bruit et compléter les données manquantes par interpolation spatiale et/ou temporelle. Le filtrage d'une seule image prend quelques millisecondes ; une dizaine de caméras suffisent donc à saturer même un processeur très performant. ros-realsense Bien que cette option soit facultative, elle améliore considérablement la qualité des images de profondeur, c'est pourquoi nous avons souhaité la conserver.

Nous avons constaté qu'il n'était pas nécessaire de filtrer toutes les images, car nous n'en utilisons finalement qu'une seule toutes les quelques secondes. Pour remédier à cela, nous avons créé une branche et l'avons modifiée. ros-realsense Pour examiner ce cas d'utilisation, au lieu de filtrer chaque image, nous avons stocké les images les plus récentes dans une mémoire tampon circulaire et appliqué les filtres uniquement sur demande via un appel de service ROS. La conservation et le filtrage de plusieurs images (plutôt qu'une seule) étaient nécessaires car certains processus de filtrage reposent sur des images antérieures.

Cette optimisation a considérablement réduit l'utilisation du processeur à environ 201 TP3T par caméra. Cependant, le combat n'était pas terminé. Les faibles fréquences d'images persistaient, mais le schéma a changé : au lieu d'affecter toutes les caméras, le problème est devenu plus localisé, provoquant des baisses de performance intermittentes sur certaines caméras. Le coupable (prévisible) a été identifié dans ros-realsense journaux, qui étaient remplis de messages tels que :

13/05 10:16:06,190 AVERTISSEMENT [140247325210368] (backend-v4l2.cpp:1057) Trame incomplète reçue : Trame vidéo incomplète détectée ! Taille : 541 696 octets sur 1 843 455 (29%)

Malgré un débit inférieur au débit USB théorique, les caméras peinaient à transmettre des images complètes. Nous avons donc réduit la fréquence d'images à 6 images par seconde et désactivé le flux infrarouge. Heureusement, cela a suffi à stabiliser le système.

Résultats

Une fois la bataille gagnée, nous avons testé notre solution pour évaluer les latences que nous pouvions atteindre.

Combattre la latence

Les images couleur (bleues) ne nécessitent aucun traitement et sont donc reçues rapidement, généralement en moins de 10 millisecondes. La demande d'une image de profondeur (verte) déclenche un filtrage en attente, qui prend environ 150 ms, selon la planification des threads. Les images de profondeur alignées (rouges) requièrent un traitement légèrement plus poussé, d'où la légère augmentation de la latence.

Le fonctionnement des caméras à une faible fréquence d'images et avec des temps de traitement plus longs entraîne un léger vieillissement des images fournies par notre service. Cependant, si votre scène est majoritairement statique, comme la nôtre, un délai de 0,5 seconde est acceptable.

Combattre la latence et gagner

L'histogramme ci-dessus montre l'âge des images reçues, mesuré à l'aide d'horodatages créés au début de l'exposition (l'âge minimum est donc égal à l'intervalle entre les images — 166 millisecondes).

Conclusion

En résumé, notre modification réduit considérablement la charge du processeur générée par les caméras Intel RealSense lorsqu'il est nécessaire de récupérer occasionnellement une seule image. Grâce à cette modification et à du matériel supplémentaire, il est possible de connecter et d'utiliser plus d'une douzaine de caméras.

Le code source de cette modification se trouve ici : https://github.com/NoMagicAi/realsense-ros.

Partager l'article :

Vous aimerez peut-être aussi

Votre avenir en robotique commence ici

Contactez Nomagic pour découvrir comment notre technologie innovante peut faire passer vos processus de traitement des commandes à la vitesse supérieure.