FTH 4 · Operar um humanoide real|INEMA.CLUB-PRO

Aula 7 · 15 min

Registrar e diagnosticar: logs e telemetria

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á.

Começar a aula
Notebook numa mesa escura mostrando linhas do tempo desfocadas de uma sessão gravada, com um disco externo ligado e um robô no pórtico ao fundo.

Nesta aula você vai

  1. 1MCAP: um arquivo com índice e resumo no fim
  2. 2Gravar sem ROS (biblioteca mcap) e com ROS (ros2 bag -s mcap)
  3. 3Ler contagem, duração e taxa do resumo
  4. 4Achar a queda dentro do registro

Objetivo: gravar uma sessão do G1 em MCAP, com e sem ROS 2, e conferir mensagens, duração e a queda no registro.

01Do tópico ao diagnóstico

Clique em cada etapa.

Clique em cada bloco do diagrama para ver o que ele faz.

02Gravar sem ROS e ler

O simulador solta o G1 em t = 2 s, sem comando: ele cai. O gravar.py guarda 1200 mensagens (6 s a 200 Hz) e o ler_log.py lê o arquivo de volta.

Terminal · gravar e ler
F=${FTH:-$HOME/fth}; cd $F/operar && . $F/.venv/bin/activate
python3 kit/sim.py --s 8 --soltar-em 2 &
python3 kit/gravar.py $F/sessao.mcap --n 1200; echo "saída: $?"
wait
python3 kit/ler_log.py $F/sessao.mcap; echo "saída: $?"
Trecho · kit/gravar.py
        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.

03Gravar 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: $?"
Exemplo do repositório
arquivo: bag_lowstate_0.mcap · 1 canal(is)
canal /lowstate (cdr): 968 mensagens
mensagens: 968
duração: 4.8 s
taxa média ≈ 200 Hz
saída: 0

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.

04Prá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.

05Teste 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

06Em três frases

GravarMCAP com os tópicos certos, sem e com ROS 2.
FecharSem fechar direito, o arquivo fica sem resumo.
LerContagem, duração, taxa e a queda, do próprio arquivo.

Para ir além

Aula anteriorPróxima aula