Chariot à chariots ROS, partie 2. Logiciel

Messages dans la série:
8. Nous contrôlons à partir du téléphone-ROS Control, GPS-node
7. Localisation du robot: gmapping, AMCL, points de référence sur le plan de la salle
6. Odométrie avec encodeurs de roue, plan de salle, lidar
5. Nous travaillons en rviz et gazebo: xacro, nouveaux capteurs.
4. Créez une simulation de robot à l'aide des éditeurs rviz et gazebo.
3. Accélérez, changez la caméra, corrigez la démarche
2. Logiciel
1. Fer

Passer au sourire


Après avoir récupéré le «burger» selon le schéma du dernier post , nous allons passer au contenu du programme.

Puisque nous collectons pour un projet déjà terminé, il est logique de donner les instructions qui y sont indiquées. Ils sont .

Tout est très pratique et au même endroit, vous pouvez télécharger une image prête à l'emploi à partir de Raspbian Stretch + ROS + OpenCV, l'écrire sur une carte SD pour la framboise. (ROS Kinetic, OpenCV 3.4.1. Oui, il y en a un plus récent, mais parfois il vaut mieux prendre et partir que de tout collecter à la source).

Néanmoins, malgré la commodité, j'ai quand même dû légèrement corriger l'image. Puisqu'il s'est avéré quelques détails inconfortables de l'image originale:

  • pas d'interface graphique (interface graphique). Ce n'est pas critique, en particulier pour ROS, mais pour rouler sur une ligne, vous devez calibrer la caméra sur la framboise elle-même et voir comment elle (la caméra) transmet les couleurs (plus d'informations ci-dessous);
  • L'assemblage OpenCV n'affiche pas l'image à l'écran, même si vous installez l'interface graphique vous-même. De toute évidence, dans le projet rosbots, opencv a été construit sans cette option.
  • pas de petites béquilles (VNC, éditeur de texte pour notes, mc).
  • Par conséquent, OpenCV a été reconstruit avec la prise en charge de la sortie d'image dans l'interface graphique (compilée par openCV 3.4.3), une interface graphique a été installée, de petites béquilles.

L'image finie est ici , et d'autres travaux seront construits sur cette base.

Configurer le réseau (wi-fi) et ROS-master sur Raspberry Pi

.
Je recommande fortement aux expériences d'utiliser un routeur séparé avec votre wi-fi. Vous pouvez simplement créer un point d'accès sur votre téléphone à ces fins. Cela est dû au fait que beaucoup de paquets survoleront le wi-fi et, de préférence, ils ne couleront pas dans le trafic général.

Après avoir téléchargé l'image sur la carte SD Raspberry, configurez le réseau. Les paramètres réseau initiaux sont les suivants:

interface wlan0 static ip_address=192.168.43.174/24 static routers=192.168.43.1 static domain_name_servers=192.168.43.1 

Contenu dans /etc/dhcpcd.conf

Par conséquent, vous ne pouvez pas connecter les tuyaux à la framboise pour tout changer, mais créez simplement un point d'accès avec le nom du pathos boss et le mot de passe 1234554321. L'adresse de la framboise sera 192.168.43.174. En plus de ssh, vous pouvez également accéder à cette adresse via VNC: login - pi, mot de passe - 123qweasdzxcV.

Configurons le maître ROS

Une petite remarque pour ceux qui n'ont pas rencontré de ROS (système d'exploitation robotique). Un maître ROS est un intermédiaire par lequel différents nœuds communiquent dans ros (nœuds, services, etc.) Si le maître ros ne fonctionne pas ou s'exécute à la mauvaise adresse, les nœuds ne se verront pas.

Dans notre système ROS, l'assistant démarre automatiquement avec le chargement du système d'exploitation et tout ce qui nous est demandé est de spécifier l'adresse IP de l'assistant ROS dans le fichier système correspondant.

Si vous n'avez pas modifié les paramètres réseau répertoriés ci-dessus, vous n'avez rien à configurer.

Sinon, modifiez bashrc:

 nano ~/.bashrc 

À la toute fin du fichier, corrigez les adresses IP (les deux) pour votre cas:

 export ROS_MASTER_URI=http://192.168.43.174:11311 export ROS_HOSTNAME=192.168.43.174 

Redémarrez.

Maintenant, lors du démarrage du terminal sur le chariot, la sortie sera comme ceci (ou tout ce que vous avez spécifié dans les paramètres):

 For all slaves, "export ROS_MASTER_URI=http://192.168.43.174:11311" 

Cela signifie que le maître ROS fonctionne à l'adresse IP spécifiée.

Nous contrôlons le chariot sur wi-fi


Nous allons vérifier dès le début que les nœuds fonctionnent pour nous.

Dans le terminal:

 rosnode list 

La sortie sera comme ceci:

/ rosout
/ uno_serial_node

Si rien ne sort, vérifiez si vous avez enregistré ROS-master dans les paramètres décrits ci-dessus, si vous avez connecté le tuyau USB à Arduino, redémarré.

Après vérification, exécutez le 1er nœud responsable du mouvement:

 rosrun rosbots_driver part2_cmr.py 

* La commande spéciale ros lance le fichier part2_cmr.py du paquet python rosbots_driver

Le système informera que le nœud est en cours d'exécution:



Ici, vous pouvez voir que le rayon des roues et la distance entre elles sont déterminés. Vous pouvez corriger ces valeurs, ainsi que d'autres liées au mouvement dans le fichier robot.py le long du chemin

 /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/examples/coursera_control_of_mobile_robots/part2/full/controller 

puisque part2_cmr.py lui-même n'a pas ces paramètres. Ouvrez le deuxième terminal et entrez dans la liste rostopique:



Ici, vous pouvez voir que le sujet / part2_cmr / cmd_vel est apparu. Dans cette rubrique, / part2_cmr «écoute» ce que les autres nœuds lui diront et, en fonction de ce qu'ils disent, contrôlera le mouvement. Ce qui "écoute" exactement, mais pas "parle" peut être compris à l'aide de la commande.

 rostopic info /part2_cmr/cmd_vel 



Ici, vous pouvez voir que / part2_cmr abonné (abonné) au sujet et écoute.

* Vous pouvez «dire» quelque chose sur le sujet vous-même, sans nœuds.

Par exemple:

 rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 1.0}' 

tourner en avant avec la roue gauche

 rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: 0.0}' 

arrêter la roue gauche

 rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -1.0}' 

Tournez dos à dos avec une roue

 rostopic pub -1 /wheel_power_left std_msgs/Float32 '{data: -0.5}' 

Faites demi-tour avec la roue gauche plus lentement.

La syntaxe est: pub rostopique - désir de parler dans le sujet, -1 - désir ponctuel, / wheel_power_left - sujet où nous disons, std_msgs / Float32 - langue (format de message), '{data: -0.5}' - ce que nous disons.

Exécutez maintenant celui qui parlera dans le sujet / part2_cmr / cmd_vel. Ce sera le nœud d'envoi des commandes clavier.

Sans fermer le terminal précédent avec un nœud fonctionnel, exécutez-en un autre et entrez:

 rosrun teleop_twist_keyboard teleop_twist_keyboard.py /cmd_vel:=/part2_cmr/cmd_vel 

* Puisque la publication est par défaut dans le sujet / cmd_vel, nous la redirige en utilisant
/ cmd_vel: = / part2_cmr / cmd_vel afin que les messages soient versés dans / part2_cmr / cmd_vel.

Le nœud de contrôle a démarré et vous pouvez rouler en appuyant sur les touches du clavier:



S'il est impossible de conduire ou s'il y a un grincement subtil sous les roues, vous devez augmenter la vitesse en cliquant sur «w» dans le terminal avec le nœud en marche. La même chose (augmentation ou diminution) peut être effectuée avec la vitesse de rotation - le bouton «e». Il est également important d'être dans un terminal avec un nœud en cours d'exécution si les boutons de commande ne fonctionnent pas si vous passez à un autre terminal. Le bouton «k» du terminal de commande est un arrêt.

Dans un terminal séparé, regardez le sujet / part2_cmr / cmd_vel:



Maintenant, dans le sujet / part2_cmr / cmd_vel, il y a à la fois un locuteur et un auditeur.

Surfer sur OpenCV


Avant d'aller quelque part, vous devez vous assurer que le robot voyage avec le contrôle du clavier. Une remarque importante s'impose ici. Lors du contrôle à partir du clavier dans l'exemple ci-dessus, tourner vers la gauche doit correspondre à une pression sur la touche j, vers la droite l (latin l), vers l'avant i, vers l'arrière, (virgule). Si dans votre cas, ce n'est pas le cas, il peut y avoir des problèmes avec le voyage. Pour tout ramener à la normale, il est nécessaire de changer les paires de fils venant du conducteur du moteur aux jambes sur arduino dans notre burger 4,5,6,7 arduino: 4,5 à échanger avec 6,7 ou 4 et 5,6 et 7 chacune avec un autre selon l'endroit où les roues tourneront. Vous pouvez également le faire par programme en ajustant le code pour arduino le long du chemin - /home/pi/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver/src/main.cpp

 #define M_LEFT_PWM 6 #define M_LEFT_FR 7 #define M_RIGHT_PWM 5 #define M_RIGHT_FR 4 

et le recharger sur arduino avec la commande:

 upload_firmware ~/gitspace/rosbots_driver/platformio/rosbots_firmware/examples/motor_driver 

Travaillons avec des fleurs

Notre expérience de jardinage sera de mettre en évidence la ligne au sol que le robot parcourra, pour déterminer sa couleur. Par défaut, le robot ne le voit pas. En ligne, vous pouvez utiliser du ruban adhésif (jaune) ou du ruban adhésif, ou quelque chose d'autre avec une couleur caractéristique et assez large. * Il est peu probable que le ruban adhésif transparent fonctionne, car il sera difficile de distinguer de l'arrière-plan.

Allons dans le dossier et exécutons le script:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python bgr-to-hsv.py 

* Attention! Si vous utilisez l'image originale des rosbots, et pas la mienne, ce programme n'est pas là.

Deux fenêtres s'ouvriront:



Voici les gammes de couleurs en HSV. Qu'est-ce que HSV et pourquoi pas RVB?

h1, s1, v1 - inférieur et h2, s2, v2 - respectivement, la plage supérieure.

Maintenant, vous devez sélectionner une ligne avec du ruban électrique (peut-être pas du ruban adhésif mais du ruban adhésif) sur le sol en déplaçant les curseurs dans la fenêtre. Seule la ligne de ruban électrique doit rester dans la fenêtre de résultat:



La ligne de ruban électrique est exceptionnellement blanche, tout le reste est noir. Ce résultat est nécessaire.
Enregistrez, rappelez-vous les numéros des gammes HSV. Mon cas est 56.155,40 et 136.255.255. Les gammes HSV seront différentes dans différentes conditions d'éclairage à proximité de la caméra du robot.

Fermez les fenêtres en entrant ctrl + c dans le terminal et ajoutez les plages HSV au fichier follow_line_step_hsv.py:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver nano follow_line_step_hsv.py 

Dans les lignes:

 lower_yellow = np.array([21,80,160]) upper_yellow = np.array([255,255,255]) 

Nous mettons les numéros de nos gammes HSV.

Il est temps de faire la queue

Nous démarrons le nœud moteur dans la borne 1:

 rosrun rosbots_driver part2_cmr.py 

Lancez le nœud de la caméra dans le deuxième terminal:

 sudo modprobe bcm2835-v4l2 roslaunch usb_cam usb_cam-test.launch 

Exécutez le nœud opencv dans le troisième terminal:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_line_step_hsv.py 

Si tout s'est bien passé, le robot suivra la ligne et une fenêtre supplémentaire apparaîtra:



Dans cette fenêtre, le ruban électrique sera marqué d'un cercle rouge.

La signification générale du code est de mettre en surbrillance le segment de couleur à une certaine distance de la caméra, de dessiner un cercle rouge et d'aller à ce cercle, en essayant de le garder au centre.

Enfin, sur l'important - sur les chats et les sourires


Puisque notre objectif est d'aller chez le chat ou chez une personne souriante, nous devrons utiliser quelque chose de plus compliqué dans notre code. Nous aurons également besoin de chats et de personnes souriantes. La seconde est désormais plus difficile: peu de gens sourient en cette période difficile et alarmante. Commençons donc avec les chats.

Pour les expériences, des photos de chats au visage conviennent.

Exécutez le nœud de la caméra dans le 1er terminal:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python pi_camera_driver.py 

Dans le 2ème terminal, le nœud moteur:

 rosrun rosbots_driver part2_cmr.py 

Dans le 3ème terminal du nœud de recherche de chat:

 cd /home/pi/rosbots_catkin_ws/src/rosbots_driver/scripts/rosbots_driver python follow_cat2.py 

Le chariot se déplacera progressivement vers le chat:



Maintenant, vous avez besoin d'un bénévole qui sait sourire. Faites le portrait d'une personnalité publique peu connue dans un petit pays.

Dans le 3ème terminal du nœud de recherche du chat, vous pouvez fermer - ctrl + c et au lieu de cela commencer à rechercher un sourire sur le visage d'une personne publique peu connue:

 python follow_smile.py 

La charrette devra conduire lentement, incrédule au sourire d'une personne méconnue:



Comme beaucoup l'ont peut-être déjà deviné, les scripts que nous avons exécutés utilisent des cascades Haar. Selon le même principe que pour un trajet le long de la ligne, un carré de la zone souhaitée est mis en évidence et le programme essaie de le garder au centre en déplaçant le robot.

Malheureusement, les performances sur la framboise 3b laissent beaucoup à désirer, malgré les paramètres de la caméra de 320x240 et 15 Fps. Les retards sont perceptibles avec l'augmentation du temps. Tous les chats ne peuvent pas le supporter.

Comment cela peut-il être amélioré?

Essayez de reconstruire un opencv optimisé, comme le recommande Adrian (https://www.pyimagesearch.com/2017/10/09/optimizing-opencv-on-the-raspberry-pi/)? Utiliser des ressources PC externes pour le traitement d'images? Essayez de ne pas compresser les images en jpeg qui volent vers le gestionnaire Haar? Et un autre gros inconvénient - les chats doivent être grands et devant. Distance de 15 cm sur feuille A4. En s'éloignant de la caméra, le chat est déjà méconnaissable et invulnérable. Mettre un monocle de framboise sur la caméra avec un grossissement 8x?

PS: Si vous mettez la main sur des expériences avec l'image qui est donnée dans l'article, vous pouvez toujours rouler pour différentes parties du corps, en lançant en conséquence à la place du nœud de chat:

 python follow_fullbody.py python follow_upperbody.py python follow_lowerbody.py 

visage ou œil:

 python follow_face.py python follow_right_eye.py 

Si vous souhaitez savoir comment vous éloigner en douceur pour que le robot ne renverse pas de thé et comment ne pas le faire fonctionner avec la framboise, écrivez.

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


All Articles