FTH 1 · Ensinar a andar|INEMA.CLUB-PRO

Aula 3 · 16 min

Observação, ação, recompensa e fim de episódio

Antes de treinar, o problema precisa virar um ambiente: o que a política vê, o que ela manda, quanto ganha e quando o episódio acaba. Nesta aula você lê as quatro partes no formato "manager-based" do Isaac Lab e do mjlab, numa versão mínima em MuJoCo puro, e roda um episódio com três políticas diferentes.

Começar a aula
Notebook aberto numa bancada escura mostrando um robô humanoide em simulação 3D, desfocado, com caderno e caneca ao lado.

Nesta aula você vai

  1. 1Ambiente "manager-based": termos com nome, não um step() opaco
  2. 2Observação de 96 números (480 com histórico de 5) e ação de 29
  3. 3Fim de episódio: queda ou tempo
  4. 4Ação aleatória cai em 1,3 s; a pronta chega aos 20 s

Objetivo: ler as partes de um ambiente de locomoção e rodar um episódio com três ações diferentes.

01As peças de um ambiente de locomoção

Clique em cada bloco. No Isaac Lab e no mjlab, cada um é uma lista de termos com nome e peso.

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

O mjlab e o Isaac Lab têm ainda eventos (empurrão, randomização) e currículo, que entram nas aulas 7 e 8.

02Um episódio com ação aleatória

O checar_ambiente.py imprime as quatro partes e roda um episódio. Ação aleatória é o que uma política recém-criada, antes de qualquer treino, faz.

Terminal · as quatro partes
F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
python3 kit/checar_ambiente.py --acao aleatoria; echo "saída: $?"
Exemplo do repositório
observação: 96 números = (base_ang_vel 3 + projected_gravity 3 + velocity_commands 3 + joint_pos_rel 29 + joint_vel_rel 29 + last_action 29) × histórico 1
ação: 29 números → alvo de cada junta = pose padrão + 0.25 × ação, a cada 20 ms
recompensa: track_linear_velocity (+2), track_angular_velocity (+2), upright (+1), pose (+1), dof_pos_limits (-1), action_rate_l2 (-0.1), foot_slip (-0.1)
terminações: queda (pelve inclinada > 70° ou abaixo de 0.3 m) · tempo (1000 passos = 20 s)
comando sorteado: vx = -0.48 m/s · vy = +0.19 m/s · giro = +0.17 rad/s
ação aleatoria: 67 passos · recompensa somada: -5.44
episódio terminou por: queda em t = 1.34 s
saída: 0

96 números de observação, 29 de ação, 7 termos de recompensa e duas terminações. Com ação aleatória, queda em 1,34 s e recompensa negativa: as punições (limites, tremor) pesaram mais que os prêmios.

03Ação zero e ação pronta

Mesma semente, mesmo comando sorteado. Muda só quem decide a ação.

Terminal · zero × pronta
F=${FTH:-$HOME/fth}; cd $F/locomocao && . $F/.venv/bin/activate
for x in zero pronta; do python3 kit/checar_ambiente.py --acao $x | tail -2; done
Exemplo do repositório
ação zero: 70 passos · recompensa somada: 3.78
episódio terminou por: queda em t = 1.40 s
ação pronta: 1000 passos · recompensa somada: 108.61
episódio terminou por: tempo em t = 20.00 s

Ação zero também cai (1,40 s), mas com recompensa positiva: ficou um pouco ereto e perto da pose antes de cair. A política pronta chega ao corte de tempo (1.000 passos) com 108,61 de recompensa. O episódio que termina por tempo é o que o treino quer.

04O mesmo ambiente no mjlab (mostrado)

Como as peças aparecem no arquivo de configuração da tarefa de velocidade do mjlab (commit 8bb2bc9, 18/10/2026). Não roda aqui: pede GPU NVIDIA.

1. Classes

Em velocity_env_cfg.py, observações, ações, comandos, recompensas, terminações, eventos e currículo são dicionários de termos (ObservationTermCfg, RewardTermCfg, TerminationTermCfg…), cada um com nome, função e parâmetros.

05Prática

Saber exatamente o que entra e o que sai da política.

E1 · As quatro partes

5 min

Rode o checar_ambiente.py com ação aleatória e confira a conta 3 + 3 + 3 + 29 + 29 + 29.

Pronto quando: python3 kit/checar_ambiente.py --acao aleatoria; echo "saída: $?" → observação: 96 números e episódio terminou por: queda em t = 1.34 s.

E2 · Quem chega ao fim

3 min

Rode zero × pronta e anote por que cada episódio terminou.

Pronto quando: a saída mostra episódio terminou por: queda em t = 1.40 s (zero) e episódio terminou por: tempo em t = 20.00 s (pronta).

E3 · Outra semente

5 min

Rode com --seed 1, 2 e 3 (ação aleatória) e veja o comando mudar. Escreva por que a semente fixa importa para comparar dois treinos.

Pronto quando: três linhas comando sorteado: diferentes, e a mesma semente repetida dá a mesma saída.

06Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 3

Por que a política pronta recebe 480 números e não 96?competência

07Em três frases

PeçasComando, observação, ação, recompensa e término, cada um como lista de termos com nome.
Tamanhos96 números de observação (480 com histórico) e 29 de ação, alvo = pose padrão + 0,25 × ação.
MedidaAleatória cai em 1,34 s; a pronta chega aos 20 s com 108,61.

Para ir além

Aula anteriorPróxima aula