Utilizando arquivos de inicialização
Sumário
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ó, comroslaunch
, 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.