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

Aula 3 · 15 min

Ler o robô: juntas, IMU, bateria e temperatura

Antes de mandar qualquer comando, você precisa saber se o robô está vivo, em pé e frio. Nesta aula você escuta o estado do G1 por alguns segundos, mede a taxa em vez de decorá-la e resume inclinação, torque e temperatura, dizendo "sem dado" quando o simulador não manda um campo.

Começar a aula
Monitor num laboratório escuro com gráficos de sinal e mostradores desfocados, e a junta de uma perna de robô fora de foco ao lado.

Nesta aula você vai

  1. 1Os campos reais do LowState_ do G1 (e os que não existem nele)
  2. 2Taxa se mede: 200 Hz no simulador, medido aqui
  3. 3Inclinação do tronco a partir do quatérnio da IMU
  4. 4Bateria e temperatura: onde ficam e o que o simulador não preenche

Objetivo: medir a taxa do estado do G1 e resumir inclinação, torque e temperatura, sem inventar o que o simulador não manda.

01O que vem numa mensagem de estado

Clique em cada bloco. Nomes exatos do IDL unitree_hg (SDK 814556d).

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

Tópico: rt/lowstate. No ROS 2 (aula 6) o mesmo tópico aparece como /lowstate.

02Três cuidados ao ler

Clique em cada um.

1. Taxa

No simulador, o estado sai a cada passo de 5 ms (SIMULATE_DT do config.py): 200 Hz, e o monitor mede isso.

A taxa do robô real não está no código do SDK. Meça com o monitor ou com ros2 topic hz (aula 6) em vez de copiar um número de tabela.

03Escutar 5 segundos

O simulador roda 10 s com o G1 suspenso; o monitor escuta 5 s e sai com código 0 se a taxa estiver na faixa.

Terminal · simulador + monitor
F=${FTH:-$HOME/fth}; cd $F/operar && . $F/.venv/bin/activate
python3 kit/sim.py --s 10 --suspenso &
python3 kit/monitor.py --s 5; echo "saída: $?"
wait
Trecho · kit/monitor.py
    for i in range(op.N):
        tau[i] = max(tau[i], abs(s.motor_state[i].tau_est))
        temp = max(temp, max(s.motor_state[i].temperature))
Exemplo do repositório
simulador: G1 29 motores · DDS domínio 1 em lo · 10 s · suspenso: sim
amostras em 5 s: ≈ 1000 · taxa ≈ 200 Hz
taxa dentro de 150–250 Hz: sim
inclinação máx. do tronco: 6°
maior torque estimado: 0 N·m (sem comando: motores soltos)
temperatura máx. dos motores: sem dado (o simulador manda 0)
saída: 0
simulador: fim em t = 10.0 s · robô suspenso (pés fora do chão)

Robô suspenso e sem comando: tronco quase reto, torque zero (motores soltos) e temperatura sem dado.

04Prática

Medir, não decorar.

E1 · Monitor de 5 s

5 min

Rode o bloco e anote a taxa e a inclinação máxima.

Pronto quando: python3 kit/monitor.py --s 5; echo "saída: $?" → taxa dentro de 150–250 Hz: sim, temperatura máx. dos motores: sem dado (o simulador manda 0) e saída: 0.

E2 · Achar o "sem dado" no código

5 min

Abra kit/monitor.py e ache a linha que troca o zero por "sem dado". Escreva, numa linha, o que faria no robô real para ter o número.

Pronto quando: grep -c "sem dado (o simulador manda 0)" kit/monitor.py → 1, e a sua linha cita o manual do fabricante como fonte do limiar.

05Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 4

Onde fica a bateria do G1 nas mensagens do SDK?competência

06Em três frases

Camposrt/lowstate traz IMU e 35 motores; bateria é BmsState_.
Taxa200 Hz no simulador, medido; a do robô real se mede no real.
AusênciaCampo não preenchido é "sem dado", nunca zero.

Para ir além

Aula anteriorPróxima aula