À propos des implémentations de middleware ROS 2

Les implémentations de middleware ROS sont des ensembles de packages qui implémentent certaines des interfaces ROS internes, par ex. les API rmw, rcl et rosidl.

Packages communs pour les packages middleware DDS

Toutes les implémentations actuelles du middleware ROS sont basées sur des implémentations DDS complètes ou partielles. Par exemple, il existe une implémentation de middleware qui utilise Connext DDS de RTI et une implémentation qui utilise Fast DDS d’eProsima. Pour cette raison, il existe des packages partagés. parmi la plupart des implémentations de middleware basées sur DDS.

Dans le dépôt ros2/rosidl_dds sur GitHub, il y a le package suivant :

  • rosidl_generator_dds_idl : fournit des outils pour générer des fichiers DDS .idl à partir de fichiers rosidl, par ex. Fichiers .msg, fichiers .srv, etc.

Le |paquet| rosidl_generator_dds_idl génère un fichier DDS .idl pour chaque fichier rosidl, par ex. Fichier .msg, défini par packages contenant des messages. Actuellement, les implémentations de middleware ROS basées sur DDS utilisent les fichiers de sortie .idl de ce générateur pour générer un support de type précompilé spécifique au fournisseur.

Structure des implémentations du middleware ROS

Une implémentation de middleware ROS est généralement composée de quelques packages dans un référentiel unique :

  • <implementation_name>_cmake_module : contient le module CMake pour découvrir et exposer les dépendances requises

  • rmw_<implementation_name>_<language> : contient l’implémentation de l’API rmw | dans un langage particulier, typiquement C++

  • rosidl_typesupport_<implementation_name>_<language> : contient des outils pour générer du code de support de type statique pour les fichiers rosidl, adapté à l’implémentation dans un langage particulier, généralement C ou C++

Le <nom_de_l'implémentation>_cmake_module package contient tous les modules et fonctions CMake nécessaires pour trouver les dépendances de support pour l’implémentation du middleware. Par exemple, rti_connext_dds_cmake_module fournit une logique wrapper autour du module CMake livré avec RTI Connext DDS pour s’assurer que tous les packages qui en dépendent sélectionneront la même installation de RTI Connext DDS. De même, fastrtps_cmake_module inclut un module CMake pour trouver le Fast DDS d’eProsima et gurumdds_cmake_module inclut un module CMake pour trouver GurumNetworks GurumDDS. Toutes les implémentations n’auront pas un package comme celui-ci : par exemple, Cyclone DDS d’Eclipe fournit déjà un module CMake qui est utilisé directement par son implémentation RMW sans avoir besoin de wrappers supplémentaires.

Le rmw_<implementation_name>_<langue> package implémente le rmw C API dans une langue particulière. L’implémentation elle-même peut être C++, elle doit simplement exposer les symboles de l’en-tête en tant que extern "C" afin que les applications C puissent s’y connecter.

Le rosidl_typesupport_<implementation_name>_<langue> package fournit un générateur qui génère du code DDS dans un langage particulier. Ceci est fait en utilisant les fichiers .idl générés par le rosidl_generator_dds_idl package et le générateur de code DDS IDL fourni par le fournisseur DDS. Il génère également du code pour convertir les structures de message ROS vers et depuis les structures de message DDS. Ce générateur est également responsable de la création d’une bibliothèque partagée pour le package de messages dans lequel il est utilisé, qui est spécifique aux messages du package de messages et au fournisseur DDS utilisé.

Comme mentionné ci-dessus, le rosidl_typesupport_introspection_<langue> peut être utilisé à la place d’un package de support de type spécifique à un fournisseur si une implémentation rmw prend en charge l’interprétation des messages à l’exécution. Cette possibilité d’envoyer et de recevoir par programmation des types sur des sujets sans générer de code au préalable est obtenue en prenant en charge la norme DDS X-Types Dynamic Data. En tant que telles, les implémentations rmw peuvent fournir un support pour la norme X-Types et/ou fournir un package pour le support de type généré au moment de la compilation spécifique à leur implémentation DDS.

À titre d’exemple de référentiel d’implémentation rmw, l’implémentation du middleware ROS Eclipse Cyclone DDS se trouve sur GitHub à ros2/rmw_cyclonedds.

L’implémentation rmw pour Fast DDS est sur GitHub à ros2/rmw_fastrtps_cpp.

L’implémentation rmw pour Connext DDS est sur GitHub à ros2/rmw_connextdds.

L’implémentation rmw pour GurumDDS est sur GitHub à ros/rmw_gurumdds.

Pour en savoir plus sur ce qui est requis pour créer une nouvelle implémentation de middleware pour ROS, consultez cette page :

Avertissement

TODO : lien vers des documents et/ou un didacticiel plus détaillés sur la mise en œuvre du middleware.