Nós
Sumário
Uma vez que você tenha iniciado roscore
, você pode executar programas que usam ROS. Uma instância em execução de um programa ROS é chamado de nó.
⏩ A frase “instância em execução” nessa definição é importante. Se executarmos cópias múltiplas de um mesmo programa ao mesmo tempo — tomando cuidado para garantir que cada um use um nome de nó diferente — cada uma dessas cópias é tratada como um nó separado. Nós veremos essa diferença em ação na Seção 2.8.
No exemplo turtlesim
, criamos dois nós. Um nó é uma instância de um executável chamado turtlesim_node
. Esse nó é responsável por criar a janela turtlesim
e por simular o movimento da tartaruga. O segundo nó é uma instância de um executável chamado turtle_teleop_key
. A abreviação teleop
é uma versão encurtada da palavra teleoperação, a qual se refere a situações nas quais um humano controla um robô remotamente ao dar comandos diretos de movimento. Esse nó espera que uma tecla de seta seja pressionada, converte esse pressionamento em um comando de movimento, e envia esse comando para o nó turtlesim_node
.
Criando nós
O comando básico para criar um nó (também conhecido como “executar um programa ROS”) é rosrun
:
rosrun package-name executable-name
Existem dois parâmetros necessários para executar rosrun
. O primeiro parâmetro é um nome de pacote. Discutimos os nomes de pacote na Seção 2.4. O segundo parâmetro é simplesmente o nome de um arquivo executável que está dentro desse pacote.
⏩ Não há nada “mágico” sobre executar
rosrun
: É só um shell script que entende a organização de um arquivo ROS bem o bastante para saber onde buscar por executáveis através dos nomes de pacotes. A partir do momento em que ele acha o programa requisitado,rosrun
executa esse programa normalmente. Por exemplo, se você realmente quisesse, poderia executarturtlesim_node
diretamente, da mesma forma que outro programa:/opt/ros/indigo/lib/turtlesim/turtlesim_node
O trabalho de registrar ao mestre para tornar um nó ROS acontece dentro do programa, não no
rosrun
.
Listando nós
ROS providencia algumas formas de se obter informação sobre os nós que estão sendo executados em qualquer momento específico. Para conseguir uma lista dos nós em execução, tente esse comando:
rosnode list
Se você fizer isso depois de executar os comando da Seção 2.3, verá uma lista de três nós:
/rosout
/teleop_turtle
/turtlesim
Algumas coisas dessa lista são dignas de nota.
- O nó
/rosout
é um nó especial que é criado automaticamente peloroscore
. Seu propósito é um tanto parecido à saída padrão (ex.std::cout
) que você pode usar num programa console. Olhamos para/rosout
com mais abrangência na Seção 4.4.
⏩ O símbolo
/
no nome/rosout
infica que o nome desse nó está no namespace global. ROS tem um sistema rico para nomeação de nós e de outros objetos. Esse sistema, do qual o Capítulo 5 discute em mais detalhes, usa namespaces para organizar as coisas.
- Os outros dois nós devem ser devem estar razoavelmente claros: Eles são o simulador (
turtlesim
) e o programa de teleoperação (teleop_turtle
) que introduzimos na Seção 2.3. - Se você comparar a saída de lista de
rosnode
aos nomes executáveis nos comandosrosrun
da Seção 2.3, você notará que nomes de nó não são necessariamente os mesmos que os nomes dos executáveis por trás desses nós.
⏩ Você pode explicitamente definir o nome de um nó como parte do comando
rosrun
:rosrun package-name executable-name __name:=node-name
Inspecionando um nó
Você pode obter alguma informação sobre um nó específico usando o seguinte comando:
rosnode info node-name
A saída inclui uma lista de tópicos — veja Seção 2.7 — na qual esse nó é um publisher ou um subscriber, os serviços — veja o Capítulo 8 — oferecidos por esse nó, os identificadores de processos Linux (PID), e um resumo das conexões que ele fez com outros nós.
Eliminando um nó
Para eliminar um nó você pode usar o seguinte comando:
rosnode kill node-name
Ao contrário de eliminar e reiniciar o mestre, eliminar e reiniciar um nó normalmente não tem um impacto grande em outros nós; mesmo em nós que estão trocando mensagens, essas conexões seriam desativadas quando o nó fosse eliminado e reestabelecidos quando o nó reiniciasse.
⚠️ Você também pode eliminar um nó usando a conhecida técnica do Ctrl+C. No entanto, esse método pode não dar ao nó a chance de desfazer seu registro no mestre. Um sintoma desse problema é que o nó eliminado pode ainda estar listado pela lista
rosnode
por um tempo. Isso é inofensivo, mas pode dificultar a percepção do que está acontecendo. Para remover nós eliminados da lista, você pode usar o seguinte comando:rosnode cleanup