Utilisation pratique de ROS sur le Raspberry Pi - Partie 3

Bonjour, chers lecteurs de Habr!

Je continue une série d'articles sur l'utilisation pratique de ROS sur le Raspberry Pi ( premier article , deuxième article ).
Dans cet article, nous utiliserons le package teleop_twist_keyboard de la pile ros-teleop pour contrôler le robot en appuyant sur les touches du clavier. La pile ros-teleop comprend, en plus de ce package, plusieurs packages supplémentaires pour diverses méthodes de contrôle, par exemple à l'aide du joystick. Qui est prêt à commencer à étudier teleop_twist_keyboard, s'il vous plaît, sous cat.

Multiterminal avec tmux


En attendant, je veux vous parler d'une astuce qui vous permet de travailler à distance sur le Raspberry Pi via SSH en même temps sur plusieurs terminaux. Pour ce faire, installez l'utilitaire tmux sur RPi.

$ sudo apt-get install tmux

Après cela, exécutez l'utilitaire:

$ tmux

Une barre verte devrait apparaître au bas de la fenêtre du terminal avec le numéro de fenêtre 0. 0.
tmux est un gestionnaire de fenêtres de terminal très pratique qui vous permet de créer un nombre quelconque de fenêtres dans une fenêtre de terminal en les plaçant de différentes manières (fenêtre de terminal séparée (fenêtre), panneau de fenêtre ( volet)) et il est commode de basculer entre eux.

Appuyez sur Ctrl + B et C. sur le clavier. Une autre fenêtre devrait apparaître avec le numéro 1. Essayez également la combinaison de Ctrl + B et%. La fenêtre de terminal actuelle sera divisée au milieu par une bande verte verticale en deux fenêtres (volet). Si vous appuyez sur la combinaison Ctrl + B,: et entrez "fenêtre divisée", la fenêtre sera divisée horizontalement en deux fenêtres identiques. Pour supprimer un panneau (volet), utilisez la combinaison Ctrl + B, X, puis appuyez sur Y. Pour basculer vers un autre panneau dans la même fenêtre, utilisez la combinaison Ctrl + B, O. Pour basculer entre les fenêtres de terminal par le numéro de fenêtre, utilisez la combinaison Ctrl + B, <numéro de fenêtre>.

Ajoutez maintenant le lancement du programme au fichier ~ / .bashrc pour démarrer automatiquement lorsque vous ouvrez un nouveau terminal. Ajoutez les lignes suivantes au fichier:

[[ $TERM != "screen" ]] && exec tmux


Travailler avec teleop_twist_keyboard


Maintenant, familiarisons-nous avec le package teleop_twist_keyboard.
Exécutez le script teleop_twist_keyboard.py à partir du package teleop_twist_keyboard en tant que nœud ROS normal:

$ roscore
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py

Nous obtenons une conclusion comme celle-ci:

Reading from the keyboard  and Publishing to Twist!
---------------------------
Moving around:
   u    i    o
   j    k    l
   m    ,    .

q/z : increase/decrease max speeds by 10%
w/x : increase/decrease only linear speed by 10%
e/c : increase/decrease only angular speed by 10%
anything else : stop

CTRL-C to quit

Énumérons tous les sujets actuellement actifs:

$ rostopic list

Le sujet / cmd_vel doit apparaître dans la liste. Sur ce sujet, le nœud teleop_twist_keyboard publie des messages chaque fois qu'une touche est appuyée sur le clavier.
Montrons la sortie des messages publiés dans la rubrique / cmd_vel:

$ rostopic echo cmd_vel

Exécutez rqt_graph pour représenter le graphique calculé ROS sous forme graphique. Le diagramme de graphe de calcul montre tous les nœuds actifs et les sujets qui les connectent.

$ rosrun rqt_graph rqt_graph

image

Nous voyons ici que le nœud teleop_twist_keyboard publie des messages dans le sujet / cmd_vel, et le nœud rostopique souscrit à ce sujet (commande d'écho rostopique).
Voyons quel type de messages sont publiés sur le sujet / cmd_vel:

$ rostopic type /cmd_vel

La commande affichera la ligne:

geometry_msgs/Twist

Cela signifie que les messages sont de type Twist du package ROS standard geometry_msgs.
Nous pouvons également obtenir des informations sur la structure du message avec la commande rosmsg:

$ rosmsg show geometry_msgs/Twist


geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

Le champ «linéaire» est responsable de la vitesse linéaire, «angulaire» est de la vitesse angulaire.
Appuyez sur la touche «i», la sortie sera comme ceci (associée à aller de l'avant):

linear: 
  x: 0.5
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

Appuyez sur la touche 'k', la sortie sera comme ceci (arrêt):

linear: 
  x: 0.0
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 0.0
---

Appuyez sur la touche 'u', la sortie sera comme ceci (tournez à gauche):

linear: 
  x: 0.5
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: 1.0
---

Et enfin, lorsque vous appuyez sur la touche «o», nous obtenons la sortie suivante (tournez à droite):

linear: 
  x: 0.5
  y: 0.0
  z: 0.0
angular: 
  x: 0.0
  y: 0.0
  z: -1.0
---

Les touches 'j' et 'l' sont responsables de tourner à gauche et à droite en place (sans avancer).

Contrôle du robot clavier avec teleop_twist_keyboard


J'ai déjà écrit le croquis rossérien pour contrôler le robot en appuyant sur les touches. Nous souscrivons simplement au sujet / cmd_vel et, en fonction de la valeur reçue de chacune des vitesses, donnons la commande nécessaire au contrôleur de mouvement (avancer, arrêter, tourner à gauche ou à droite). Le croquis peut être téléchargé ici .
Analysons le code d'esquisse plus en détail.
Au début du fichier, en plus du fichier d'en-tête ros.h standard, nous connectons deux fichiers supplémentaires avec les types de message geometry_msgs / Twist.h et geometry_msgs / Vector3.h:

#include <geometry_msgs/Twist.h>
#include <geometry_msgs/Vector3.h>

Nous déclarons un gestionnaire de nœuds ros :: NodeHandle:

ros::NodeHandle nh;

La valeur principale est la méthode messageCb:

void messageCb(const geometry_msgs::Twist& message) 
{
  geometry_msgs::Vector3 linear = message.linear;
  float forward_vel = float(linear.x);
  
  if(forward_vel == 0) { stop(); return; }
  
  geometry_msgs::Vector3 angular = message.angular;
  float ang_vel = float(angular.z);
  
  if(ang_vel > 0) { turnLeft(); }
  else if(ang_vel < 0) { turnRight(); }
  else { goForward(); }
}

Dans cette méthode, nous traitons le message reçu de la rubrique cmd_vel. Dans la variable forward_vel, nous conservons la vitesse linéaire, dans la variable angulaire - angulaire. La vitesse linéaire nous permet de suivre la commande d'arrêt (valeur 0). La vitesse angulaire détermine le sens de rotation (si supérieure à 0, tourner à gauche, inférieure à 0 - droite, si 0 - avancer).
Créez un abonné pour le sujet / cmd_vel:

ros::Subscriber<geometry_msgs::Twist> sub("/cmd_vel", &messageCb);

avec une référence à la méthode de traitement des messages (messageCb) et au type de message reçu - geometry_msgs :: Twist.
À la fin du script, les méthodes d'esquisse standard pour rosserial_arduino sont les suivantes:

nh.initNode();
nh.subscribe(sub);
Serial.begin(57600);

Exécutez le serveur rosserial_arduino:

$ rosrun rosserial_python serial_node _port:=/dev/ttyACM0

et téléchargez l'esquisse sur la carte Arduino.

Basculez vers le terminal où s'exécute le nœud teleop_twist_keyboard, essayez d'appuyer sur les touches «u», «i», «o» et «k» et vérifiez la sortie du serveur rosserial dans le terminal.

Ainsi, en utilisant le package teleop_twist_keyboard, nous pouvons désormais effectuer une télécommande simple du robot en transmettant des commandes de mouvement: avancer, arrêter, tourner à gauche ou à droite. À l'avenir, nous apprendrons à contrôler le robot à l'aide du joystick, ce qui est beaucoup plus pratique en utilisant un autre package dans ROS. Mais plus à ce sujet dans le prochain article.

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


All Articles