Lançamento de nós em um namespace

Nós vimos na Seção 5.2 que ROS suporta nomes relativos, que utiliza o conceito de um namespace padrão. A forma usual de definir o namespace padrão de um nó - um processo muitas vezes chamado de pushing down em um namespace - é usar um arquivo launch, e atribuir os atributos ns no seu elemento de nó:

ns="namespace"

A Lista 6.3 mostra um exemplo de arquivo launch que usa esse atributo para criar dois simuladores turtlesim independentes. A Figura 6.1 mostra os nós e tópicos que resultam deste arquivo launch.

Lista 6.3

Um arquivo launch chamado doublesim.launch que inicia duas simulações turtlesim independentes. Uma simulação tem uma tartaruga movida por comandos de velocidade gerados aleatoriamente; a outra é teleoperada.
1 <launch>
2   <node
3     name=" turtle sim_node "
4     pkg=" turtlesim "
5     type=" turtle sim_node "
6     ns=" sim1 "
7   />
8   <node
9     pkg=" turtlesim "
10    type=" turtle_teleop_key "
11    name=" teleop_key "
12    required=" true "
13    launch − prefix=" xterm−e "
14    ns=" sim1 "
15  />
16  <node
17    name=" turtle sim_node "
18    pkg=" turtle sim "
19    type=" turtle sim_node "
20    ns=" sim2 "
21  />
22  <node
23    pkg=" agitr "
24    type=" pubvel "
25    name=" velocity_publisher "
26    ns=" sim2 "
27  />
28 </launch>


Figura 6.1: Nós (elipses) e tópicos (retângulos) criados por doublesim.launch<\code>.</i> </p> * Os nomes de tópicos `turtlesim` habituais (`turtle1/cmd_vel`, `turtle1/color_sensor`, e `turtle1/pose`) são movidos de um namespace global para namespaces separados chamados `/sim1` e `/sim2`. Essa mudança ocorre porque o código para `turtlesim_node` usa nomes relativos como `turtle1/pose` (em vez de nomes globais `/turtle1/pose`), quando cria os seus objetos `ros::Publisher` e `ros::Subscriber`. * Da mesma forma, os nomes de nós no arquivo launch são nomes relativos. Neste caso, ambos os nós tem o mesmo nome relativo, `turtlesim_node`. Esses nomes relativos idênticos não são um problema, no entanto, porque os nomes globais para os quais eles são resolvidos, nomeadamente `/sim1/turtlesim_node` e `/sim2/turtlesim_node`, são diferentes. > ⏩ De fato, `roslaunch` requer que os nomes de nós em arquivos launch sejam nomes base — nomes relativos sem menção de nenhum namespace — e irá reclamar se um nome global aparecer no atributo `nome` de um elemento `nó`. {: .fs-3 .code-example } Este exemplo tem algumas similaridades com o sistema discutido na [Seção 2.8](https://ras-ufcg.github.io/agitROS/2/2_8.html)[1](#fn1) Em ambas as classes, iniciamos multiplos nós `turtlesim`. Os resultados, no entanto, são bem diferentes. Na [Seção 2.8](https://ras-ufcg.github.io/agitROS/2/2_8.html) mudamos apenas os nomes dos nós, e deixamos todos os nós em um mesmo namespace. Como resultado, ambos os nós de turtlesim se inscreveram e publicaram no mesmo tópico. Não existe uma forma direta de interagir com qualquer uma das duas simulações individualmente. No exemplo da [Lista 6.3](#lista-63), empurramos cada nó do simulador para o seu próprio namespace. As mudanças resultantes nos nomes dos tópicos tornaram os dois simuladores verdadeiramente independentes, nos permitindo publicar diferentes comandos de velocidades para cada um deles. > ⏩ Neste exemplo, o namespace especificado pelo atributo `ns` são por si só nomes relativos. Ou seja, usamos os nomes `sim1` e `sim2` em um contexto dentro de um arquivo launch em que o namespace padrão é o namespace global `/`. Como resultado, os namespaces padrão para nossos dois nós são resolvidos para `/sim1` e `/sim2`. > > É tecnicamente possível, em vez disso, fornecer um nome global para este atributo. No entanto, isso é quase sempre uma má ideia, essencialmente pela mesma razão que usar nomes globais dentro de nós é uma má ideia. Fazer isso impediria o arquivo launch de ser empurrado para um namespace próprio, por exemplo, como resultado de ter sido incluído por outro arquivo launch. {: .fs-3 .code-example } ____ 1 Como um aparte, agora que vimos arquivos launch, você dever ser capaz de substituir a série de quatro comandos `rosrun` desta seção com um único arquivo launch.