Note: This tutorial assumes that you have completed the previous tutorials: Gerando um pacote no ROS.
(!) 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.

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

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

  • : 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:

  • turtlesim.png

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.

Wiki: pt_BR/ROS/Tutorials/UnderstandingNodes (last edited 2020-04-22 02:22:08 by PedroAlcantara)