E1 · Ambiente do GMR
10 minRode o bloco de instalação e confirme as versões.
Pronto quando: ~/fth/.venv-gmr/bin/python -c "import general_motion_retargeting" 2>/dev/null; echo "saída: $?" → saída: 0.
Aula 3 · 15 min
Uma pessoa tem 1,70 m e juntas que o robô não tem; o G1 tem 1,32 m e, no modelo do Menagerie, 29 juntas com limites. Retargeting é a conta que leva um ao outro, quadro a quadro. Nesta aula você instala o GMR num ambiente próprio, leva 10 s de boxe para o G1 e confere cada quadro nos limites das juntas.
Começar a aula
Objetivo: levar um clipe humano para o G1 com o GMR num ambiente próprio e conferir que nenhum quadro passa do limite das juntas.
Clique em cada bloco. O GMR repete isto para cada quadro do clipe.
O GMR roda na CPU, em tempo real segundo o artigo (ICRA 2026); aqui, 10 s de clipe em poucos segundos.
Clique em cada ponto.
O pacote do GMR importa o PyTorch logo ao ser carregado (o modelo cinemático usa tensores), mesmo para retargeting de BVH. Pôr torch no .venv das práticas de MuJoCo deixaria o ambiente pesado à toa.
Solução: um .venv-gmr só para ele, com o torch de CPU do índice oficial do PyTorch.
No commit bb1bbe4 (02/04/2026), o setup.py pede, entre outros, proxqp, smplx e redis, mas o retargeting de BVH usa o solver daqp (padrão no código) e não precisa dos outros.
Quando código e lista de dependências divergem, vale o código: o curso instala o GMR com --no-deps e fixa à mão só o que roda.
Um ambiente por ferramenta e versões fixadas por projeto. O BeyondMimic fixa o Isaac Lab 2.1.0; o mjlab usa o MuJoCo Warp com uv; num ambiente só, um quebra o outro.
O modelo do G1 que o GMR usa (g1_mocap_29dof.xml) tem a mesma ordem de juntas do Menagerie, mas limites mais apertados em 15 das 29 juntas (medido em 19/10/2026).
Como o retargeting respeita os limites do GMR, o resultado cabe nos do Menagerie. O contrário não valeria: confira sempre no modelo que vai executar.
Acrescenta ao clone do GMR só o código e o modelo do G1 (sparse-checkout add), cria o segundo ambiente e fixa as versões testadas. Primeira vez: o ambiente inteiro ocupou 1,2 GB numa bancada nova, quase tudo do torch de CPU (medido em 19/10/2026).
F=${FTH:-$HOME/fth}; cd $F/GMR
git sparse-checkout add general_motion_retargeting scripts assets/unitree_g1
cd $F && [ -d .venv-gmr ] || python3.12 -m venv .venv-gmr
. .venv-gmr/bin/activate
pip install -q --index-url https://download.pytorch.org/whl/cpu torch==2.14.1
pip install -q mujoco==3.16.0 numpy==2.5.4 scipy==1.18.1 mink==1.3.0 qpsolvers==4.13.0 daqp==0.10.3 rich tqdm loop_rate_limiters imageio
pip install -q --no-deps -e GMR
python3 -c "from importlib.metadata import version as v; print(*[f'{p} {v(p)}' for p in ('torch', 'mink', 'mujoco', 'general_motion_retargeting')], sep=' · ')"torch 2.14.1+cpu · mink 1.3.0 · mujoco 3.16.0 · general_motion_retargeting 0.2.0
Uma linha com as quatro versões. O GMR instalado em modo editável aponta para a pasta ~/fth/GMR.
O retarget.py lê o BVH como o script do GMR para Xsens faz (sem a interface gráfica dele), chama o GMR quadro a quadro e confere cada quadro nos limites do G1 do Menagerie.
F=${FTH:-$HOME/fth}; cd $F/corpo-inteiro && . $F/.venv-gmr/bin/activate
python3 kit/retarget.py $F/GMR/assets/xsens_bvh_test/251021_04_boxing_120Hz_cm_3DsMax.bvh --fim 1200 --nome boxe_g1; echo "saída: $?" folga = np.deg2rad(FOLGA_GRAUS)
fora = (q < lo - folga) | (q > hi + folga)clipe: 251021_04_boxing_120Hz_cm_3DsMax.bvh · 1200 quadros a 120 Hz (10.0 s) · 28 pontos do esqueleto altura do humano no clipe: 1.67 m · robô: unitree_g1 (GMR, config bvh_xsens_to_g1.json) qpos: 1200 × 36 (base 7 + 29 juntas, mesma ordem do Menagerie) menor margem até o limite: right_ankle_roll_joint (0.0°, 0 = encostado) violações de limite (Menagerie, folga 0.5°): 0 tempo de retargeting: menos de 1 min em CPU gravado: ~/fth/movimentos/boxe_g1.npz saída: 0
1200 quadros, nenhuma violação. A menor margem é o tornozelo encostado no limite: um pé plano no chão leva o tornozelo ao fim do curso.
ERRO: o GMR não está neste ambiente (No module named 'general_motion_retargeting'). Ative ~/fth/.venv-gmr (aula 3). saída: 2
Rodou com o .venv do MuJoCo ativo. O GMR só existe no .venv-gmr: ative-o (. ~/fth/.venv-gmr/bin/activate) e rode de novo.
Instalar, retargetar, conferir.
Rode o bloco de instalação e confirme as versões.
Pronto quando: ~/fth/.venv-gmr/bin/python -c "import general_motion_retargeting" 2>/dev/null; echo "saída: $?" → saída: 0.
Rode o retargeting dos 10 s de boxe.
Pronto quando: python3 kit/retarget.py ~/fth/GMR/assets/xsens_bvh_test/251021_04_boxing_120Hz_cm_3DsMax.bvh --fim 1200 --nome boxe_g1 → violações de limite (Menagerie, folga 0.5°): 0 e saída: 0.
Retargete do quadro 1200 ao 2400 com --inicio 1200 --fim 2400 --nome boxe_trecho2 e compare a menor margem com a do primeiro trecho.
Pronto quando: ls ~/fth/movimentos/boxe_trecho2.npz → o arquivo existe, e a saída do retarget termina em saída: 0.
A explicação aparece depois da sua resposta.
Pergunta 1 de 3
Por que o curso instala o GMR com --no-deps?competência
Pergunta 2 de 3
O retargeting deu 0 violações nos limites do Menagerie. Por que isso não é sorte?
Pergunta 3 de 3
O qpos de cada quadro tem 36 números. O que são os 7 primeiros?
Escolha uma alternativa. A explicação aparece depois da sua tentativa.