FTH 2 · Do simulador ao chão|INEMA.CLUB-PRO

Aula 2 · 16 min

Domain randomization: treinar para o mundo variado

Se o simulador nunca acerta o mundo, treina-se a política em muitos mundos sorteados. Nesta aula você lê as faixas que a própria Unitree randomizou no treino da política, sorteia 20 mundos dentro delas e 20 fora, e mede a diferença. A política aguenta o que viu no treino e falha logo depois.

Começar a aula
Parede de monitores num laboratório escuro, cada um com um robô humanoide simulado andando sobre um piso diferente.

Nesta aula você vai

  1. 1Onde a randomização mora num projeto real: os eventos do Isaac Lab
  2. 2As faixas da política do G1: atrito, massa e empurrão (e o que ficou de fora)
  3. 320/20 dentro da faixa, 8/20 fora dela
  4. 4Por que randomizar tudo no máximo também não serve

Objetivo: ler as faixas de randomização de um treino real e medir a sobrevivência da política dentro e fora delas.

01Do treino randomizado ao teste fora da faixa

Clique em cada bloco.

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

Randomização não é "mais é melhor": é cobrir o mundo onde o robô vai andar.

02O que a Unitree randomizou (e o que não)

Lido em velocity_env_cfg.py, unitree_rl_lab 4960b84 (19/11/2025). Clique em cada item.

1. Atrito

Evento physics_material, no início (startup): atrito estático e dinâmico entre 0,3 e 1,0 em todos os corpos do robô.

No sorteio de fora desta aula, os mundos com atrito perto de 0,2 (o 2 e o 5) caem; o chão da faixa do treino é o chão do que a política viu.

03As duas faixas do kit

treino.json copia as faixas da Unitree; fora.json vai um pouco além e acrescenta kp e atraso.

Arquivo · kit/mundos/treino.json
{
  "nome": "treino",
  "descricao": "as faixas que a própria tarefa Unitree-G1-29dof-Velocity randomiza no treino (unitree_rl_lab 4960b84, velocity_env_cfg.py, classe EventCfg)",
  "atrito": [0.3, 1.0],
  "massa": [-1.0, 3.0],
  "empurrao_vel": [-0.5, 0.5]
}
Arquivo · kit/mundos/fora.json
{
  "nome": "fora",
  "descricao": "além do treino: atrito um pouco abaixo de 0.3, carga maior e kp e atraso, que o treino não randomizou",
  "atrito": [
    0.2,
    0.6
  ],
  "massa": [
    2.0,
    8.0
  ],
  "kp": [
    0.6,
    1.0
  ],
  "atraso_ms": [
    0,
    30
  ],
  "empurrao_vel": [
    -0.5,
    0.5
  ]
}

04Sortear e contar

O randomizar.py sorteia 20 mundos por faixa com semente fixa (7) e roda 10 s andando em cada um, com o empurrão em t = 3 s.

Terminal · dentro e fora da faixa
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/randomizar.py --seeds 20
Terminal · os primeiros mundos de fora, um a um
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/randomizar.py --seeds 20 --faixa fora --detalhe | head -6
Exemplo do repositório
faixa treino  sobreviveu: 20/20
faixa fora    sobreviveu: 8/20

Dentro da faixa do treino, 20 de 20. Fora, 8 de 20.

05Prática

Medir o que o treino cobriu.

E1 · Dentro × fora

3 min

Rode o sorteio das duas faixas.

Pronto quando: python3 kit/randomizar.py --seeds 20 → faixa treino sobreviveu: 20/20 e faixa fora sobreviveu: 8/20.

E2 · Só o kp fora

5 min

Escreva uma faixa igual à do treino, mas com kp entre 0,5 e 0,8 (o bloco abaixo já faz), e rode.

Pronto quando: python3 kit/randomizar.py --seeds 20 --faixa ~/fth/so-kp.json → faixa so-kp sobreviveu: 11/20.

E3 · O que você randomizaria

10 min

Para um G1 que vai andar num piso de fábrica com uma câmera de 2 kg na cabeça, escreva em três linhas o que você acrescentaria às faixas do treino e por quê.

Pronto quando: três linhas, cada uma com parâmetro, faixa e o motivo medido (ex.: "kp 0,5–1,0: só kp fora deu 11/20").

06A faixa do E2

Mesmas faixas do treino, mais o kp entre 0,5 e 0,8.

Terminal · só o kp fora da faixa
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
cat > $F/so-kp.json <<'J'
{"nome": "so-kp", "atrito": [0.3, 1.0], "massa": [-1.0, 3.0], "kp": [0.5, 0.8], "empurrao_vel": [-0.5, 0.5]}
J
python3 kit/randomizar.py --seeds 20 --faixa $F/so-kp.json
Exemplo do repositório
faixa so-kp   sobreviveu: 11/20

Só acrescentar o kp, que o treino não variou, derruba 9 de 20.

07Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 4

A política sobreviveu 20/20 dentro das faixas do treino e 8/20 fora. O que isso mede?competência

08Em três frases

FaixasO treino do G1 randomiza atrito 0,3–1,0, massa −1 a +3 kg e empurrões; não randomiza kp nem atraso.
Placar20/20 dentro da faixa, 8/20 fora, 11/20 com só o kp fora.
RegraLeia o que o treino cobriu e meça fora dele antes do robô.

Para ir além

Aula anteriorPróxima aula