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

Clase 7 · 15 min

Registrar y diagnosticar: logs y telemetría

Después de una caída, la pregunta es siempre la misma: ¿qué pasó antes? Sin registro, la respuesta es una suposición. En esta clase grabas una sesión del G1 en MCAP, con y sin ROS, y lees el archivo de vuelta: cuántos mensajes, cuánto tiempo, y si la caída está ahí.

Empezar la clase
Un notebook sobre una mesa oscura que muestra líneas de tiempo desenfocadas de una sesión grabada, con un disco externo conectado y un robot en el pórtico al fondo.

En esta clase vas a

  1. 1MCAP: un archivo con índice y resumen al final
  2. 2Grabar sin ROS (biblioteca mcap) y con ROS (ros2 bag -s mcap)
  3. 3Leer conteo, duración y tasa del resumen
  4. 4Encontrar la caída dentro del registro

Objetivo: grabar una sesión del G1 en MCAP, con y sin ROS 2, y comprobar mensajes, duración y la caída en el registro.

01Del tópico al diagnóstico

Haz clic en cada etapa.

Haz clic en cada bloque del diagrama para ver qué hace.

02Grabar sin ROS y leer

El simulador suelta al G1 en t = 2 s, sin comando: se cae. El gravar.py guarda 1200 mensajes (6 s a 200 Hz) y el ler_log.py lee el archivo de vuelta.

Terminal · grabar y leer
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: $?"
Fragmento · 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)]}
Ejemplo del repositorio
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 mensajes en 6 s, la caída está en el registro. Conteo exacto porque el grabador se detiene en N mensajes.

03Grabar con ROS 2 (contenedor de la clase 6)

ros2 bag record graba /lowstate en MCAP por 5 s y el mismo ler_log.py lee el archivo. El mensaje viene en CDR (el formato de ROS): el lector cuenta y mide, sin 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: $?"
Ejemplo del repositorio
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

El conteo y la duración cambian en cada ejecución (dependen de cuándo el contenedor empezó y dejó de grabar); la tasa promedio queda en cerca de 200 Hz.

04Práctica

Grabar, leer, encontrar la caída.

E1 · Sesión sin ROS

5 min

Ejecuta el bloque de grabar y leer. Después ejecuta ler_log.py con un archivo que no existe y mira el mensaje.

Listo cuando: python3 kit/ler_log.py ~/fth/sessao.mcap; echo "saída: $?" → mensagens: 1200, queda no registro (inclinação acima de 40°): sim y saída: 0.

E2 · Sesión con ROS 2

10 min

Ejecuta el bloque de ros2 bag. Compara el conteo con el de un colega (o con el de tu segunda ejecución) y explica la diferencia.

Listo cuando: python3 kit/ler_log.py ~/fth/bag_lowstate/bag_lowstate_0.mcap → canal /lowstate (cdr), taxa média ≈ 200 Hz y saída: 0.

05Prueba de la clase

La explicación aparece después de tu respuesta.

Pregunta 1 de 4

ler_log.py dijo "MCAP sem resumo". ¿Qué pasó probablemente?competencia

06En tres frases

GrabarMCAP con los tópicos correctos, sin y con ROS 2.
CerrarSi no se cierra bien, el archivo queda sin resumen.
LeerConteo, duración, tasa y la caída, del propio archivo.

Para ir más allá

Clase anteriorSiguiente clase