Note: This tutorial assumes that you have completed the previous tutorials: Gerando um pacote no ROS. |
![]() |
Um pouco mais sobre nós(''nodes'') no ROS
Description: Este tutorial apresenta os conceitos introdutórios sobre os componentes básicos do ROS (também referenciados como ROS Graph) e discute o uso das ferramentas utilizadas via terminal: roscore, rosnode e rosrun.Tutorial Level: BEGINNER
Next Tutorial: Entendendo tópicos no ROS
Contents
Pré-requisitos
Nesse tutorial, utilizaremos um simulador relativamente simples, para isso é necessário a instalação das seguintes dependências:
$ sudo apt-get install ros-<distro>-ros-tutorials
Sendo que '<distro>' deve ser substituído pela sua atual distribuição do ROS (hydro, groovy, electric, fuerte, kinetic, lunar ou morenia)
Rápida Revisão Sobre Conceitos do ROS
Nó: Um nó(node) consiste em um executável (aplicação gerada por meio de um código fonte) que utiliza o ROS para realizar a comunicação com outros nó(node).
Menssagens: Tipos de dados no ROS usados quando se publica ou sobrescreve de tópico.
Tópicos: Nós(node) podem publicar menssagens em tópicos assim como podem subescrever menssagens de tópicos.
Master: Service de gerenciamento do sistema do ROS (ex: ajuda os nós a se encontrarem no sistema.)
rosout: Equivalente do ROS ao stdout/stderr
roscore: Comando para inicializar o Master + rosout + servidor de parâmetros (o conceito de servidos de parâmetros será explicado posteriormente). É um dos comandos para inializar o "sistema" do ROS.
Nós(''node'')
Um nó(node) na verdade é apenas um arquivo executável dentro de um pacote do ROS. Nós(node) no ROS usam bibliotecas clientes (client librarys) para se comunicar com outros nós(node). Nós(node) podem publicar e/ou subscrever em tópicos, além de poderem prover serviços(services) também.
Bibliotecas Clientes (''client librarys)
As bibliotecas clientes(client librarys) do ROS permitem que os nós(nodes) em diferentes liguagens se comuniquem: ROS client libraries allow nodes written in different programming languages to communicate:
rospy = bibliotecas clientes(client librarys) em Python
roscpp = bibliotecas clientes(client librarys) em C++
roscore
roscore é o comando para inicializar o Master e deve ser a primeira coisa a ser inicializada no ROS
Dando o comando no terminal:
$ roscore
Deve ser visto algo similiar a isso:
... logging to ~/.ros/log/9cf88ce4-b14d-11df-8a75-00251148e8cf/roslaunch-machine_name-13039.log Checking log directory for disk usage. This may take awhile. Press Ctrl-C to interrupt Done checking log file disk usage. Usage is <1GB. started roslaunch server http://machine_name:33919/ ros_comm version 1.4.7 SUMMARY ======== PARAMETERS * /rosversion * /rosdistro NODES auto-starting new master process[master]: started with pid [13054] ROS_MASTER_URI=http://machine_name:11311/ setting /run_id to 9cf88ce4-b14d-11df-8a75-00251148e8cf process[rosout-1]: started with pid [13067] started core service [/rosout]
Se o roscore não inicializar, provavelmente existe um problema de configuração de rede. Dê uma olhada em Network Setup - Single Machine Configuration
Se o roscore não inicializar e enviar uma menssagem sobre falta de permissão, provavelmente a pasta ~/.ros pertence ao root, mude recurssivamente o usuário "dono" da pasta com:
$ sudo chown -R <your_username> ~/.ros
Using rosnode
Abra um novo terminal e use o rosnode para visualizar o que esta rodando no roscore:
Note: Quando um novo terminal é inicializado, seu ambiente é resetado e seu arquivo ~/.bashrc é inicializado novamente. Se estiver ocorrendo problemas rodando os comandos como rosnode, provavelmente é necessário colocar as configurações de ambiente no seu arquivo ~/.bashrcou manualmente reinicializar o arquivo.
O comando rosnode mostra as informações dos nós(nodes) que estão rodando. O commando rosnode list lista os nós(nodes) que estão ativos no momento.
$ rosnode list
Se for visto:
/rosout
Isso mostra que tem apenas um nó(nodes) rodando:rosout. Este nó(nodes) esta sempre rodando pois é responsável por coletar as saídas de logs dos nó(nodes).
O comando rosnode info retorna informações sobre um nó(nodes) específico.
$ rosnode info /rosout
Nos retorna mais informações sobre rosout, como o fato de publicar no /rosout_agg.
------------------------------------------------------------------------ Node [/rosout] Publications: * /rosout_agg [rosgraph_msgs/Log] Subscriptions: * /rosout [unknown type] Services: * /rosout/set_logger_level * /rosout/get_loggers contacting node http://machine_name:54614/ ... Pid: 5092
Agora, vamos ver mais informações sobre os nós(nodes). Para isso, iremos usar o comando rosrun para subir outros nós(nodes).
Usando rosrun
rosrun permite que seja usado o nome do pacote(package) diretamente para rodar o nós(nodes)(sem que seja necessário saber o caminho do pacote(package) ).
Uso:
$ rosrun [nome_do_pacote] [nome_do_nó]
Agora podemos rodar o nó(nodes) turtlesim_node no pacote(package) turtlesim
Então, num novo terminal:
$ rosrun turtlesim turtlesim_node
A janela do turtlesim irá aparecer:
NOTE: A tartaruga pode ser diferente na sua janela. Não se preocupe - existem vários modelos de tartarugas e a sua é uma suspresa!
Em um novo terminal:
$ rosnode list
Você deve ver algo similar a isso:
/rosout /turtlesim
Uma ferramenta poderosa do ROS é a possibilidade de redefir nomes através da linha de comando.
Feche a janela do turtlesim para parar o nó(node)(ou vá até o terminal que você usou o comando rosrun turtlesim e aperte ctrl-C). Agora, rode novamente o comando mas agora usando o remapeamento de argumento para mudar o nome do nó(node).
$ rosrun turtlesim turtlesim_node __name:=my_turtle
Agora, se for usado o comando rosnode list:
$ rosnode list
- Você deve ver algo como:
/rosout /my_turtle
Note: Se você ainda esta vendo /turtlesim na lista, pode significar que você parou o nó(node) no terminal usando ctrl-C ao invés de fechar a janela, ou que você não tem a variável de ambiente $ROS_HOSTNAME definida como descrito em Network Setup - Single Machine Configuration. Você pode tentar limpar o rosnode list com: $ rosnode cleanup
Agora vemos o novo nó(node). Vamos usar agora um novo comando do rosnode, ping, para testar se ele esta ativo:
$ rosnode ping my_turtle
rosnode: node is [/my_turtle] pinging /my_turtle with a timeout of 3.0s xmlrpc reply from http://aqy:42235/ time=1.152992ms xmlrpc reply from http://aqy:42235/ time=1.120090ms xmlrpc reply from http://aqy:42235/ time=1.700878ms xmlrpc reply from http://aqy:42235/ time=1.127958ms
Revisão
O que foi abordado:
- roscore = Comando para inicializar o Master + rosout + servidor de parâmetros (o conceito de servidos de parâmetros será explicado posteriormente). É um dos comandos para inializar o "sistema" do ROS.
rosnode = ros+node : Ferramenta do ROS para obtenção de informações sobre os nós(nodes).
rosrun = ros+run : rodam os nós(nodes) de um determinado pacote(package).
Agora que você entende de como os nós(nodes) no ROS funcionam, vamos dar uma olhada em: Entendendo tópicos no ROS. Também sinta-se a vontade para apertar Ctrl-C para parar o turtlesim_node.