ROS2
Qu’est-ce que ROS2 ?
Pour résumer ROS2 est une surcouche logicielle permettant de formaliser les échanges entre processeurs.
Des outils et des bibliothèques sont fournis afin de faciliter le développement d’applications robotiques.
L’utilisation de ROS2 dans notre application peut paraitre disproportionnée, on s’imposera néanmoins cette contrainte
afin d’étudier cette norme dans un contexte simple.
Les NODES sont des instances de programmes exécutées sur un même processeur ou des processeurs différents.
Ces NODES peuvent s’abonner à un TOPIC ( Subscribe ).
Lorsqu’un NODE envoie un message ( Publish ) à un TOPIC, tous les noeuds abonnés à ce topic reçoivent ce message.
Documentation :
https://docs.ros.org/en/humble/index.html
Robot Operating System, Olivier Stasse
Dans ce qui suit, la version humble de ROS2 a été utilisée.
Environnement ROS2
Variables d’Environnement
Il est nécessaire, afin d’utiliser ROS2, de mettre à jour des variables d’environnement, en exécutant la commande :
source /opt/ros/humble/setup.bash
printenv | grep -i ROS
ROS_VERSION=2
ROS_PYTHON_VERSION=3
AMENT_PREFIX_PATH=/opt/ros/humble
PYTHONPATH=/opt/ros/humble/lib/python3.10/site-packages:/opt/ros/humble/local/lib/python3.10/dist-packages:/home/kerhoas/Documents/PYTHON:/home/kerhoas/WORKSPACE_WEB2/ASSERV_MCC_LYNXMOTION_/MCC_PYSIM/PYSIMCODER/resources/blocks/rcpBlk
LD_LIBRARY_PATH=/opt/ros/humble/opt/rviz_ogre_vendor/lib:/opt/ros/humble/lib/x86_64-linux-gnu:/opt/ros/humble/lib
ROS_LOCALHOST_ONLY=0
ROS_DISTRO=humble
Il est conseillé d’inclure cette commande dans le fichier ~/.bashrc afin de l’exécuter automatiquement à chaque ouverture d’un terminal :
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
ROS_DOMAIN_ID
L’identifiant ROS_DOMAIN_ID permet d’identifier le réseau sur lequel communiquent différents noeuds.
Cet identifiant doit être le même pour tous les éléments devant s’échanger des messages.
Chaque Robot a un numéro devant correspondre à ROS_DOMAIN_ID.
echo $ROS_DOMAIN_ID # affichage
export ROS_DOMAIN_ID=5 # modification --> NUMERO INDIQUE SUR LE ROBOT
Pour mettre à jour la variable d’environnement ROS_DOMAIN_ID pour chaque ouverture du terminal, on peut enrgistrer la commande suiante dans le fichier ~/.bashrc :
export ROS_DOMAIN_ID=5 # modification
PC HOST ENIB : Environnement PYTHON
La cohabitation de plusieurs versions de python peut entrainer une série de warnings voire d’erreurs.
conda permet de gérer des environnements de développement, et les packages associés.
A faire une fois seulement :
$ conda init bash
Ouvrir à nouveau un terminal :
$ which python
/usr/bin/python
$ conda activate E021_3_6
$ which python
/home/TP/tools/miniconda3/envs/E021_3_6/bin/python
$ which pip
/home/TP/tools/miniconda3/envs/E021_3_6/bin/pip
$ pip install colcon-common-extensions
$ which colcon
/home/TP/tools/miniconda3/envs/E021_3_6/bin/colcon
Pour désactiver conda :
$ conda deactivate
Pour utiliser systématiquement cette configuration pour tout nouveau shell, la commande conda activate E021_3_6 peut être ajoutée au fichier ~/.bashrc ( à enlever pour les autres enseignements )
REMARQUE : Le répertoire de téléchargement des paquets peut devenir volumineux, si nécessaire exécuter :
rm -rf ~/.conda/pkgs ~/.cache/pip
Fichier .bashrc
Au final, pour que toutes les variables soient définies à l’ouverture d’un terminal :
nano ~/.bashrc
...
conda activate E021_3_6
source /opt/ros/humble/setup.bash
export ROS_DOMAIN_ID=5 # modification --> N° de Robot
Commandes de Base
Terminal 1 :
On publie un message toutes les secondes dans un topic ‘boite’.
Les messages sont de type std_msgs/msg/String.
ros2 topic pub --rate 1 /boite std_msgs/msg/String "data: Hello !"
REMARQUE : laisser un espace entre datat: et Hello !.
Pour envoyer un seul message :
ros2 topic pub --once /boite std_msgs/msg/String "data: Hello !"
Terminal 2 :
On écoute les messages arrivant dans boite :
ros2 node list
ros2 topic list
ros2 topic echo /boite
Types de Messages
Transmission d’un Entier Int32
ros2 topic pub /boite std_msgs/msg/Int32 '{data: 1}'
Transmission d’un Tableau d’entiers UInt8
ros2 topic pub /boite std_msgs/msg/UInt8MultiArray "{data: [1, 2, 3]}"