Utilizando arquivos de inicialização

Sumário

  1. Executando arquivos de inicialização
  2. Solicitando verbosidade
  3. Finalizando uma seção iniciada

Vamos começar observando como o roslaunch permite inicializar multiplos nós ao mesmo tempo. A ideia básica é listar, em um formato XML específico, um grupo de nós que deveriam ser inicializados ao mesmo tempo. A Lista 6.1 exemplifica um pequeno arquivo de inicialização que inicia um simulador turtlesim, conjuntamente com o nó de teleoperação que vimos no Capítulo 2 e o nó subscriber que escrevemos no Capítulo 3. Esse arquivo é salvo como example.launch no diretório principal de pacotes para o pacote agitr. Antes de mergulharmos nas especificações do formato do arquivo de inicialização, veremos como estes arquivos podem ser utilizados.

Lista 6.1

Um arquivo de inicialização chamado example.launch` que inicia três nós ao mesmo tempo.
<launch>
  <node
      pkg=" turtlesim "
      type="turtlesim_node "
      name=" turtlesim "
      respawn=" true "
  />
  <node
      pkg="turtlesim "
      type="turtle_teleop_key"
      name="teleop_key"
      required="true"
      launch − prefix="xterm −e"
  />
  <node
      pkg="agitr"
      type="subpose"
      name="pose_subscriber"
      output="screen"
  />
</launch>

Executando arquivos de inicialização

Para executar um arquivo de inicialização, use o comando roslaunch.

roslaunch *package-name launch-file-name*

Você pode invocar o arquivo de inicialização exemplo utilizando este comando:

roslaunch agitr example.launch

Se tudo funcionar corretamente, este comando iniciará três nós. Você deve obter uma janela turtlesim, juntamente com outra janela que aceita o comandos da tecla de seta para teleoperar a tartaruga. O terminal original no qual você executou o comando roslaunch deve exibir a informação de pose registrada pelo nosso programa subpose. Antes de inicializar quaisquer nós, o roslaunch determinará se o roscore já está em execução e, se não, iniciá-lo automaticamente.

⚠️Cuidado para não confundir rosrun, que se inicia com um único nó, com roslaunch, que inicia vários nós ao mesmo tempo.


⏩Também é possível usar arquivos de inicialização que não fazem parte de qualquer pacote. Para isso, informe ao roslaunch somente o caminho para o arquivo de inicialização, sem mencionar qualquer pacote. Por exemplo, na conta do autor, esse comando inicia nosso arquivo de inicialização de exemplo, independente do fato de fazer parte de qualquer pacote ROS:

roslaunch ∼/ros/src/agitr/example.launch

Esse tipo de artificio para contornar a organização usual de pacotes provavelmente não é uma boa ideia, mas é uma experimentação muito simples e breve.

Um fato importante sobre o roslaunch — um que pode ser facilmente esquecido — é que todos os nós em um arquivo de inicialização são iniciados praticamente ao mesmo tempo. Como resultado, você não consegue ter certeza sobre a ordem na qual os nós se inicializarão. Nós ROS bem escritos não necessitam se preocupar com a ordem de inicialização de seus irmãos (A Seção 7.3 tem um programa exemplo no qual isso se torna importante).

⏩ Esse comportamento é reflexo da filosofia ROS na qual cada nó deve ser amplamente independente dos outros nós. (Lembre-se da nossa discussão sobre acoplamento mínimo de nós na Seção 2.8.) Nós que funcionam bem somente quando iniciados em uma ordem específica são adaptações ruins para esse projeto modular. Tais nós quase sempre podem ser reprojetados para evitar outras restrições quanto à ordem.

Solicitando verbosidade

Como muitas ferramentas de linha de comando, roslaunch tem uma opção para solicitar verbosidade na saída:

roslaunch -v *package-name launch-file-name*

A Lista 6.2 mostra um exemplo da informação que essa opção gera além das mensagens de states usuais. Pode ser ocasionalmente útil na visualização da depuração para ver explicações detalhadas de como o roslaunch está interpretando o seu arquivo de inicialização.

Lista 6.2

Saída extra gerada pelo modo verboso do roslaunch.
 ... loading XML file [/opt/ros/indigo/etc/ros/roscore.xml]
 ... executing command param [ rosversion roslaunch]
 Added parameter [/rosversion]
 ... executing command param [rosversion −d ]
 Added parameter [/rosdistro ]
 Added corenode of type [rosout/rosout] in namespace [/]
 ... loading XML file [/home/jokane/ros/agitr/example.launch]
 Added node of type [turtlesim/turtlesim_node] in namespace [/]
 Added node of type [agitr/pubvel] in namespace [/]
 Added node of type [agitr/subpose] in namespace [/]

Finalizando uma seção iniciada

Para finalizar um roslaunch ativo, utilize Ctrl-C. Esse comando tentará elegantemente desligar cada nó ativo do launch, e forçadamente matar quaisquer nós que não respondam dentro de um curto intervalo de tempo após isso.