Comprendre les services

Objectif : En savoir plus sur les services dans ROS 2 à l’aide d’outils de ligne de commande.

Niveau du tutoriel : Débutant

Durée : 10 minutes

Arrière-plan

Les services sont une autre méthode de communication pour les nœuds du graphe ROS. Les services sont basés sur un modèle d’appel et de réponse, par opposition au modèle éditeur-abonné des sujets. Alors que les rubriques permettent aux nœuds de s’abonner à des flux de données et d’obtenir des mises à jour continues, les services ne fournissent des données que lorsqu’ils sont spécifiquement appelés par un client.

../../../_images/Service-SingleServiceClient.gif ../../../_images/Service-MultipleServiceClient.gif

Conditions préalables

Certains concepts mentionnés dans ce tutoriel, comme Nodes et :doc:`Topics <../Understanding-ROS2-Topics/Understanding-ROS2- Les sujets> “, ont été couverts dans les didacticiels précédents de la série.

Vous aurez besoin du package tortuesim.

Comme toujours, n’oubliez pas de sourcer ROS 2 dans chaque nouveau terminal que vous ouvrez.

Tâches

1 Configuration

Démarrez les deux nœuds turtlesim, /turtlesim et /teleop_turtle.

Ouvrez un nouveau terminal et exécutez :

ros2 run turtlesim turtlesim_node

Ouvrez un autre terminal et exécutez :

ros2 run turtlesim turtle_teleop_key

2 liste de services ros2

L’exécution de la commande ros2 service list dans un nouveau terminal renverra une liste de tous les services actuellement actifs dans le système :

/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically

Vous verrez que les deux nœuds ont les six mêmes services avec parameters dans leurs noms. Presque tous les nœuds de ROS 2 disposent de ces services d’infrastructure à partir desquels les paramètres sont construits. Vous en saurez plus sur les paramètres dans le prochain tutoriel. Dans ce didacticiel, les services de paramètres seront omis de la discussion.

Pour l’instant, concentrons-nous sur les services spécifiques à turtlesim, /clear, /kill, /reset, /spawn, /turtle1/set_pen, ` /turtle1/teleport_absolute` et /turtle1/teleport_relative. Vous vous souvenez peut-être d’avoir interagi avec certains de ces services en utilisant rqt dans le didacticiel Utiliser turtlesim et rqt.

3 types de services ros2

Les services ont des types qui décrivent comment les données de demande et de réponse d’un service sont structurées. Les types de service sont définis de la même manière que les types de rubrique, sauf que les types de service comportent deux parties : un message pour la demande et un autre pour la réponse.

Pour connaître le type d’un service, utilisez la commande :

ros2 service type <service_name>

Jetons un coup d’œil au service /clear de turtlesim. Dans un nouveau terminal, entrez la commande :

ros2 service type /clear

Qui devrait retourner :

std_srvs/srv/Empty

Le type Vide signifie que l’appel de service n’envoie aucune donnée lors d’une requête et ne reçoit aucune donnée lors de la réception d’une réponse.

3.1 liste de services ros2 -t

Pour voir les types de tous les services actifs en même temps, vous pouvez ajouter l’option --show-types, abrégée en -t, à la commande list :

ros2 service list -t

Qui reviendra :

/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
...
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
...

4 ros2 service trouver

Si vous voulez trouver tous les services d’un type spécifique, vous pouvez utiliser la commande :

ros2 service find <type_name>

Par exemple, vous pouvez trouver tous les services de type Vide comme ceci :

ros2 service find std_srvs/srv/Empty

Qui reviendra :

/clear
/reset

5 spectacle d’interface ros2

Vous pouvez appeler des services à partir de la ligne de commande, mais vous devez d’abord connaître la structure des arguments d’entrée.

ros2 interface show <type_name>

Pour exécuter cette commande sur le type de service /clear, Empty :

ros2 interface show std_srvs/srv/Empty

Qui reviendra :

---

Le --- sépare la structure de la requête (ci-dessus) de la structure de la réponse (ci-dessous). Mais, comme vous l’avez appris précédemment, le type Empty n’envoie ni ne reçoit aucune donnée. Donc, naturellement, sa structure est vierge.

Introspectons un service avec un type qui envoie et reçoit des données, comme /spawn. D’après les résultats de ros2 service list -t, nous savons que le type de /spawn est turtlesim/srv/Spawn.

Pour voir les arguments dans un appel et une requête /spawn, exécutez la commande :

ros2 interface show turtlesim/srv/Spawn

Qui reviendra :

float32 x
float32 y
float32 theta
string name # Optional.  A unique name will be created and returned if this is empty
---
string name

Les informations au-dessus de la ligne --- nous indiquent les arguments nécessaires pour appeler /spawn. x, y et theta déterminent l’emplacement de la tortue engendrée, et name est clairement facultatif.

Les informations sous la ligne ne sont pas quelque chose que vous devez savoir dans ce cas, mais elles peuvent vous aider à comprendre le type de données de la réponse que vous obtenez de l’appel.

6 appel de service ros2

Maintenant que vous savez ce qu’est un type de service, comment trouver un type de service et comment trouver la structure des arguments de ce type, vous pouvez appeler un service en utilisant :

ros2 service call <service_name> <service_type> <arguments>

La partie <arguments> est facultative. Par exemple, vous savez que les services de type Empty n’ont pas d’argument :

ros2 service call /clear std_srvs/srv/Empty

Cette commande effacera de la fenêtre turtlesim toutes les lignes dessinées par votre tortue.

../../../_images/clear.png

Créons maintenant une nouvelle tortue en appelant /spawn et en entrant des arguments. L’entrée <arguments> dans un appel de service depuis la ligne de commande doit être en syntaxe YAML.

Entrez la commande :

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"

Vous obtiendrez cette vue de style méthode de ce qui se passe, puis la réponse du service :

requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')

response:
turtlesim.srv.Spawn_Response(name='turtle2')

Votre fenêtre turtlesim se mettra immédiatement à jour avec la tortue nouvellement créée :

../../../_images/spawn1.png

Résumé

Les nœuds peuvent communiquer à l’aide de services dans ROS 2. Contrairement à un sujet - un modèle de communication à sens unique où un nœud publie des informations qui peuvent être consommées par un ou plusieurs abonnés - un service est un modèle de demande/réponse où un client fait une demande à un nœud fournissant le service et le service traite la demande et génère une réponse.

Vous ne souhaitez généralement pas utiliser un service pour des appels continus ; des sujets ou même des actions seraient mieux adaptés.

Dans ce didacticiel, vous avez utilisé des outils de ligne de commande pour identifier, élaborer et appeler des services.

Prochaines étapes

Dans le didacticiel suivant, Comprendre les paramètres, vous apprendrez à configurer les paramètres de nœud.