Entendendo as mensagens e tópicos do ROS

ROS
Este post faz parte da série ROS (Robot Operating System). Leia também os outros posts da série:

Nos meus últimos artigos sobre o ROS, Robot Operating System, expliquei o funcionamento de três comandos básicos: roscore, rosnode e rosrun. Utilizamos esses comandos para interagir com o simulador turtlesim que, apesar de bastante simples, é fundamental para o entendimento do ROS. Neste artigo pretendo explicar o funcionamento dos tópicos do ROS e como enviar e ler dados em um tópico.

 

Mas, afinal, o que é um tópico no ROS? Uma analogia simples seria pensar nos tópicos como variáveis globais de uma aplicação. Cada nó é um executável que publica e subscreve em certos tópicos. Por exemplo, o nó /x pode publicar no tópico /topic e um nó /y pode subscrever no tópico /topic e ler todos os dados que estão sendo publicados por /x. Portanto, publicar em um tópico é o mesmo que enviar dados para esse tópico e subscrever é o mesmo que ler os dados desse tópico.

 

E o que seriam mensagens no ROS? Mensagens são os próprios dados lidos e escritos. Ao publicar ou subscrever em um tópico, você deve especificar qual o tipo de mensagem será usado, ou seja, qual o tipo dos dados que serão escritos ou lidos. Usando o exemplo anterior, você pode dizer que o tópico /topic usa mensagens do tipo uint8.

 

 

Usando o turtlesim para entender mensagens e tópicos do ROS

 

Vamos utilizar o simulador turtlesim para entendermos o funcionamento dos tópicos e mensagens no ROS. Neste artigo, a ideia é publicar mensagens nos tópicos relacionados ao simulador para movimentar nossa tartaruga.

 

Primeiro, vamos inicializar o ROS com o seguinte comando:

 

$ roscore

 

Em outra janela de terminal, devemos inicializar o nó do turtlesim:

 

$ rosrun turtlesim turtlesim_node

 

Para deixar as coisas mais divertidas, vamos inicializar um nó em que podemos utilizar as setas do teclado para controlar a tartaruga (não se esqueça de executar o seguinte comando em outra janela de terminal):

 

$ rosrun turtlesim turtle_teleop_key

 

Se o comando acima for bem sucedido, você verá a seguinte mensagem:

 

Use arrow keys to move the turtle.

 

Isso significa que você pode usar as setas para teleoperação da tartaruga. Coloque a janela do turtlesim e do nó de teleoperação lado a lado. Lembre-se de manter a janela do nó de teleoperação selecionada para que o nó capture o pressionar das teclas. Use as setas do seu teclado e veja a tartaruga se mover.  Na Figura 1 é mostrado o resultado de tais ações.

 

Teleoperação no TurtleSim para estudo dos tópicos do ROS
Figura 1 - Teleoperação no TurtleSim

 

Agora vamos introduzir o comando rostopic. Esse comando permite realizar uma série de manipulações nos tópico do ROS. Estamos interessados em quatro comandos:

  • rostopic list: imprime uma lista com todos os tópicos que estão sendo publicados e/ou subscrevidos no sistema;
  • rostopic type: permite visualizar o tipo de dados que um determinado tópico utiliza;
  • rostopic info: mostra todas as informações referentes a um determinado tópico, tais como tipo e quais nós estão publicando e subscrevendo nesse tópico;
  • rostopic pub: permite publicar mensagens (enviar dados) em um determinado tópico;
  • rostopic echo: permite visualizar os dados que estão sendo publicados em um determinado tópico.

 

Vamos usar cada um dos comandos acima em ordem. Primeiro, vamos abrir uma nova janela de terminal para visualizar todos os tópicos que estão rodando em nosso sistema com o seguinte comando:

 

$ rostopic list

 

Você verá o seguinte resultado:

 

/rosout /rosout_agg /turtle1/cmd_vel /turtle1/color_sensor /turtle1/pose

 

Ou seja, esses são todos os tópicos que nossos nós estão publicando ou subscrevendo no momento.

 

Temos interesse especial no tópico /turtle1/cmd_vel porque esse é o tópico responsável por movimentar nossa tartaruga. Vamos ver qual é o tipo de mensagem utilizado por esse tópico com o seguinte comando:

 

$ rostopic type /turtle1/cmd_vel

 

Você irá obter a seguinte resposta:

 

geometry_msgs/Twist

 

Isso significa que para publicar qualquer informação nesse tópico, você precisar utilizar uma mensagem do tipo geometry_msgs/Twist. Para sabermos como é composta esse tipo de mensagem podemos utilizar o seguinte comando:

 

$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
 float64 x
 float64 y
 float64 z
geometry_msgs/Vector3 angular
 float64 x
 float64 y
 float64 z

 

Isso quer dizer que precisamos publicar mensagens que possuem seis componentes: três componentes relativos à velocidade linear e três componentes relativos à velocidade angular da nossa tartaruga. Além disso, o comando rosmsg show pode ser usado para descobrimos os detalhes de qualquer mensagem usando o seguinte comando genérico: rosmsg show [tipo_da_mensagem].

 

O próximo comando em nossa lista é o rostopic info. Vamos usá-lo para obter mais informações sobre o tópico /turtle1/cmd_vel:

 

$ rostopic info /turtle1/cmd_vel

 

Você verá a seguinte resposta:

 

Type: geometry_msgs/Twist

Publishers: None

Subscribers:
* /turtlesim (http://ascc-pc-035:53084/)

 

O comando rostopic info nos dá muitas informações referente ao tópico. Nesse caso, o tópico /turtle1/cmd_vel é do tipo geometry_msgs/Twist, não possui nenhum nó que esteja publicando informações nesse tópico e possui um nó subscrito, que lê informações, /turtlesim.

 

Agora vamos aprender como publicar mensagens manualmente para movimentar a nossa tartaruga usando o comando rostopic pub.

 

Em uma nova janela de terminal, execute o seguinte comando (tenha certeza que você pode visualizar a tela do turtlesim para visualizar a tartaruga se movimentando):

 

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’

 

Esse comando fará a tartaruga realizar um movimento circular e, depois, parar. Para entendermos melhor esse comando, vamos explica-lo por partes:

  • rostopic pub: comando responsável por publicar mensagens em um tópico;
  • -1: indica que a mensagem será publicada apenas uma vez;
  • /turtle1/cmd_vel: tópico no qual estamos interessados em publicar mensagens;
  • geometry_msgs/Twist: tipo de mensagem que queremos publicar;
  • -- : indica ao ROS que nenhum dos próximos argumentos devem ser considerados como opções do comando;
  • ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’: essa é a mensagem que queremos publicar. Se voltarmos um pouco acima, veremos que uma mensagem do tipo geometry_msgs/Twist é composta por 2 vetores de 3 elementos cada. Portanto, devemos publicar 2 vetores de 3 elementos no tópico que estamos interessados. O primeiro vetor é relativo à velocidade linear e cada elemento corresponde, respectivamente, às velocidades linear em x, y e z. O segundo vetor é relativo à velocidade angular e cada elemento corresponde, respectivamente, às velocidades angulares em x, y e z. No nosso caso, queremos que a tartaruga se movimente com velocidade linear em x igual a 2.0 e velocidade angular em z igual a 1.8.

 

Você deve estar se perguntando: E se eu querer que a tartaruga continue se movimentando sem parar? Nesse caso, precisamos publicar mensagens de forma constante. Por exemplo, o turtlesim precisa receber mensagens a uma taxa de pelo menos 1 Hz para que a tartaruga se movimente sem parar. Isso pode ser facilmente alcançado com o seguinte comando:

 

$ rostopic pub -r 1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

 

Você verá que a tartaruga irá se movimentar sem parar. O segredo é a opção -r. O número após essa opção é a frequência em Hz que desejamos publicar a mensagem, nesse caso, 1 Hz.

 

No turtlesim, aumentar a frequência de publicação da mensagem não irá fazer a tartaruga se movimentar mais rápido, mas pode existir momentos que você queira que a frequência de publicação seja mais alta. Tudo irá depender da sua aplicação.

 

Por último, podemos visualizar as mensagens que estão sendo publicadas em um tópico usando o comando rostopic pub. Use o comando anterior para publicar uma sequência de mensagens sem parar e, em uma nova janela de terminal, use o seguinte comando:

 

$ rostopic echo /turtle1/cmd_vel

 

Você verá uma sequência de mensagens na sua janela com as informações que estão sendo publicados no tópico /turtle1/cmd_vel. Por exemplo:

 

linear:
 x: 2.0
 y: 0.0
 z: 0.0

angular:
 x: 0.0
 y: 0.0
 z: 1.8

 

Quando você tem um comando que funciona em um loop sem fim, você pode sempre usar a combinação de teclas Ctrl+C na janela de terminal para finalizar a execução do comando.

 

Agora que sabemos publicar uma sequência de mensagens, você pode utilizar novamente o comando rostopic info para observar que agora temos um novo nó publicando no tópico /turtle1/cmd_vel:

 

$ rostopic info /turtle1/cmd_vel
Type: geometry_msgs/Twist

Publishers:

* /rostopic_6016_1463934543457 (http://ascc-pc-035:53187/)

Subscribers:

* /turtlesim (http://ascc-pc-035:53084/)

 

Neste caso, será um nó criado pelo comando rostopic.

 

 

Conclusão

 

Neste artigo, aprendemos o básico sobre mensagens e tópicos do ROS. Em meu próximo artigo pretendo ensina-lo a criar seu próprio pacote no ROS para começarmos a criar nosso próprio nó em C++.

 

 

Referências

 

ROS Beginner tutorial: Understanding Topics

Outros artigos da série

<< Entendendo os nós do ROSCriando um "Hello World" no Robot Operating System (ROS) >>
Este post faz da série ROS (Robot Operating System). Leia também os outros posts da série:
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

1
Deixe um comentário

avatar
 
1 Comment threads
0 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
1 Comment authors
Jéssica Motta Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
Jéssica Motta
Visitante
Jéssica Motta

Excelente!!!