FTH 3 · Cuerpo completo|INEMA.CLUB-PRO

Clase 3 · 15 min

Retargeting: del esqueleto humano al robot

Una persona mide 1,70 m y tiene articulaciones que el robot no tiene; el G1 mide 1,32 m y, en el modelo de Menagerie, tiene 29 articulaciones con límites. El retargeting es la cuenta que lleva de uno a otro, cuadro a cuadro. En esta clase instalas GMR en un entorno propio, llevas 10 s de boxeo al G1 y verificas cada cuadro contra los límites de las articulaciones.

Comenzar la clase
Persona con ropa de captura con los brazos levantados junto a un robot humanoide de visor oscuro en la misma pose.

En esta clase vas a

  1. 1Lo que resuelve el retargeting: escala, articulaciones distintas y límites
  2. 2Un entorno por herramienta: el .venv-gmr con versiones fijadas
  3. 3IK por cuadro con mink: los puntos del humano se vuelven objetivos del robot
  4. 4Por qué el límite depende del archivo del robot

Objetivo: llevar un clip humano al G1 con GMR en un entorno propio y comprobar que ningún cuadro pasa del límite de las articulaciones.

01Un cuadro de retargeting

Haz clic en cada bloque. GMR repite esto para cada cuadro del clip.

Haz clic en cada bloque del diagrama para ver qué hace.

GMR corre en la CPU, en tiempo real según el artículo (ICRA 2026); aquí, 10 s de clip en pocos segundos.

02Por qué un entorno solo para GMR

Haz clic en cada punto.

1. torch

El paquete de GMR importa PyTorch apenas se carga (el modelo cinemático usa tensores), incluso para retargeting de BVH. Poner torch en el .venv de las prácticas de MuJoCo volvería el entorno pesado sin necesidad.

Solución: un .venv-gmr solo para él, con el torch de CPU del índice oficial de PyTorch.

03Instalar el GMR en el .venv-gmr

Agrega al clon de GMR solo el código y el modelo del G1 (sparse-checkout add), crea el segundo entorno y fija las versiones probadas. Primera vez: el entorno completo ocupó 1,2 GB en una mesa de trabajo nueva, casi todo del torch de CPU (medido el 19/10/2026).

Terminal · ambiente del 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=' · ')"
Ejemplo del repositorio
torch 2.14.1+cpu · mink 1.3.0 · mujoco 3.16.0 · general_motion_retargeting 0.2.0

Una línea con las cuatro versiones. El GMR instalado en modo editable apunta a la carpeta ~/fth/GMR.

0410 s de boxeo en el G1

El retarget.py lee el BVH como lo hace el script del GMR para Xsens (sin su interfaz gráfica), llama al GMR cuadro a cuadro y comprueba cada cuadro contra los límites del G1 de 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: $?"
Fragmento · kit/retarget.py
    folga = np.deg2rad(FOLGA_GRAUS)
    fora = (q < lo - folga) | (q > hi + folga)
Ejemplo del repositorio
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 cuadros, ninguna violación. El menor margen es el tobillo pegado al límite: un pie plano en el suelo lleva el tobillo al final del recorrido.

05Práctica

Instalar, hacer retargeting, comprobar.

E1 · Ambiente del GMR

10 min

Ejecuta el bloque de instalación y confirma las versiones.

Listo cuando: ~/fth/.venv-gmr/bin/python -c "import general_motion_retargeting" 2>/dev/null; echo "saída: $?" → saída: 0.

E2 · Retargeting sin violación

5 min

Ejecuta el retargeting de los 10 s de boxeo.

Listo cuando: 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 y saída: 0.

E3 · Otro tramo

5 min

Haz retargeting del cuadro 1200 al 2400 con --inicio 1200 --fim 2400 --nome boxe_trecho2 y compara el menor margen con el del primer tramo.

Listo cuando: ls ~/fth/movimentos/boxe_trecho2.npz → el archivo existe, y la salida del retarget termina en saída: 0.

06Prueba de la clase

La explicación aparece después de tu respuesta.

Pregunta 1 de 3

¿Por qué el curso instala el GMR con --no-deps?competencia

07En tres frases

IK por fotogramaEscala al humano y resuelve la pose del robot fotograma a fotograma.
EntornoUn venv por herramienta, versiones fijadas, dependencias a través del código.
LímitesVerifica en el modelo que va a ejecutar, no en el que lo generó.

Para ir más allá

Clase anteriorSiguiente clase