Détection et reconnaissance d'objets de la caméra dans ROS à l'aide du package find_object_2d



L'un des avantages du Robot Operating System (ROS) est qu'il possède de nombreux packages qui peuvent être réutilisés dans nos applications. Dans notre cas, nous voulons introduire un système de reconnaissance et de détection d'objets. Le package find_object_2d implémente des détecteurs et descripteurs de fonctions SURF, SIFT, ORB, FAST et BRIEF pour détecter des objets . En utilisant l'interface graphique fournie par ce package, nous pouvons marquer les objets que nous voulons détecter et les enregistrer pour une détection future. Le nœud détecteur détectera les objets dans les images de la caméra et publiera les détails de l'objet à travers le sujet. À l'aide d'un capteur 3D, il peut évaluer la profondeur et l'orientation d'un objet.

A la fin de l'article, test vidéo sur l'exemple des algorithmes ORB et SIFT.

Définition de find_object_2d


L'installation de ce package est assez simple. Voici la commande pour l'installer sur Ubuntu 16.04 et ROS Kinetic:

$ sudo apt-get install ros-kinetic-find-object-2d 

Installer depuis la source


Basculez vers l'espace de travail ROS:

 $ cd ~/catkin_ws/src 

Copiez le code source dans le dossier src:

 $ git clone https://github.com/introlab/find-object.git src/find_object_2d 

Créez un espace de travail:

 $ catkin_make 

Exécution de nœuds find_object_2d à l'aide de webcams


Voici la procédure de démarrage des nœuds de détection pour une webcam. Si nous voulons détecter un objet à l'aide d'une webcam, nous devons d'abord installer le package usb_cam (voir l'article précédent).

1. Lancez roscore:

 $ roscore 

2.1 Connectez la caméra USB à l'ordinateur et exécutez le pilote usb_cam ROS:

 $ roslaunch usb_cam usb_cam-test.launch 

Cela lancera le pilote ROS pour les webcams USB, et vous pouvez voir les rubriques de ce pilote à l'aide de la commande rostopic list. La liste des rubriques du pilote est affichée ici:


Sujets publiés à partir du pilote de l'appareil photo

2.2 Une autre façon de diffuser la vidéo de la caméra via uvc_camera:

 $ rosrun uvc_camera uvc_camera_node 

3. Dans la liste des sujets, nous allons utiliser le thème de l'image brute de la caméra, qui est publié dans le sujet / usb_cam / image_raw. Si vous obtenez cette rubrique, l'étape suivante consiste à lancer le nœud de découverte d'objets. La commande suivante démarre le nœud de découverte d'objets:

 $ rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw 

Cette commande ouvrira la fenêtre de détection d'objet dans laquelle nous voyons le canal de la caméra et les caractéristiques des objets.

4. Alors, comment pouvons-nous l'utiliser pour détecter un objet? Les procédures suivantes permettent d'effectuer une découverte de base à l'aide de cet outil:


Fenêtre de détection d'objet

5. Vous pouvez cliquer avec le bouton droit sur le panneau de gauche (Objets) de cette fenêtre et vous aurez la possibilité d'ajouter des objets de la scène. Si vous sélectionnez cette option, il vous sera demandé de marquer un objet de la scène actuelle, et une fois le marquage terminé, l'objet marqué commencera à être suivi à partir de la scène. La capture d'écran précédente montre la première étape dans laquelle une scène avec un objet est capturée.

6. Après avoir aligné l'objet vers la caméra, cliquez sur le bouton "Prendre une photo" pour cliquer sur l'objet:


Assistant Ajouter un objet pour capturer un objet

7. La fenêtre suivante sert à marquer un objet à partir de la liaison actuelle. La figure suivante le montre. Nous pouvons utiliser le curseur de la souris pour marquer un objet. Cliquez sur le bouton "Suivant" pour rogner l'objet, et vous pouvez passer à l'étape suivante:


Assistant Ajouter un objet pour étiqueter un objet

8. Après avoir rogné l'objet, il vous montrera le nombre total de descripteurs de fonction pour l'objet, et vous pouvez cliquer sur le bouton "Fin" pour ajouter un modèle d'objet à détecter. La figure suivante montre la dernière étape de l'ajout d'un modèle d'objet à cette application de détection:


Dernière étape de l'Assistant Ajout de fonctionnalités

9. Félicitations! Vous avez ajouté un objet à découvrir. Vous pouvez maintenant voir la détection montrée dans la photo suivante. Vous pouvez voir le cadre de délimitation autour de l'objet détecté:


Assistant de recherche d'objets lançant la découverte

10. Est-ce suffisant? Et la position de l'objet? Nous pouvons obtenir
position de l'objet à l'aide de la commande suivante:

 $ rosrun find_object_2d print_objects_detected 


Détails de la propriété

11. Vous pouvez également obtenir des informations complètes sur l'objet détecté
/ objet du sujet. Cette rubrique publie un tableau de multidiffusion composé de la largeur et de la hauteur de l'objet et de la matrice d'homographie pour calculer la position et l'orientation de l'objet ainsi que ses valeurs d'échelle et de décalage. Vous pouvez obtenir l'écho du sujet / objets comme ceci:


Valeurs de thème / objet

12. Nous pouvons calculer la nouvelle position et l'orientation à partir des équations suivantes:


L'équation pour calculer la position de l'objet

Ici H est l'homographie d'une matrice 3 × 3, (x1, y1) est la position de l'objet dans l'image stockée, et (x2, y2) est la position calculée de l'objet dans la trame courante.
Vous pouvez vérifier le code source du nœud print_objected_src pour obtenir une version en utilisant la matrice d'homographie.

Voici le code source de ce nœud.

Test de la vidéo du package find_object_2d en utilisant l'exemple des algorithmes ORB et SIFT



Résumé de l'algorithme: ORB est rapide, mais ne voit pas les objets distants et souvent ne détermine pas correctement la géométrie. SIFT voit les objets distants, détermine avec précision la géométrie, par contre nécessite de grandes ressources informatiques et est payé pour une utilisation commerciale.

Questions à résoudre par le robot EduMIP :

  1. Recevez de la caméra Logitech C920 sur BeagleBone Blue une vidéo déjà encodée et transférez-la sous cette forme sur un grand ordinateur en ROS.
  2. Connectez les capteurs de distance VL6180X, Vl53l0x et le pare-chocs pour créer une carte dans ROS. (Accessoires déjà commandés)
  3. Écrivez un algorithme dans ROS qui traitera les données de la carte et les objets détectés de la caméra et construira un itinéraire de mouvement basé sur eux.

S'il y a des passionnés de robotique comme moi qui sont prêts à rejoindre le projet, puis écrivez dans un e-mail personnel, j'ai besoin d'aide sur les problèmes ci-dessus.

Source: https://habr.com/ru/post/fr414991/


All Articles