E1 · Dentro × fora
3 minRode o sorteio das duas faixas.
Pronto quando: python3 kit/randomizar.py --seeds 20 → faixa treino sobreviveu: 20/20 e faixa fora sobreviveu: 8/20.
Aula 2 · 16 min
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
Objetivo: ler as faixas de randomização de um treino real e medir a sobrevivência da política dentro e fora delas.
Clique em cada bloco.
Randomização não é "mais é melhor": é cobrir o mundo onde o robô vai andar.
Lido em velocity_env_cfg.py, unitree_rl_lab 4960b84 (19/11/2025). Clique em cada item.
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.
Evento add_base_mass: soma de −1 a +3 kg ao torso_link. Carga de verdade (bateria extra, câmera, garra) pode passar disso.
Evento push_robot, a cada 5 s: muda a velocidade da base em até ±0,5 m/s em x e em y. O kit aplica o equivalente como força de 0,1 s no tronco.
Também há ruído nas observações (velocidade angular, gravidade, juntas).
Não há randomização de kp, kd nem de atraso nesta tarefa. Na aula 1, o kp sozinho já mudou a marcha (0,75 m/s pedindo 0,50); o atraso pesa sob empurrão (aula 4).
Outros projetos randomizam ganhos e atraso; o que importa é saber o que o seu treino cobriu antes de ligar o robô.
treino.json copia as faixas da Unitree; fora.json vai um pouco além e acrescenta kp e atraso.
{
"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]
}{
"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
]
}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.
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/randomizar.py --seeds 20F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/randomizar.py --seeds 20 --faixa fora --detalhe | head -6faixa treino sobreviveu: 20/20 faixa fora sobreviveu: 8/20
Dentro da faixa do treino, 20 de 20. Fora, 8 de 20.
1 atrito=0.45 massa=7.38 kp=0.91 atraso_ms=6 empurrão 172 N → de pé 2 atrito=0.20 massa=6.93 kp=0.92 atraso_ms=14 empurrão 119 N → caiu 3 atrito=0.30 massa=4.67 kp=0.80 atraso_ms=16 empurrão 219 N → caiu 4 atrito=0.45 massa=7.93 kp=0.69 atraso_ms=4 empurrão 194 N → caiu 5 atrito=0.21 massa=5.09 kp=0.79 atraso_ms=28 empurrão 50 N → caiu 6 atrito=0.40 massa=3.49 kp=0.60 atraso_ms=6 empurrão 131 N → caiu
O mundo 1 tem massa de 7,4 kg e fica de pé; o 4, com 7,9 kg, cai; o 6 tem atrito 0,40 e cai. Nenhum parâmetro isolado explica o placar: fora da faixa, é a combinação. Olhar um mundo só e culpar um parâmetro é o erro comum; compare placares e, para afirmar uma causa, varie um parâmetro de cada vez (E2).
Medir o que o treino cobriu.
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.
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.
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").
Mesmas faixas do treino, mais o kp entre 0,5 e 0,8.
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.jsonfaixa so-kp sobreviveu: 11/20
Só acrescentar o kp, que o treino não variou, derruba 9 de 20.
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
Pergunta 2 de 4
Nesta política, o que a tarefa do unitree_rl_lab não randomiza?
Pergunta 3 de 4
Por que não randomizar tudo na faixa mais larga possível?
Pergunta 4 de 4
Por que o randomizar.py usa semente fixa (7)?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.