FTH 0 · O corpo do humanoide|INEMA.CLUB-PRO

Aula 2 · 15 min

Abrir um humanoide no simulador

A ficha técnica de um humanoide diz o que o fabricante quer mostrar; o arquivo de simulação diz o que o corpo é. Nesta aula você instala o MuJoCo, baixa só os humanoides do MuJoCo Menagerie e abre o Unitree G1, lendo do próprio arquivo quantas coordenadas, velocidades e motores ele tem.

Começar a aula
Monitor numa bancada escura mostrando um robô humanoide em simulação 3D sobre piso quadriculado.

Nesta aula você vai

  1. 1O que há num MJCF: corpos, juntas, atuadores, sensores e poses salvas
  2. 2A bancada em ~/fth: venv, MuJoCo 3.16.0 e o Menagerie fixado num commit
  3. 3MjModel (o corpo) e MjData (o estado)
  4. 4Por que o G1 tem nq=36, nv=35 e nu=29

Objetivo: instalar o MuJoCo 3.16 e o Menagerie e abrir o Unitree G1, lendo nq, nv e nu do próprio arquivo MJCF.

01Do arquivo ao passo de simulação

Clique em cada bloco.

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

Ficha do fabricante e arquivo podem divergir: a aula 8 ensina a anotar a diferença.

02Os três números que você vai ler em todo humanoide

Clique em cada um.

1. nq = 36

A base do humanoide não está presa ao chão: é uma junta livre com 7 números (x, y, z e um quatérnio de 4 para a orientação).

Somando as 29 juntas articuladas, dá 36. É o tamanho de qpos.

03Montar a bancada (uma vez)

Venv próprio, MuJoCo fixado em 3.16.0 e o Menagerie fixado no commit testado. O sparse-checkout baixa só 4 humanoides (cerca de 150 MB) em vez do repositório inteiro.

Terminal · preparar ~/fth
F=${FTH:-$HOME/fth}; mkdir -p $F && cd $F
python3.12 -m venv .venv && . .venv/bin/activate
pip install -q mujoco==3.16.0 numpy
[ -d anatomia ] || git clone -q --depth 1 https://github.com/inematds/formacao-fth-anatomia-v72 anatomia
[ -d mujoco_menagerie ] || git clone -q --filter=blob:none --sparse https://github.com/google-deepmind/mujoco_menagerie
cd mujoco_menagerie && git sparse-checkout set unitree_g1 unitree_h1 robotis_op3 booster_t1
git checkout -q 62ab00f && git log -1 --format='menagerie %h (%ad)' --date=short
python3 -c "import mujoco, numpy; print('mujoco', mujoco.__version__, '· numpy', numpy.__version__)"
Exemplo do repositório
menagerie 62ab00f (2026-10-15)
mujoco 3.16.0 · numpy 2.5.4

Duas linhas e nenhum erro. Se a versão do MuJoCo for outra, os números das próximas aulas podem mudar na última casa: fixe a versão.

04Abrir o G1 e os outros humanoides

O abrir.py só lê o modelo e imprime o tamanho dele. O trecho do g1.xml mostra de onde vêm os números.

Terminal · abrir o G1
F=${FTH:-$HOME/fth}; cd $F/anatomia && . $F/.venv/bin/activate
python3 kit/abrir.py unitree_g1/scene.xml; echo "saída: $?"
Terminal · H1, OP3 e Booster T1
F=${FTH:-$HOME/fth}; cd $F/anatomia && . $F/.venv/bin/activate
for r in unitree_h1 robotis_op3 booster_t1; do
  echo "$r: $(python3 kit/abrir.py $r/scene.xml | sed -n 2p)"
done
Trecho de mujoco_menagerie/unitree_g1/g1.xml (commit 62ab00f)
<option integrator="implicitfast"/>
<default class="g1">
  <joint armature="0.01" frictionloss="0.3"/>
  <position kp="500" dampratio="1" inheritrange="1"/>
</default>
<!-- ... -->
<joint name="left_knee_joint" axis="0 1 0" range="-0.087267 2.8798" actuatorfrcrange="-139 139"/>
<!-- ... -->
<position class="g1" name="left_knee_joint" joint="left_knee_joint"/>
Opcional · com tela: ver o robô
F=${FTH:-$HOME/fth}; $F/.venv/bin/python -m mujoco.viewer --mjcf=$F/mujoco_menagerie/unitree_g1/scene.xml
Exemplo do repositório
modelo: g1_29dof_rev_1_0 scene · arquivo unitree_g1/scene.xml
nq=36 nv=35 nu=29
juntas: 30 (1 base flutuante + 29 articuladas) · corpos: 30 · sensores: 4
massa total do modelo: 33.3 kg · passo de simulação: 2 ms
poses salvas (keyframes): stand
altura da base na pose inicial: 0.79 m
saída: 0

33,3 kg no modelo contra cerca de 35 kg na ficha da Unitree: o arquivo de simulação é uma aproximação do robô real.

05O que se usa em escala (mostrado)

Para treinar políticas com milhares de robôs em paralelo, os mesmos modelos rodam em GPU NVIDIA. Não é pré-requisito deste curso: o curso 1 da formação usa.

Mostrado · mjlab, GPU NVIDIA (não rodado aqui)
# github.com/mujocolab/mjlab — API do Isaac Lab sobre MuJoCo Warp
uv run train Mjlab-Velocity-Flat-Unitree-G1 --env.scene.num-envs 4096

06Prática

Bancada pronta e primeiro modelo aberto.

E1 · Montar a bancada

10 min

Rode o bloco "preparar ~/fth". Se faltar o python3.12, instale pelo gerenciador do seu sistema (o curso foi testado com Python 3.12.3).

Pronto quando: a saída mostra menagerie 62ab00f (2026-10-15) e mujoco 3.16.0.

E2 · Abrir o G1

3 min

Rode o bloco "abrir o G1" e explique, com as suas palavras, de onde vem cada número da segunda linha.

Pronto quando: python3 kit/abrir.py unitree_g1/scene.xml → nq=36 nv=35 nu=29 e saída: 0.

E3 · O G1 com mãos

5 min

Abra unitree_g1/scene_with_hands.xml com o mesmo script e confira a regra nq = nu + 7.

Pronto quando: python3 kit/abrir.py unitree_g1/scene_with_hands.xml | sed -n 2p → nq=50 nv=49 nu=43.

07Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 4

Por que o G1 tem nq=36 e não 29?competência

08Em três frases

ArquivoO MJCF descreve corpo, juntas, atuadores, sensores e poses.
NúmerosBase livre: nq = nu + 7 e nv = nu + 6.
Bancada~/fth com MuJoCo 3.16.0 e Menagerie 62ab00f, fixados.

Para ir além

Aula anteriorPróxima aula