Utilisation des paramètres de qualité de service pour les réseaux avec perte

Arrière-plan

Veuillez lire la page de documentation à propos des paramètres QoS pour obtenir des informations générales sur la prise en charge disponible dans ROS 2.

Dans cette démo, nous allons générer un nœud qui publie une image de caméra et un autre qui s’abonne à l’image et l’affiche à l’écran. Nous simulerons ensuite une connexion réseau avec perte entre eux et montrerons comment différents paramètres de qualité de service gèrent le mauvais lien.

Conditions préalables

Ce didacticiel suppose que vous disposez d’une installation ROS 2 fonctionnelle et d’OpenCV. Voir la documentation OpenCV pour ses instructions d’installation. Vous aurez également besoin du package ROS image_tools.

sudo apt-get install ros-rolling-image-tools

Exécutez la démo

Avant d’exécuter la démo, assurez-vous d’avoir une webcam fonctionnelle connectée à votre ordinateur.

Une fois que vous avez installé ROS 2, sourcez votre fichier d’installation :

. <path to ROS 2 install space>/setup.bash

Exécutez ensuite :

ros2 run image_tools showimage

Rien ne se passera encore. showimage est un nœud abonné qui attend un éditeur sur le sujet image.

Remarque : vous devez fermer le processus showimage avec Ctrl-C plus tard. Vous ne pouvez pas simplement fermer la fenêtre.

Dans un terminal séparé, sourcez le fichier d’installation et exécutez le nœud de l’éditeur :

ros2 run image_tools cam2image

Cela publiera une image de votre webcam. Si vous n’avez pas d’appareil photo connecté à votre ordinateur, il existe une option de ligne de commande qui publie des images prédéfinies.

ros2 run image_tools cam2image --ros-args -p burger_mode:=True

Dans cette fenêtre, vous verrez la sortie du terminal :

Publishing image #1
Publishing image #2
Publishing image #3
...

Une fenêtre apparaîtra avec le titre « vue » montrant le flux de votre caméra. Dans la première fenêtre, vous verrez la sortie de l’abonné :

Received image #1
Received image #2
Received image #3
...

Note

Utilisateurs macOS : si ces exemples ne fonctionnent pas ou si vous recevez une erreur telle que ddsi_conn_write failed -1, vous devrez augmenter la taille des paquets UDP à l’échelle de votre système :

$ sudo sysctl -w net.inet.udp.recvspace=209715
$ sudo sysctl -w net.inet.udp.maxdgram=65500

Ces modifications ne persisteront pas après un redémarrage. Si vous souhaitez que les modifications persistent, ajoutez ces lignes à /etc/sysctl.conf (créez le fichier s’il n’existe pas déjà) :

net.inet.udp.recvspace=209715
net.inet.udp.maxdgram=65500

Options de ligne de commande

Dans l’un de vos terminaux, ajoutez un indicateur -h à la commande d’origine :

ros2 run image_tools showimage -h

Ajouter du trafic réseau

Avertissement

Cette section de la démo ne fonctionnera pas sur Connext DDS de RTI. Lors de l’exécution de plusieurs nœuds dans le même hôte, l’implémentation RTI Connext DDS utilise la mémoire partagée avec l’interface de bouclage. La dégradation du débit de l’interface de bouclage n’affectera pas la mémoire partagée, ainsi le trafic entre les deux nœuds ne sera pas affecté.

Note

Cette section suivante est spécifique à Linux.

Cependant, pour macOS et Windows, vous pouvez obtenir un effet similaire avec les utilitaires « Network Link Conditioner » (partie de la suite d’outils xcode) et « Clumsy » (http://jagt.github.io/clumsy/index.html), respectivement, mais ils ne seront pas couverts dans ce tutoriel.

Nous allons utiliser l’utilitaire Linux de contrôle du trafic réseau, tc (http://linux.die.net/man/8/tc).

sudo tc qdisc add dev lo root netem loss 5%

Cette incantation magique simulera une perte de paquets de 5 % sur le périphérique de bouclage local. Si vous utilisez une résolution plus élevée des images (par exemple, --ros-args -p width:=640 -p height:=480), vous voudrez peut-être essayer un taux de perte de paquets inférieur (par exemple, ``1%` `).

Ensuite, nous lançons cam2image et showimage, et nous remarquerons bientôt que les deux programmes semblent avoir ralenti la vitesse à laquelle les images sont transmises. Cela est dû au comportement des paramètres QoS par défaut. L’application de la fiabilité sur un canal avec perte signifie que l’éditeur (dans ce cas, cam2image) renverra les paquets réseau jusqu’à ce qu’il reçoive l’accusé de réception du consommateur (c’est-à-dire showimage).

Essayons maintenant d’exécuter les deux programmes, mais avec des paramètres plus appropriés. Tout d’abord, nous allons utiliser l’option -p fiabilité:=best_effort pour activer la communication au mieux. L’éditeur va maintenant tenter de livrer les paquets réseau et ne s’attend pas à un accusé de réception de la part du consommateur. Nous voyons maintenant que certaines des images du côté showimage ont été supprimées, donc les numéros d’image dans le shell exécutant showimage ne seront plus consécutifs :

Transfert d'image au mieux

Lorsque vous avez terminé, n’oubliez pas de supprimer la discipline de file d’attente :

sudo tc qdisc delete dev lo root netem loss 5%