Travailler avec plusieurs implémentations de middleware ROS 2
Table des matières
Cette page explique l’implémentation RMW par défaut et comment spécifier une alternative.
Conditions préalables
Vous devriez déjà avoir lu la page d’implémentation des middlewares DDS et ROS.
Spécification des implémentations RMW
Pour avoir plusieurs implémentations RMW disponibles, vous devez avoir installé les binaires ROS 2 et toutes les dépendances supplémentaires pour des implémentations RMW spécifiques, ou construit ROS 2 à partir de la source avec plusieurs implémentations RMW dans l’espace de travail (les implémentations RMW sont incluses dans la construction par défaut si leurs dépendances au moment de la compilation sont satisfaites). Voir Installer les implémentations DDS.
Les nœuds C++ et Python prennent en charge une variable d’environnement RMW_IMPLEMENTATION
qui permet à l’utilisateur de sélectionner l’implémentation RMW à utiliser lors de l’exécution d’applications ROS 2.
L’utilisateur peut définir cette variable sur un identifiant d’implémentation spécifique, tel que rmw_cyclonedds_cpp
, rmw_fastrtps_cpp
, rmw_connextdds
ou rmw_gurumdds_cpp
.
Par exemple, pour exécuter la démo de talker à l’aide du talker C++ et de l’écouteur Python avec l’implémentation Connext RMW :
RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_cpp talker
# Run in another terminal
RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_py listener
RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_cpp talker
# Run in another terminal
RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_py listener
set RMW_IMPLEMENTATION=rmw_connextdds
ros2 run demo_nodes_cpp talker
REM run in another terminal
set RMW_IMPLEMENTATION=rmw_connextdds
ros2 run demo_nodes_py listener
Ajouter des implémentations RMW à votre espace de travail
Supposons que vous ayez construit votre espace de travail ROS 2 avec uniquement Fast DDS installé et donc uniquement l’implémentation Fast DDS RMW construite. La dernière fois que votre espace de travail a été construit, tout autre package d’implémentation RMW, rmw_connextdds
par exemple, était probablement incapable de trouver des installations des implémentations DDS pertinentes. Si vous installez ensuite une implémentation DDS supplémentaire, Connext par exemple, vous devrez relancer la vérification d’une installation Connext qui se produit lors de la construction de l’implémentation Connext RMW. Vous pouvez le faire en spécifiant le drapeau --cmake-force-configure
lors de la prochaine construction de votre espace de travail, et vous devriez voir que le package d’implémentation RMW est alors construit pour l’implémentation DDS nouvellement installée.
Il est possible de rencontrer un problème lors de la « reconstruction » de l’espace de travail avec une implémentation RMW supplémentaire à l’aide de l’option --cmake-force-configure
où la construction se plaint du changement de l’implémentation RMW par défaut. Pour résoudre ce problème, vous pouvez soit définir l’implémentation par défaut sur ce qui était avant avec l’argument RMW_IMPLEMENTATION
CMake ou vous pouvez supprimer le dossier de construction pour les packages qui se plaignent et continuer la construction avec --start-with <package nom>
.
Dépannage
Vérification de la RMW actuelle
Pour vérifier le RMW actuellement utilisé, il vous suffit de vérifier la variable d’environnement RMW_IMPLEMENTATION
. Sur les systèmes Linux, printenv
imprime la liste complète des variables d’environnement. D’autres systèmes d’exploitation auront d’autres procédures pour afficher les variables d’environnement. Si RMW_IMPLEMENTATION
n’est pas dans l’environnement, il est prudent de supposer que vous utilisez la valeur par défaut pour votre distribution ROS, sinon le RMW actuel est la valeur indiquée. Le RMW par défaut pour chaque distribution ROS se trouve dans REP-2000.
Garantir l’utilisation d’une implémentation RMW particulière
Si la variable d’environnement RMW_IMPLEMENTATION
est définie sur une implémentation RMW pour laquelle le support n’est pas installé, vous verrez un message d’erreur semblable au suivant si vous n’avez installé qu’une seule implémentation :
Expected RMW implementation identifier of 'rmw_connextdds' but instead found 'rmw_fastrtps_cpp', exiting with 102.
Si plusieurs implémentations RMW sont prises en charge et que vous demandez l’utilisation d’une qui n’est pas installée, vous verrez quelque chose de similaire à :
Error getting RMW implementation identifier / RMW implementation not installed (expected identifier of 'rmw_connextdds'), exiting with 1.
Si cela se produit, vérifiez que votre installation ROS 2 inclut la prise en charge de l’implémentation RMW que vous avez spécifiée dans la variable d’environnement RMW_IMPLEMENTATION
.
Si vous souhaitez basculer entre les implémentations RMW, vérifiez que le processus démon ROS 2 n’est pas en cours d’exécution avec l’implémentation RMW précédente pour éviter tout problème entre les nœuds et les outils de ligne de commande tels que ros2 node
. Par exemple, si vous exécutez :
RMW_IMPLEMENTATION=rmw_connextdds ros2 run demo_nodes_cpp talker
et
ros2 node list
il générera un démon avec une implémentation Fast DDS :
21318 22.0 0.6 535896 55044 pts/8 Sl 16:14 0:00 /usr/bin/python3 /opt/ros/rolling/bin/_ros2_daemon --rmw-implementation rmw_fastrtps_cpp --ros-domain-id 22
Même si vous exécutez à nouveau l’outil de ligne de commande avec l’implémentation RMW correcte, l’implémentation RMW du démon ne changera pas et les outils de ligne de commande ROS 2 échoueront.
Pour résoudre ce problème, arrêtez simplement le processus démon :
ros2 daemon stop
et réexécutez l’outil de ligne de commande ROS 2 avec l’implémentation RMW correcte.