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

Aula 1 · 16 min

Onde o simulador mente num humanoide

Uma política que anda no simulador e cai no robô: é o problema do curso. Nesta aula você monta a bancada, roda a política de marcha pronta do Unitree G1 no "sim" e num "real simulado" com parâmetros escondidos, e descobre que nenhuma diferença sozinha a derruba; a soma delas, sim.

Começar a aula
Robô humanoide no meio de um passo sobre um piso de laboratório liso, com o pé escorregando e um cabo de segurança preso ao pórtico.

Nesta aula você vai

  1. 1As cinco fontes do gap num humanoide: atuador, atraso, atrito, massa e contato
  2. 2A política de marcha pronta do G1 (unitree_rl_lab) rodando no MuJoCo
  3. 3Sim × "real simulado": 4,7 m andados contra queda em 2,3 s
  4. 4Trocar um parâmetro por vez para achar o culpado

Objetivo: medir o gap rodando a mesma política em "sim" e "real simulado" e achar que nenhum parâmetro sozinho a derruba.

01O que o simulador simplifica

Clique em cada bloco. São as cinco fontes de gap que este curso mede.

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

Nenhuma dessas diferenças some. O sim-to-real é deixar a política robusta a elas, medir as que dá para medir e testar antes do chão.

02A política e os dois mundos

O que roda nas práticas deste curso. Clique em cada etapa.

1. A política

A Unitree publica no unitree_rl_lab uma política de marcha do G1 29 GDL já treinada no Isaac Lab e exportada em ONNX, com o arquivo de implantação deploy.yaml (ordem das juntas, kp e kd, pose padrão, escalas). Licença Apache-2.0.

Ela recebe 480 números (5 instantes de velocidade angular, gravidade projetada, comando, juntas e última ação) e devolve 29 alvos de posição a 50 Hz.

03Montar a bancada (reaproveita a do curso 0)

Se você fez o curso 0, o venv e o Menagerie já estão em ~/fth: o bloco só acrescenta o onnxruntime, o G1 no sparse-checkout e a pasta da política do unitree_rl_lab, fixada no commit testado.

Terminal · preparar ~/fth
F=${FTH:-$HOME/fth}; mkdir -p $F && cd $F
[ -d .venv ] || python3.12 -m venv .venv
. .venv/bin/activate && pip install -q mujoco==3.16.0 numpy onnxruntime==1.31.0 pyyaml
[ -d sim2real ] || git clone -q --depth 1 https://github.com/inematds/formacao-fth-sim2real-v72 sim2real
[ -d mujoco_menagerie ] || git clone -q --filter=blob:none --sparse https://github.com/google-deepmind/mujoco_menagerie
git -C mujoco_menagerie sparse-checkout add unitree_g1 && git -C mujoco_menagerie checkout -q 62ab00f
[ -d unitree_rl_lab ] || git clone -q --filter=blob:none --sparse https://github.com/unitreerobotics/unitree_rl_lab
git -C unitree_rl_lab sparse-checkout set deploy/robots/g1_29dof/config/policy/velocity
git -C unitree_rl_lab checkout -q 4960b84 && git -C unitree_rl_lab log -1 --format='unitree_rl_lab %h (%ad)' --date=short
python3 -c "import mujoco, onnxruntime; print('mujoco', mujoco.__version__, '· onnxruntime', onnxruntime.__version__)"
Exemplo do repositório
unitree_rl_lab 4960b84 (2025-11-19)
mujoco 3.16.0 · onnxruntime 1.31.0

Duas linhas e nenhum erro. A política vem do commit 4960b84 do unitree_rl_lab: fixe-o, porque um policy.onnx novo pode ter outra ordem de entradas.

04A mesma política nos dois mundos

O dois_mundos.py roda 10 s andando a 0,5 m/s em cada mundo. Queda = pelve abaixo de 0,5 m. Sai 1 se algum mundo caiu.

Terminal · sim × real simulado
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/dois_mundos.py; echo "saída: $?"
Terminal · um parâmetro por vez
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
for p in atrito massa kp atraso_ms; do python3 kit/dois_mundos.py --so $p | tail -1; done
Exemplo do repositório
política: unitree_rl_lab G1 29 GDL velocity v0 (ONNX, 480 entradas) · comando 0.50 m/s · 10 s
sim                          queda: não · andou 4.7 m em 10 s (vel. 0.47 m/s; pedida 0.50)
real simulado                queda: sim em t = 2.3 s (andou 1.9 m)
saída: 1

No sim, 4,7 m em 10 s (0,47 m/s para 0,50 pedidos). No "real simulado", queda aos 2,3 s.

05Prática

Medir o gap antes de tentar fechá-lo.

E1 · Bancada pronta

10 min

Rode o bloco de preparação. Se o curso 0 já montou ~/fth, ele só acrescenta o que falta.

Pronto quando: o bloco termina em unitree_rl_lab 4960b84 (2025-11-19) e mujoco 3.16.0 · onnxruntime 1.31.0.

E2 · O gap medido

3 min

Rode a mesma política nos dois mundos e anote quanto ela andou em cada um.

Pronto quando: python3 kit/dois_mundos.py; echo "saída: $?" → real simulado … queda: sim em t = 2.3 s e saída: 1.

E3 · Ache o culpado

5 min

Rode o laço "um parâmetro por vez" e escreva qual parâmetro sozinho mais muda o comportamento e o que muda.

Pronto quando: as 4 linhas mostram queda: não e a do kp mostra vel. 0.75 m/s; pedida 0.50; você escreveu "nenhum derruba sozinho; o kp muda a velocidade".

06Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 3

Cada parâmetro do "real simulado", sozinho, não derruba a política; os quatro juntos derrubam. O que isso ensina?competência

07Em três frases

FontesAtuador, atraso, atrito, massa e contato separam o simulador do robô.
MedidaA mesma política anda 4,7 m no sim e cai aos 2,3 s no "real simulado".
MétodoUm parâmetro por vez acha o culpado; a soma é que derruba.

Para ir além

Próxima aula