Utilisation d'un œil de poisson sur un Raspberry Pi 3 avec ROS - Partie 2

Bonjour chers lecteurs de Habr! Ceci est la deuxième partie de l'histoire de l'utilisation de la caméra fish-eye sur le Raspberry Pi 3. La première partie peut être trouvée ici . Dans cet article, je parlerai de l'étalonnage d'une caméra fish eye et de l'utilisation de la caméra pour détecter des objets à l'aide du package find_object_2d. Peu importe, s'il vous plaît, sous le chat.

Calibrer une caméra fish eye à l'aide de camera_calibration


Ici, je décris la procédure d'étalonnage basée sur le manuel officiel sur le portail ros.org.

Pour effectuer l'étalonnage, nous avons besoin du package d'étalonnage de la caméra. Nous pouvons l'installer avec apt:

sudo apt-get install ros-kinetic-camera-calibration 

Nous aurons besoin d'un modèle de damier. Téléchargez le modèle du manuel officiel sur ros.org et imprimez-le. Pour plus de commodité, je l'ai collé sur une planche de contreplaqué:

image

Lançons le programme d'étalonnage:

 rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam 

Nous aurons une photo:

image

Déplacez un peu le modèle et attendez que le modèle soit sélectionné dans le cadre (les lignes colorées avec des points n'apparaîtront pas sur le modèle).

image

image

Déplacez un peu plus le gabarit sur le côté. Pour réussir l'étalonnage, nous devons effectuer une série de mouvements du modèle devant la caméra d'un côté à l'autre afin que le modèle tombe dans toutes les positions angulaires dans le champ de vision de la caméra (gauche, droite, haut et bas). À droite de la fenêtre d'image de la caméra dans la fenêtre du programme se trouve le panneau d'enregistrement avec trois barres de progression:

  • X capture le mouvement du motif dans le sens gauche / droite (horizontal) dans le champ de vision de la caméra
  • Y capture le mouvement du motif dans le sens haut / bas (horizontal) dans le champ de vision de la caméra
  • La taille capture l'approche / retrait du modèle de la caméra et l'inclinaison par rapport à la caméra.
  • Skew fixe la pente du gabarit à gauche, à droite, de haut en bas (biseau).

Ainsi, pour un étalonnage réussi, il est important que le modèle apparaisse dans différents coins du cadre, occupe tout le cadre et soit également incliné vers la gauche, la droite, le haut et le bas.

L'étalonnage d'une caméra fish eye sur votre Raspberry Pi peut prendre un certain temps, alors soyez patient. Ma procédure d'étalonnage a pris 20 minutes.

Une fois l'étalonnage terminé, le bouton Étalonner doit être activé (surligné en couleur):

image

Nous pouvons également voir les résultats de l'étalonnage dans le terminal:

image

Si vous êtes satisfait du résultat, appuyez sur le bouton COMMIT. La fenêtre du programme se fermera et vous verrez le message "écrire les données d'étalonnage dans ..." dans le terminal.

Vérifiez que le fichier spécifié a été créé:

 ll ~/.ros/camera_info/head_camera.yaml -rw-rw-r-- 1 vladimir vladimir 592 Apr 14 14:02 /home/vladimir/.ros/camera_info/head_camera.yaml 

L'étalonnage est terminé. Maintenant, les données d'étalonnage obtenues peuvent être utilisées dans la localisation visuelle et les algorithmes SLAM dans ROS.

Détection d'objets à l'aide de find_object_2d


L'installation du package est assez simple. Installez-le à partir du référentiel apt dans Ubuntu 16.04 pour ROS Kinetic:

 sudo apt-get install ros-kinetic-find-object-2d source /opt/ros/kinetic/setup.bash 

Exécutez ROS master et rqt_image_view:

 roscore roslaunch usb_cam usb_cam-test.launch 

À l'aide de la commande suivante, démarrez le nœud du détecteur:

 rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw 

La fenêtre du programme de détection s'ouvre:

image

Ici, nous verrons le flux de la caméra et le résultat de la détection des caractéristiques sur les objets.
Pour commencer, nous organiserons une formation sur les détecteurs dans nos installations. Placez le premier objet devant la caméra:

image

Cliquez avec le bouton droit sur le panneau gauche des objets dans la fenêtre et l'option Ajouter des objets de la scène s'ouvrira. Sélectionnez cette option et la fenêtre d'ajout d'un objet s'ouvrira:

image

Après avoir choisi la meilleure position pour l'objet, cliquez sur le bouton Prendre une photo pour prendre une photo de l'objet:

image

Nous devons sélectionner l'objet dans l'image. Utilisez le curseur de la souris pour sélectionner l'objet:

image

Cliquez sur le bouton Suivant pour découper l'objet dans l'image et passer à l'étape suivante. Après avoir recadré l'image, nous obtenons le nombre total de traits caractéristiques détectés sur l'objet. Il ne reste plus qu'à appuyer sur le bouton Fin pour ajouter l'objet à la base de données d'objets détecteurs formés. Nous voyons ici la dernière étape de la procédure d'ajout d'un objet:

image

En conséquence, nous avons formé le détecteur sur un objet. Vous pouvez maintenant essayer la détection de l'objet dans la scène:

image

Dessinons la position de l'objet détecté sur le terminal:

 rosrun find_object_2d print_objects_detected 

La sortie sera comme ceci:

 Object 1 detected, Qt corners at (259.387238,103.530960) (448.684052,79.495495) (282.419050,240.049667) (458.438938,199.656717) --- Object 1 detected, Qt corners at (255.340408,104.615120) (451.348079,75.302353) (284.672425,230.382223) (452.696585,197.625600) --- Object 1 detected, Qt corners at (253.440521,102.973320) (447.226440,76.793541) (278.530854,238.918013) (454.377219,197.526599) --- 

Énumérons les sujets:

 rostopic list 

Deux nouveaux sujets sont apparus dans la liste: / objects et / objectsStamped.

Nous affichons des informations sur les objets détectés:

 rostopic echo /objects 

 layout: dim: [] data_offset: 0 data: [1.0, 266.0, 177.0, 0.7527905702590942, 0.060980819165706635, 0.00022385441116057336, 0.3012462854385376, 0.8929792046546936, 0.0008534671505913138, 334.9065856933594, 182.55294799804688, 1.0] --- 

Ici, les deuxième et troisième valeurs (266.0, 177.0) représentent la largeur et la hauteur de l'objet. Toutes les autres valeurs du champ de données représentent une matrice d'homographie 3x3 (utilisée pour calculer la position et l'orientation de l'objet, ainsi que les valeurs d'échelle et de décalage).

Comme le montrent les observations, find_object_2d fait un mauvais travail de détection d'objets avec une texture faible ou sans texture (sans texture). De plus, le détecteur est inefficace lors de la détection d'un objet sous un grand angle par rapport à l'objet (si l'on observe l'objet de côté), ou à une grande distance de l'objet.

image

Après avoir terminé le travail avec le détecteur, find_object_2d nous proposera de sauvegarder les objets ajoutés sur le disque.

C'est tout pour l'instant. Bonne chance à tous et à bientôt!

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


All Articles