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
Contents
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.
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:
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:
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