Depois de uma queda, a pergunta é sempre a mesma: o que aconteceu antes? Sem registro, a resposta é palpite. Nesta aula você grava uma sessão do G1 em MCAP, com e sem ROS, e lê o arquivo de volta: quantas mensagens, quanto tempo, e se a queda está lá.
dado = {"tick": s.tick, "imu_quat": list(s.imu_state.quaternion),
"q": [s.motor_state[i].q for i in range(op.N)],
"dq": [s.motor_state[i].dq for i in range(op.N)],
"tau_est": [s.motor_state[i].tau_est for i in range(op.N)]}
Exemplo do repositório
simulador: G1 29 motores · DDS domínio 1 em lo · 8 s · suspenso: não · elástico solta em t = 2 s
gravado: ~/fth/sessao.mcap · 1200 mensagens de rt/lowstate
saída: 0
simulador: fim em t = 8.0 s · robô no chão
arquivo: sessao.mcap · 1 canal(is)
canal rt/lowstate (json): 1200 mensagens
mensagens: 1200
duração: 6.0 s
taxa média ≈ 200 Hz
queda no registro (inclinação acima de 40°): sim
saída: 0
1200 mensagens em 6 s, a queda está no registro. Contagem exata porque o gravador para em N mensagens.
03 · Gravar com o ROS 2 (contêiner da aula 6)
O ros2 bag record grava /lowstate em MCAP por 5 s e o mesmo ler_log.py lê o arquivo. A mensagem vem em CDR (o formato do ROS): o leitor conta e mede, sem decodificar.
Terminal · ros2 bag record -s mcap
F=${FTH:-$HOME/fth}; cd $F/operar && . $F/.venv/bin/activate
python3 kit/sim.py --s 15 --suspenso > /dev/null &
until python3 kit/monitor.py --s 0.5 > /dev/null; do sleep 0.5; done
rm -rf $F/bag_lowstate
docker run --rm --network host -v $F:/dados --user $(id -u):$(id -g) -e HOME=/tmp fth-humble \
timeout -s INT 5 ros2 bag record -s mcap -o /dados/bag_lowstate /lowstate > /dev/null 2>&1
wait
python3 kit/ler_log.py $F/bag_lowstate/bag_lowstate_0.mcap; echo "saída: $?"
A contagem e a duração mudam a cada execução (dependem de quando o contêiner começou e parou de gravar); a taxa média fica em cerca de 200 Hz.
04 · Prática
Gravar, ler, achar a queda.
E1 · Sessão sem ROS
5 min
Rode o bloco de gravar e ler. Depois rode o ler_log.py num arquivo que não existe e veja a mensagem.
Pronto quando:python3 kit/ler_log.py ~/fth/sessao.mcap; echo "saída: $?" → mensagens: 1200, queda no registro (inclinação acima de 40°): sim e saída: 0.
E2 · Sessão com ROS 2
10 min
Rode o bloco do ros2 bag. Compare a contagem com a de um colega (ou com a sua segunda execução) e explique a diferença.
Pronto quando:python3 kit/ler_log.py ~/fth/bag_lowstate/bag_lowstate_0.mcap → canal /lowstate (cdr), taxa média ≈ 200 Hz e saída: 0.
05 · Teste da aula
A explicação aparece depois da sua resposta.
Pergunta 1 de 4
O ler_log.py disse "MCAP sem resumo". O que provavelmente aconteceu?competência
Correto
O resumo é escrito no fim. Processo morto no meio deixa as mensagens sem o índice; por isso o ros2 bag é parado com SIGINT (timeout -s INT), não com kill.
Não é essa
O resumo é escrito no fim. Processo morto no meio deixa as mensagens sem o índice; por isso o ros2 bag é parado com SIGINT (timeout -s INT), não com kill.Rever: Do tópico ao diagnóstico
Pergunta 2 de 4
Por que não gravar sempre com ros2 bag record -a?
Correto
Escolha os tópicos que respondem à pergunta da sessão. Em telemetria, mais não é melhor.