Travailler avec plusieurs implémentations de middleware ROS 2

Cette page explique l’implémentation RMW par défaut et comment spécifier une alternative.

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

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.

RTI Connext sur OSX : Échec dû à des paramètres de noyau de mémoire partagée insuffisants

Si vous recevez un message d’erreur similaire à celui ci-dessous lors de l’exécution de RTI Connext sur OSX :

[D0062|ENABLE]DDS_DomainParticipantPresentation_reserve_participant_index_entryports:!enable reserve participant index
[D0062|ENABLE]DDS_DomainParticipant_reserve_participant_index_entryports:Unusable shared memory transport. For a more in-   depth explanation of the possible problem and solution, please visit https://community.rti.com/kb/osx510.

Cette erreur est causée par un nombre ou une taille insuffisants de segments de mémoire partagée autorisés par le système d’exploitation. Par conséquent, le DomainParticipant est incapable d’allouer suffisamment de ressources et de calculer son index de participant, ce qui provoque l’erreur.

Vous pouvez augmenter les ressources de mémoire partagée de votre machine de manière temporaire ou permanente.

Pour augmenter temporairement les paramètres, vous pouvez exécuter les commandes suivantes en tant qu’utilisateur root :

/usr/sbin/sysctl -w kern.sysv.shmmax=419430400
/usr/sbin/sysctl -w kern.sysv.shmmin=1
/usr/sbin/sysctl -w kern.sysv.shmmni=128
/usr/sbin/sysctl -w kern.sysv.shmseg=1024
/usr/sbin/sysctl -w kern.sysv.shmall=262144

Pour augmenter les paramètres de façon permanente, vous devrez éditer ou créer le fichier /etc/sysctl.conf. La création ou la modification de ce fichier nécessitera des autorisations root. Ajoutez à votre fichier etc/sysctl.conf existant ou créez /etc/sysctl.conf avec les lignes suivantes :

kern.sysv.shmmax=419430400
kern.sysv.shmmin=1
kern.sysv.shmmni=128
kern.sysv.shmseg=1024
kern.sysv.shmall=262144

Vous devrez redémarrer la machine après avoir modifié ce fichier pour que les modifications prennent effet.

Cette solution est éditée depuis le forum de la communauté RTI Connext. Voir le message d’origine pour une explication plus détaillée.