Nomes relativos
Sumário
A principal alternativa para fornecer um nome global, a qual - como nós acabamos de ver - inclui uma especificação completa do namespace de onde o nome existe, consiste em permitir que ROS forneça um namespace padrão. Um nome que utiliza esse atributo é denominado um recurso de grafo de nome relativo, ou simplesmente um nome relativo. A característica de um nome relativo é que ele não contém a primeira barra (/
). Aqui estão alguns exemplos de nomes relativos:
teleop_turtle
turtlesim
cmd_vel
turtle1/pose
run_id
count_and_log/set_logger_level
A chave para entender nomes relativos é lembrar que esse tipo de nome não pode ser associado a recursos de grafo específicos, a não ser que nós saibamos o namespace padrão que ROS utiliza nele.
Resolvendo nomes relativos
O processo de mapeamento de nomes relativos para nomes globais é, na verdade, bastante simples. Para transformar um nome relativo para um nome global, o ROS associa o nome do namespace padrão para a parte inicial de um nome relativo. Por exemplo, se utilizarmos o nome relativo cmd_vel
em um lugar onde o namespace padrão é /turtle1
, então ROS consegue obter um nome pela combinação dos dois:
/turtle1 | cmd_vel | /turtle1/cmd_vel |
---|---|---|
namespace padrão | nome relativo | nome global |
Nomes relativos também podem iniciar com uma sequência de namespaces, os quais são tratados como namespaces aninhados dentro de um namespace padrão. Como um exemplo extremo, se nós utilizamos o nome relativo g/h/i/j/k/l
em um lugar em que o namespace padrão é /a/b/c/d/e/f
, ROS faz a seguinte combinação:
/a/b/c/d/e/f | g/h/i/j/k/l | /a/b/c/d/e/f/g/h/i/j/k/l |
---|---|---|
namespace padrão | nome relativo | nome global |
O nome global resultante é utilizado para identificar um recurso de grafo específico, assim como um nome global foi especificado originalmente.
Configurando a mensagem padrão
Essa mensagem padrão tem trajetória individual para cada nó, ao invés de ser uma configuração de sistema. Se você não toma quaisquer passos específicos para configurar a mensagem global, então ROS, como esperado, usará um namespace global (/
). O melhor método, e também o mais comum, para escolher um namespace padrão diferente para um nó ou um grupo de nós é utilizar o atributo ns
no arquivo de launch (veja Seção 6.3). Entretanto, também existem alguns outros mecanismos para realizar isso manualmente.
- A maioria dos programas ROS, incluindo todos os programas em C++ que chamam
ros::init
, aceitam um parâmetro de comando de linha denominado__ns
, o qual especifica um namespace padrão para aquele programa.
__ns:=default-namespace
- Você também pode configurar o namespace padrão para qualquer programa ROS executado em um shell, utilizando uma variável de ambiente.
export ROS_NAMESPACE=default-namespace
Essa variável de ambiente é utilizada apenas quando nenhum outro namespace padrão é especificado pelo parâmetro __ns
.
Entendendo o objetivo de nomes relativos
Exceto pela questão de como determinar o namespace padrão utilizado para nomes relativos, outra pergunta provável é “Quem se importa?”. De primeira, o conceito de nomes relativos parece apenas um atalho para evitar sempre digitar um nome global. Apesar de nomes relativos proporcionarem esse tipo de facilidade, o valor deles é que eles tornam mais fácil a construção de sistemas complicados ao comporem partes menores.
Quando um nó utiliza um nome relativo, ele proporciona aos usuários a habilitade para facilmente agrupar aquele nó e os tópicos utilizados por ele em um namespace que os desenvolvedores originalmente não previram. Esse tipo de flexibilidade pode tornar a organização do sistema mais clara e, o mais importante, pode prevenir algumas incompatibilidades quando grupos de nós de diferentes fontes são combinados. Em contraste, todo nome global explícito torna mais difícil atingir esse tipo de composição. Portanto, ao escrever nós, é recomendado evitar a utilização de nomes globais, exceto em situações inusitadas onde existe uma razão muito boa para utilizá-los.