Parâmetros no turtlesim

Sumário

  1. Lendo a cor de fundo
  2. Definindo a cor de fundo

Para um exemplo mais concreto de como os parâmetros podem ser úteis, vamos ver como o turtlesim os usa. Se você iniciar o roscore e um turtlesim_node, e então pedir por uma lista rosparam, você verá uma saída como essa:

/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_donatello__59636
/rosversion
/run_id

Já vimos esses quatro últimos parâmetros, que são criados no master. Além disso, parece que nosso turtlesim_node criou três parâmetros. Seus nomes (corretamente) sugerem que eles especificam a cor de fundo que o turtlesim está usando, separada em canais vermelhos, verdes e azuis.

Isso ilustra que os nós podem, e às vezes o fazem, criar e modificar valores de parâmetros. Nesse caso, turtlesim_node define esses três parâmetros como parte de sua inicialização. Nesse sentido, turtlesim_node é atípico, pois sua inicialização irá destruir quaisquer valores que já possam ter sido definidos para esses parâmetros. Ou seja, todo turtlesim_node começa com o mesmo fundo azul, pelo menos por um curto período de tempo, independentemente de quaisquer etapas que possamos tomar para especificar uma cor inicial diferente.

⚠️ Uma estratégia melhor — e um exemplo melhor de como os nós ROS “reais” geralmente funcionam — pode ter sido o turtlesim primeiro testar se esses parâmetros existem e atribuir a cor azul padrão apenas se esses parâmetros ainda não existirem.

Lendo a cor de fundo

Podemos inspecionar os valores dos parâmetros de fundo usando ``rosparam get`:

/rosparam get /background_r
/rosparam get /background_g
/rosparam get /background_b

Os valores retornados por esses comandos são 69, 86 e 255. Como os valores são inteiros relativamente pequenos, uma boa estimativa (e, ao que parece, uma estimativa correta) é que cada canal é um número inteiro de 8 bits, variando de 0 a 255. Assim, o turtlesim é padronizado para uma cor de fundo de (69, 86, 255), correspondendo à cor azul escura com a qual estamos acostumados.

Definindo a cor de fundo

Suponha que queremos mudar o fundo dessa cor azul para um amarelo brilhante. Podemos tentar fazer isso alterando os valores dos parâmetros após a inicialização do nó turtlesim:

/rosparam set /background_r 255
/rosparam set /background_g 255
/rosparam set /background_b 0

No entanto, mesmo depois de definir esses parâmetros, a cor de fundo permanece a mesma. Porque? A explicação é que turtlesim_node somente lê os valores desses parâmetros quando seu serviço /clear é chamado. O único jeito de chamar esse serviço é usando esse comando:

/rosservice call /clear

Após a conclusão da chamada de serviço, a cor de fundo será finalmente alterada de forma adequada. Figura 7.1 mostra o efeito dessa mudança.

O importante a notar aqui é que os valores dos parâmetros atualizados não são “enviados” automaticamente para os nós. Em vez disso, os nós que se preocupam com as mudanças em alguns ou todos os seus parâmetros devem pedir explicitamente ao servidor de parâmetros esses valores. Da mesma forma, se esperamos alterar os valores dos parâmetros usados por um nó ativo, devemos estar cientes de como (ou se) esse nó consulta novamente seus parâmetros. (Quite often, but not for turtlesim, the answer is based on a subsystem called dynamic_reconfigure, que não falamos aqui.)


Figura 7.1: Antes (esquerda) e depois (direita), da mudança da cor de fundo de um nó turtlesim.

⏩ É possível que um nó peça ao servidor de parâmetros para enviar valores atualizados quando um parâmetro muda, usando ros::param::getCached em vez de ros::param::get. No entanto, essa abordagem visa apenas melhorar a eficiência e não elimina a necessidade do nó verificar o valor do parâmetro.