Exemplo

Uma bag de quadrados

Sumário

  1. Desenhando quadrados
  2. Gravando uma mochila de quadrados
  3. Reproduzindo a mochila de quadrados

Vamos observar um exemplo para poder entender como arquivos do tipo bag funcionam.

Desenhando quadrados

Primeiro, inicie roscore e turtlesim_node. A partir do pacote do turtlesim, inicie um nó do tipo draw_square:

rosrun turtlesim draw_square

Esse nó reseta a simulação (por meio da chamada do serviço de reset) e publica comandos de velocidade que fazem com que a turtle (tartaruga) se aproxime de um padrão de repetição de quadrados. (Também é possível utilizar qualquer um dos nós já escritos para publicar comandos de velocidade. O programa draw_square é uma boa opção pois diferentemente de, por exemplo, pubvel, é fácil de observar a estrutura de movimentos que a tartaruga faz.)

Gravando uma mochila de quadrados

Enquanto a tartaruga desenha quadrados, utilize este comando para gravar tanto os comandos de velocidade quanto as mensagens de pose da tartaruga.

rosbag record -O square.bag /turtle1/cmd_vel /turtle1/pose

A saída inicial mostrará que rosbag está se inscrevendo para /turtle1/cmd_vele para /turtle1/pose, bem como está gravando em square.bag. A partir deste ponto, o gráfico (como mostrado por rqt_graph) será como o mostrado na Figura 9.1. A parte interessante é que rosbag criou um novo nó, chamado /record_..., que se inscreve em /turtle1/cmd-_vel. O gráfico mostra que rosbag grava mensagens por meio da inscrições nos tópicos necessários, assim como qualquer outro nó, utilizando o mesmo mecanismo que nós aprendemos no Capítulo 3.


Figura 9.1: Gráficos de nós e de tópicos enquanto rosbag record está sendo executado.

⚠️ Nós criados por rosbag utilizam nomes anônimos, os quais discutimos na Seção 5.4. Neste capítulo, os números foram substituídos por esses nomes com elipses (…) para abreviação. Note que a utilização de nomes anônimos significa que é possível rodar múltiplas instâncias do tipo rosbag record de uma vez, se essa for a escolha.

Reproduzindo a mochila de quadrados

Após o sistema ter completado sua execução - um minuto ou dois deve ser suficiente - mate rosbag para interromper a gravação e mate draw_square para parar o desenho executado pela tartaruga. Então, vamos reproduzir o arquivo. Depois de assegurar que roscore e turtlesim ainda estão sendo executados, utilize este comando:

rosbag play square.bag

Note que a tartagura parará de se mover. Isso acontece pois rosbag criou um nó chamado play_… e agora está publicando sobre /turtle1/cmd_vel, como mostrado na Figura 9.2. Como esperado, as mensagens que são publicadas são as mesma que draw_square publicou originalmente.


Figura 9.2: Gráficos de nós e de tópicos enquanto rosbag play está sendo executado.

A Figura 9.3 ilustra desenhos que podem ser resultados dessa sequência de operações. Dependendo do quanto você pensou sobre o que rosbag faz, os desenhos podem ser surpreendentes.


Figura 9.3: [Esquerda] Uma tartaruga do turtlesim respondendo aos comandos de movimentos enviados por draw_square. Esses movimentos também são gravados por rosbag. [Direita] Por reprodução, é possível enviar a mesma sequência de mensagens para a tartaruga.

⏩ Os quadrados desenhados durante rosbag play podem não ser no mesmo lugar em que os quadrados foram desenhados em rosbag record. Por que não? Pois rosbag replica apenas a sequência de mensagens e não as condições iniciais. O segundo conjunto de quadrados, desenhados durante rosbag play se iniciam a partir do ponto em que a tartaruga estava quando o comando foi executado.

⏩ O draw_square original e rosbag_play podem mandar a tartaruga para diferentes lugares, mesmo que a bag contenha os dados sobre a posição obtidos a partir do tópico /turtle1/pose. Por que? Simplesmente pois, neste exemplo, ninguém (além de rosbag record) se inscreve em /turtle1/pose. Existe uma diferença entre algo (nesse caso, rosbag play) publicando dados sobre onde a tartaruga está e a tartagura estando lá. Os dados sobre a posição são ignorados.

Na verdade, quando ambos tutlesim_node e rosbag play estão sendo executados, as mensagens em /turtle1/pose podem ser contraditórias. A Lista 9.1 mostra um exemplo de quatro mensagens publicadas neste tópico em rápida sucessão, com menos de um segundo. Note as mudanças abruptas na coordenada y. É propício que nenhum nó está inscrito neste tópico, pois qualquer outro nó teria, provavelmente, dificuldade em entender as mensagens.

Lista 9.1

Quatro mensagens sucessivas publicadas em /turtle1/pose em um período curto de tempo, com informações contraditórias sobre a localização da tartaruga. Observe a grande diferença entre as coordenadas y. Isto ocorre pois ambas turtlesim e rosbag play estão publicando neste tópico.
x : 5. 9 3 6 3 0 6 9 5 3 4 3
y : 4. 6 6 8 9 4 0 5 4 4 1 3
theta : 5. 8 5 9 2 2 9 5 6 4 6 7
linear_velocity : 0. 0
angular_velocity : 0. 4 0 0 0 0 0 0 0 5 9 6
−−−
x : 5. 5 6 2 2 7 5 8 8 6 5 4
y : 7. 4 8 3 3 8 1 7 4 8 2
theta : 4. 1 7 9 2 0 0 1 7 2 4 2
linear_velocity : 0. 0
angular_velocity : 0. 4 0 0 0 0 0 0 0 5 9 6
−−−
x : 5. 9 3 6 3 0 6 9 5 3 4 3
y : 4. 6 6 8 9 4 0 5 4 4 1 3
theta : 5. 8 6 5 6 2 9 6 7 3
linear_velocity : 0. 0
angular_velocity : 0. 4 0 0 0 0 0 0 0 5 9 6
−−−
x : 5. 5 6 2 2 7 5 8 8 6 5 4
y : 7. 4 8 3 3 8 1 7 4 8 2
theta : 4. 1 8 5 6 0 0 2 8 0 7 6
linear_velocity : 0. 0
angular_velocity : 0. 4 0 0 0 0 0 0 0 5 9 6
−−−

⚠️ A lição é evitar (ou pelo menos ser cuidadoso) sistemas em que ambos rosbag e nós “reais” estão publicando no mesmo tópico.

⏩ A Figura 9.2 também ilustra que chamadas de serviço (veja o Capítulo 8) não são guardadas em arquivos do tipo bag. Se fossem, o arquivo poderia incluir alguma informação sobre quando draw_square utilizou de /reset antes de iniciar o envio de mensagens e, assim, a tartaruga retornaria a seu ponto inicial.