FTH 3 · Corpo inteiro|INEMA.CLUB-PRO

Aula 3 · 15 min

Retargeting: do esqueleto humano ao robô

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
Pessoa de roupa de captura com os braços levantados ao lado de um robô humanoide de visor escuro na mesma pose.

Nesta aula você vai

  1. 1O que o retargeting resolve: escala, juntas diferentes e limites
  2. 2Um ambiente por ferramenta: o .venv-gmr com versões fixadas
  3. 3IK por quadro com o mink: pontos do humano viram alvos do robô
  4. 4Por que o limite depende do arquivo do robô

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.

01Um quadro de retargeting

Clique em cada bloco. O GMR repete isto para cada quadro do clipe.

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

O GMR roda na CPU, em tempo real segundo o artigo (ICRA 2026); aqui, 10 s de clipe em poucos segundos.

02Por que um ambiente só para o GMR

Clique em cada ponto.

1. torch

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.

03Instalar o GMR no .venv-gmr

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).

Terminal · ambiente do GMR
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=' · ')"
Exemplo do repositório
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.

0410 s de boxe no G1

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.

Terminal · retargeting
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: $?"
Trecho · kit/retarget.py
    folga = np.deg2rad(FOLGA_GRAUS)
    fora = (q < lo - folga) | (q > hi + folga)
Exemplo do repositório
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.

05Prática

Instalar, retargetar, conferir.

E1 · Ambiente do GMR

10 min

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.

E2 · Retargeting sem violação

5 min

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.

E3 · Outro trecho

5 min

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.

06Teste da aula

A explicação aparece depois da sua resposta.

Pergunta 1 de 3

Por que o curso instala o GMR com --no-deps?competência

07Em três frases

IK por quadroEscala o humano e resolve a pose do robô quadro a quadro.
AmbienteUm venv por ferramenta, versões fixadas, dependências pelo código.
LimitesConfira no modelo que vai executar, não no que gerou.

Para ir além

Aula anteriorPróxima aula