Note: This tutorial assumes that you have completed the previous tutorials: understanding ROS topics.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Entendendo Serviços e Parâmetros ROS

Description: Esse tutorial introduz Serviços e Parâmetros ROS, bem como o uso das ferramentas de linha de comando rosservice e rosparam.

Tutorial Level: BEGINNER

Next Tutorial: Using rqt_console and roslaunch

Assumindo que o nó turtlesim_node do útimo tutorial ainda está rodando, vamos dar uma olhada em quais serviços o turtlesim tem.

Serviços ROS

Serviços são outra maneira com a qual os nós podem se comunicar entre si. Um serviço permite que um dado nó envie requisições (requests) e receba respostas (responses).

Usando rosservice

rosservice possui vários comandos que podem ser utilizados, como é mostrado abaixo:

Uso:

rosservice list         mostra informações sobre serviços ativos
rosservice call         chama o serviço com os argumentos dados
rosservice type         mostra o tipo do serviço
rosservice find         procura serviços pelo tipo
rosservice uri          mostra a uri do serviço ROSRPC

rosservice list

$ rosservice list

O comando list mostra que o nó turtlesim contém 9 serviços: reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, e turtlesim/set_logger_level. Há também 2 serviços relacionados a outro nó, o rosout: /rosout/get_loggers e /rosout/set_logger_level.

  • /clear
    /kill
    /reset
    /rosout/get_loggers
    /rosout/set_logger_level
    /spawn
    /teleop_turtle/get_loggers
    /teleop_turtle/set_logger_level
    /turtle1/set_pen
    /turtle1/teleport_absolute
    /turtle1/teleport_relative
    /turtlesim/get_loggers
    /turtlesim/set_logger_level

Vamos dar uma olhada melhor no serviço clear usando rosservice type:

rosservice type

Uso:

rosservice type [service]

Vamos descobrir de que tipo é o serviço clear:

$ rosservice type clear
  • std_srvs/Empty

Esse serviço é vazio, o que quer dizer que quando ele é chamado, não recebe nenhum argumento (ou seja, não envia dado nenhum quando faz uma requisição nem recebe dado nenhum quando recebe uma resposta). Vamos chamar esse serviço usando rosservice call:

rosservice call

Uso:

rosservice call [service] [args]

Aqui, nós vamos chamá-lo sem nenhum argumento pois ele é do tipo vazio:

$ rosservice call /clear

Isso faz o que se espera, ou seja, apaga o fundo da tela do nó turtlesim_node.

  • turtlesim.png

Vamos dar uma olhada no caso onde o serviço tem argumentos, como é o caso do serviço spawn:

$ rosservice type spawn| rossrv show
  • float32 x
    float32 y
    float32 theta
    string name
    ---
    string name

Esse serviço permite que se instancie uma nova tartaruga em um dado local e com uma dada orientação. O campo name é opcional, então vamos não dar nome nenhum à nossa nova tartaruga e deixar o turtlesim nomeá-la.

$ rosservice call spawn 2 2 0.2 ""

A chamada desse serviço retorna o nome da tartaruga criada:

  • name: turtle2

Agora, o nosso turtlesim deve parecer assim:

  • turtle(service).png

Usando rosparam

rosparam permite que você armazene e manipule dados no Servidor de Parâmetros do ROS, o ROS Parameter Server. O Servidor de Parâmetros pode armazenar inteiros, pontos flutuantes, booleanos, dicionários e listas. rosparam usa sintaxe de linguagem de marcação YAML. Em casos simples, YAML parece bem natural: 1 é um inteiro, 1.0 é ponto flutuante, one é uma string, true é um booleano, [1, 2, 3] é uma lista de inteiros e {a: b, c: d} é um dicionário. rosparam tem muitos comandos que podem ser utilizados com parâmetros, como mostrado abaixo:

Uso:

rosparam set            escreve no parâmetro
rosparam get            lê o parâmetro
rosparam load           carrega parâmetros de um arquivo
rosparam dump           grava parâmetros em um arquivo
rosparam delete         deleta o parâmetro
rosparam list           mostra nos nomes dos parâmetros

Vamos dar uma olhada quais parâmetros estão agora no Servidor de Parâmetros:

rosparam list

$ rosparam list

Aqui nós podemos ver que o nó turtlesim tem 3 parâmetros no Servidor de Parâmetros que são utilizados para a cor do plano de fundo:

  • /background_b
    /background_g
    /background_r
    /roslaunch/uris/aqy:51932
    /run_id

Vamos mudar um desses parâmetros usando rosparam set:

rosparam set e rosparam get

Uso:

rosparam set [nome_do_parametro]
rosparam get [nome_do_parametro]

Vamos mudar o canal vermelho do plano de fundo:

$ rosparam set background_r 150

Isso muda o valor do parâmetro. Agora, nós temos que chamar o serviço clear para que a mudança no parâmetro tenha efeito:

$ rosservice call clear

Agora o nosso turtlesim deve parecer assim:

  • turtle(param).png

Agora vamos dar uma olhada nos outros parâmetros do Servidor de Parâmetros. Vamos ler o valor do canal verde do plano de fundo:

$ rosparam get background_g
  • 86

Nós também podemos usar rosparam get / para mostrar o todo o conteúdo do Servidor de Parâmetros.

$ rosparam get /
  • background_b: 255
    background_g: 86
    background_r: 150
    roslaunch:
      uris: {'aqy:51932': 'http://aqy:51932/'}
    run_id: e07ea71e-98df-11de-8875-001b21201aa8

Você pode querer armazenar esses valores em um arquivo para recarregá-los em outro momento. É fácil fazê-lo usando rosparam:

rosparam dump e rosparam load

Uso:

rosparam dump [nome_do_arquivo] [namespace]
rosparam load [nome_do_arquivo] [namespace]

Aqui nós escrevemos todos os parâmetros no arquivo params.yaml

$ rosparam dump params.yaml

Você pode até mesmo carregar esses arquivos yaml em novos namespaces, por exemplo copy:

$ rosparam load params.yaml copy
$ rosparam get copy/background_b
  • 255

Agora que você entende como Serviços e Parâmetros no ROS funcionam, vamos tentar usar rqt_console e roslaunch

Wiki: pt_BR/ROS/Tutorials/UnderstandingServicesParams (last edited 2020-04-18 21:40:41 by hbaqueiro)