Comment créer des bibliothèques avec ROS2 Python – ROS French Tutorial

10/02/2024

This tutorial is created by RA 023 Enzo

Rosbotics Ambassador Program https://www.theconstruct.ai/rosbotics-ambassador/)
Cours: ROS2 Baiscs in 5 Days Python: https://app.theconstructsim.com/courses/132

Introduction

Le but de ce tutoriel est d’apprendre à créer et utiliser des bibliothèques dans les packages ROS2 Python. Lors du développement d’un projet, il est essentiel de garder son code structuré pour assurer un développement efficace. L’utilisation de bibliothèque (ou library) custom est indispensable pour cela car cela permet de regrouper les codes sources en fonction de leurs usages et donc de séparer des fonctionnalités distinctes. La création de bibliothèques est donc essentielle pour rendre votre code plus structuré, modulaire et réutilisable. Nous allons donc voir ensemble comment déclarer et faire appel une custom library dans les packages ROS2 Python.
Pré-requis
Pour lancer et tester le code, vous devez lancer la simulation du turtlebot3 sur gazebo. Si vous voulez effectuer le tutoriel sur votre installation local, vous devez avoir ROS2 installé (https://docs.ros.org/en/humble/Installation.html), avoir configuré un workspace (https://docs.ros.org/en/humble/Tutorials/Beginner-Client-Libraries/Creating-A-Workspace/Creating-A-Workspace.html) et avoir installé le turtlebot3.

# pour installer tous les packages du turtlebot3
# remplacez humble par votre distro ROS2
sudo apt-get install ros-humble-turtlebot3*
# n'oubliez pas d'exporter le modèle de Turtlebot3 que vous souhaitez utiliser
export TURTLEBOT3_MODEL=waffle_pi

Si vous effectuez ce tutoriel en utilisant un Rosject vous pouvez directement enter les commandes suivantes dans le terminal:

# Declare le model de turtlebot3 à simuler
export TURTLEBOT3_MODEL=waffle_pi
# Lance la simulation du turtlebot dans gazebo
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py

Une fois la simulation du turtlebot3 lancée, celle-ci va publier sur le topic /odom que nous allons utiliser dans le code exemple.
Après avoir exécuté ces commandes, appuyez sur le bounton de l’interface gazebo et selectionnez Open Gazebo.


Vous devriez obtenir le résultat suivant.

Part 1: Créer un package qui va contenir le source code de la library

Nous allons commencer par créer le package python qui va servir de bibliothèque. Ouvrez un terminal et executez les commandes suivantes:

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python custom_library

Maintenant que le package est initialisé, nous allons créer le fichier qui va contenir le source code de la library. Pour faire cela, ouvrez un terminal et executez les commandes suivantes:

cd ~/ros2_ws/src/custom_library/custom_library
touch odom_toolbox.py

Affichez l’éditeur de code et ouvrez le fichier odom_toolbox.py. Ajouter ensuite le code suivant:

from geometry_msgs.msg import Point
class OdometryToolbox:
    def point_from_odom_offset_init(actual_odom, init_odom):
   
        point_with_offset = Point()
        point_with_offset.x = actual_odom.pose.pose.position.x - init_odom.pose.pose.position.x
        point_with_offset.y = actual_odom.pose.pose.position.y - init_odom.pose.pose.position.y
        point_with_offset.z = actual_odom.pose.pose.position.z - init_odom.pose.pose.position.z
        return point_with_offset

Ce code d’exemple déclare une class contenant une méthode permettant de soustraire terme à terme la position d’une odom avec une autre et de retourner le point obtenu.
Vous pouvez compiler le package pour tester que tout fonctionne.

cd ~/ros2_ws
colcon build
source install/setup.bash

Part 2: Créer un package qui va utiliser la library créée précédemment

Nous allons créer un package python qui va utiliser la bibliothèque créee dans la partie une. Ouvrez un terminal et executez les commandes suivantes:

cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python my_package

Une fois le package créer, nous allons créer un fichier main.py qui contiendra le node exemple.

cd ~/ros2_ws/src/my_package/my_package
touch main.py

Collez ensuite le code ci-dessous dans le fichier main.py.

# main.py
import rclpy
from rclpy.node import Node
from geometry_msgs.msg import Point
from nav_msgs.msg import Odometry
# importer la custom library
from custom_library.odom_toolbox import OdometryToolbox
class OdomToPointNode(Node):
    def __init__(self):
        super().__init__('odom_to_point_node')
        # Initialiser le subscriber sur le topic odom du turtlebot3
        self.odom_subscription = self.create_subscription(
            Odometry,
            'odom',
            self.odom_callback,
            10
        )
        self.odom_subscription
        # Initialiser le publisher du point
        self.point_publisher = self.create_publisher(Point, 'point_topic', 10)
       
        self.odom_init = Odometry()
        self.isOdomInit = False
       
    def odom_callback(self, msg):
       
        if self.isOdomInit == False:
            # Recuperer la valeur initial de la premiere odometry
            self.odom_init = msg
            self.isOdomInit = True
       
        point_msg = Point()
        # Utilser la method declaree dans la custom_library
        point_msg = OdometryToolbox.point_from_odom_offset_init(msg, self.odom_init)
        # Publier le point obtenu
        self.point_publisher.publish(point_msg)
        print(f'Point Published: {point_msg.x}, {point_msg.y}, {point_msg.z}')
def main(args=None):
    rclpy.init(args=args)
    odom_to_point_node = OdomToPointNode()
    rclpy.spin(odom_to_point_node)
    odom_to_point_node.destroy_node()
    rclpy.shutdown()
if __name__ == '__main__':
    main()

Pour pouvoir utiliser votre library custom dans votre package, vous devez mettre à jour le setup.py du package.

# setup.py
from setuptools import setup
package_name = 'my_package'
setup(
    name=package_name,
    version='0.0.0',
    packages=[package_name],
    data_files=[
        ('share/ament_index/resource_index/packages',
            ['resource/' + package_name]),
        ('share/' + package_name, ['package.xml']),
    ],
    install_requires=[
        'setuptools',
        # ajouter votre library dans les install_requires
        'custom_library'],
    zip_safe=True,
    maintainer='user',
    maintainer_email='user@todo.todo',
    description='TODO: Package description',
    license='TODO: License declaration',
    tests_require=['pytest'],
    entry_points={
        'console_scripts': [
            # Ajouter le node dans les console_scripts
            'odom_to_point_node = my_package.main:main',
        ],
    },
)

Une fois que les fichiers suivants ont été modifiés, vous pouvez build le package.

cd ~/ros2_ws
colcon build
source install/setup.bash

Step 3: Tester le node

Pour lancer le node, lancez la simulation comme indiqué dans les prérequis. Vous devez ensuite exécuter les commandes suivantes dans un terminal:

ros2 run my_package odom_to_point_node

Maintenant que le code est en cours d’exécution, vous devriez avoir un print des coordonnées du robot en ayant pour origine la position du robot au moment du lancement le node.

Merci d’avoir suivi ce poste.

Ressources

• ROS Ignite Academy
• ROS2 Full course for beginner
• Rosject utilisé pour le poste

Feedback

Cet article vous a plu ? Avez-vous des questions sur ce qui est expliqué ? Quoi qu’il en soit, n’hésitez pas à laisser un commentaire dans la section des commentaires ci-dessous, afin que nous puissions interagir et apprendre les uns des autres.

Si vous souhaitez en savoir plus sur d’autres sujets liés à ROS, faites-le nous savoir dans l’espace commentaires et nous ferons une vidéo ou un article à ce sujet.
Topics: ROS Q&A | ros2

Video Tutorial

Topics: python | ros2
Masterclass 2023 batch2 blog banner

Check Out These Related Posts

129. ros2ai

129. ros2ai

I would like to dedicate this episode to all the ROS Developers who believe that ChatGPT or...

read more

0 Comments

Submit a Comment

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Pin It on Pinterest

Share This