E1 · Ambiente del GMR
10 minEjecuta 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.
Clase 3 · 15 min
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
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.
Haz clic en cada bloque. GMR repite esto para cada cuadro del clip.
GMR corre en la CPU, en tiempo real según el artículo (ICRA 2026); aquí, 10 s de clip en pocos segundos.
Haz clic en cada punto.
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.
En el commit bb1bbe4 (02/04/2026), el setup.py pide, entre otros, proxqp, smplx y redis, pero el retargeting de BVH usa el solver daqp (predeterminado en el código) y no necesita los demás.
Cuando el código y la lista de dependencias no coinciden, vale el código: el curso instala el GMR con --no-deps y fija a mano solo lo que se ejecuta.
Un ambiente por herramienta y versiones fijadas por proyecto. BeyondMimic fija Isaac Lab 2.1.0; mjlab usa MuJoCo Warp con uv; en un solo ambiente, uno rompe al otro.
El modelo del G1 que usa el GMR (g1_mocap_29dof.xml) tiene el mismo orden de articulaciones que Menagerie, pero límites más estrechos en 15 de las 29 articulaciones (medido el 19/10/2026).
Como el retargeting respeta los límites del GMR, el resultado cabe en los de Menagerie. Lo contrario no valdría: comprueba siempre en el modelo que vas a ejecutar.
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).
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
Una línea con las cuatro versiones. El GMR instalado en modo editable apunta a la carpeta ~/fth/GMR.
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.
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 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.
ERRO: o GMR não está neste ambiente (No module named 'general_motion_retargeting'). Ative ~/fth/.venv-gmr (aula 3). saída: 2
Se ejecutó con el .venv de MuJoCo activo. El GMR solo existe en el .venv-gmr: actívalo (. ~/fth/.venv-gmr/bin/activate) y ejecuta de nuevo.
Instalar, hacer retargeting, comprobar.
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.
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.
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.
La explicación aparece después de tu respuesta.
Pregunta 1 de 3
¿Por qué el curso instala el GMR con --no-deps?competencia
Pregunta 2 de 3
El retargeting dio 0 violaciones en los límites de Menagerie. ¿Por qué eso no es suerte?
Pregunta 3 de 3
El qpos de cada fotograma tiene 36 números. ¿Qué son los 7 primeros?
Elige una alternativa. La explicación aparece después de tu intento.