E1 · Montar a bancada
10 minRode 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.
Aula 2 · 15 min
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
Objetivo: instalar o MuJoCo 3.16 e o Menagerie e abrir o Unitree G1, lendo nq, nv e nu do próprio arquivo MJCF.
Clique em cada bloco.
Ficha do fabricante e arquivo podem divergir: a aula 8 ensina a anotar a diferença.
Clique em cada um.
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.
A base livre tem 6 velocidades (3 lineares e 3 angulares), uma a menos que as 7 posições, porque o quatérnio tem 4 números para 3 rotações.
6 + 29 = 35. É o tamanho de qvel e de qacc.
Um atuador por junta articulada. A base não tem motor: o robô só se move empurrando o chão com os pés.
Na versão com mãos (scene_with_hands.xml) o número sobe para 43. O G1 vendido tem de 23 a 43 graus de liberdade conforme a versão; o Menagerie traz a de 29.
Humanoide com base livre: nq = nu + 7 e nv = nu + 6, quando cada junta tem um motor.
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.
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__)"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.
ERRO: não achei unitree_g1/scene.xml (nem em /tmp/sem-menagerie/mujoco_menagerie). Rode a preparação da aula 2. saída: 1
Os scripts procuram o Menagerie em ~/fth/mujoco_menagerie (ou onde a variável FTH apontar). Rodou de outra pasta ou clonou em outro lugar? Ajuste a FTH ou mova a pasta.
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.
F=${FTH:-$HOME/fth}; cd $F/anatomia && . $F/.venv/bin/activate
python3 kit/abrir.py unitree_g1/scene.xml; echo "saída: $?"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<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"/>
F=${FTH:-$HOME/fth}; $F/.venv/bin/python -m mujoco.viewer --mjcf=$F/mujoco_menagerie/unitree_g1/scene.xmlmodelo: 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.
unitree_h1: nq=26 nv=25 nu=19 robotis_op3: nq=27 nv=26 nu=20 booster_t1: nq=30 nv=29 nu=23
H1 com 19 motores, OP3 com 20 (robô pequeno de 3,1 kg), Booster T1 com 23. Todos seguem nq = nu + 7.
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.
# github.com/mujocolab/mjlab — API do Isaac Lab sobre MuJoCo Warp uv run train Mjlab-Velocity-Flat-Unitree-G1 --env.scene.num-envs 4096
Bancada pronta e primeiro modelo aberto.
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.
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.
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.
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
Pergunta 2 de 4
Qual objeto muda a cada passo de simulação?
Pergunta 3 de 4
O abrir.py diz 33,3 kg; a Unitree diz cerca de 35 kg. O que fazer?
Pergunta 4 de 4
Por que fixar o MuJoCo em 3.16.0 e o Menagerie num commit?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.