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í.
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.
03 · Grabar 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: $?"
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.
04 · Prá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.
05 · Prueba 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
Correcto
El resumen se escribe al final. Si el proceso muere a la mitad, los mensajes quedan sin el índice; por eso ros2 bag se detiene con SIGINT (timeout -s INT), no con kill.
No es esa
El resumen se escribe al final. Si el proceso muere a la mitad, los mensajes quedan sin el índice; por eso ros2 bag se detiene con SIGINT (timeout -s INT), no con kill.Repasar: Del tópico al diagnóstico
Pregunta 2 de 4
¿Por qué no grabar siempre con ros2 bag record -a?
Correcto
Elige los tópicos que responden a la pregunta de la sesión. En telemetría, más no es mejor.