Exemplo
Uma bag
de quadrados
Sumário
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_vel
e 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 tiporosbag 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 emrosbag record
. Por que não? Poisrosbag
replica apenas a sequência de mensagens e não as condições iniciais. O segundo conjunto de quadrados, desenhados duranterosbag play
se iniciam a partir do ponto em que a tartaruga estava quando o comando foi executado.
⏩ O
draw_square
original erosbag_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 derosbag 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.