FTH 2 · Del simulador al suelo|INEMA.CLUB-PRO

Clase 6 · 18 min

Sim2sim como compuerta (gate) antes del robot

Antes de cualquier robot, la policy tiene que pasar por un segundo simulador y por el mismo camino de mensajes que usa el robot. Es el flujo oficial de unitree_rl_lab: entrenar en Isaac Lab, validar en unitree_mujoco y solo después el G1. En esta clase armas esa compuerta (gate) en tres etapas, con DDS de verdad, y ves el error que más derriba policies en esa travesía.

Empezar la clase
Dos monitores lado a lado con el mismo robot humanoide simulado caminando y un switch de red entre ellos.

En esta clase vas a

  1. 1Las tres etapas de la compuerta (gate) y el criterio de cada una
  2. 2unitree_mujoco + unitree_sdk2_python + CycloneDDS: rt/lowcmd y rt/lowstate
  3. 3El error número 1: el orden de las articulaciones (joint_ids_map)
  4. 4Aviso que es del simulador, no de la policy

Objetivo: pasar la policy por una compuerta (gate) de tres etapas: otro modelo del robot y el camino DDS de mensajes del fabricante.

01La compuerta (gate) en tres etapas

Haz clic en cada bloque. Si reprueba en una etapa, no sube.

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

Un estudio de 2026 con el G1 en acciones de obra de construcción evaluó cada acción en dos motores de física antes del robot, y solo las que pasaron fueron al G1 físico (arXiv 2608.01600, según robotica-real2sim, verificado el 14/10/2026).

02Lo que la travesía suele romper

Hallazgos reales del armado de esta compuerta (gate) (19/10/2026). Haz clic en cada uno.

1. Orden de las articulaciones

Isaac Lab ordena las articulaciones de una manera; el SDK del robot, de otra. El deploy.yaml trae el mapa (joint_ids_map), y cada lista viene en un orden: kp y kd en el orden del robot, pose por defecto y acciones en el orden de Isaac Lab.

Equivocarse en esto derriba al robot en 1 s, en los dos simuladores (error común abajo).

03Preparar el camino del fabricante (una sola vez)

CycloneDDS 0.10.2, unitree_sdk2_python y unitree_mujoco, fijados en los commits probados. Necesitas cmake y un compilador C si pip no encuentra wheel.

Terminal · DDS + SDK + simulador de Unitree
F=${FTH:-$HOME/fth}; cd $F && . .venv/bin/activate
pip install -q cyclonedds==0.10.2 2>/dev/null || {
  [ -d cyclonedds ] || git clone -q --filter=blob:none -b releases/0.10.x https://github.com/eclipse-cyclonedds/cyclonedds
  git -C cyclonedds checkout -q 5041f35
  cmake -S cyclonedds -B cyclonedds/build -DCMAKE_INSTALL_PREFIX=$F/cyclonedds/install -DBUILD_EXAMPLES=OFF > /dev/null
  cmake --build cyclonedds/build --target install -j 4 > /dev/null 2>&1
  export CYCLONEDDS_HOME=$F/cyclonedds/install && pip install -q cyclonedds==0.10.2; }
git -C cyclonedds log -1 --format="cyclonedds (C) %H (%ad)" --date=short 2>/dev/null | sed -E 's/([0-9a-f]{7})[0-9a-f]{33}/\1/'
[ -d unitree_sdk2_python ] || git clone -q https://github.com/unitreerobotics/unitree_sdk2_python
git -C unitree_sdk2_python checkout -q 814556d && pip install -q -e unitree_sdk2_python pygame
[ -d unitree_mujoco ] || git clone -q https://github.com/unitreerobotics/unitree_mujoco
git -C unitree_mujoco checkout -q 1eb6642 && git -C unitree_mujoco log -1 --format='unitree_mujoco %h (%ad)' --date=short
python3 -c "import importlib.metadata as m, unitree_sdk2py; print('cyclonedds', m.version('cyclonedds'), '· unitree_sdk2py ok')"
Ejemplo del repositorio
cyclonedds (C) 5041f35 (2026-03-22)
unitree_mujoco 1eb6642 (2026-09-07)
cyclonedds 0.10.2 · unitree_sdk2py ok

Tres líneas. La primera vez en esta máquina (aarch64), la compilación de CycloneDDS tardó de 1 a 2 minutos.

04Correr la compuerta (gate)

Sin --dds, las etapas 1 y 2 (determinísticas, ~1 min). Con --dds, la etapa 3 en tiempo real. --passo cambia el paso de unitree_mujoco.

Terminal · etapas 1 y 2 (paso de 5 ms de unitree_mujoco)
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/portao_sim2sim.py; echo "saída: $?"
Terminal · las tres etapas, con DDS
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/portao_sim2sim.py --passo 0.001 --dds 2>/dev/null; echo "saída: $?"
Terminal · el error común: orden de las articulaciones
F=${FTH:-$HOME/fth}; cd $F/sim2real && . $F/.venv/bin/activate
python3 kit/portao_sim2sim.py --ordem sdk; echo "saída: $?"
Ejemplo del repositorio
política: unitree_rl_lab velocity v0 · ordem das juntas: isaac · 0.5 m/s por 10 s
1 Menagerie (MuJoCo, PD no MJCF)     passou · andou 4.7 m
2 unitree_mujoco (passo 5 ms)        passou · andou 4.8 m
                                     aviso: braços no limite de torque em 99% do tempo
PORTÃO: passou (2 de 2 etapas)
saída: 0

Pasó, con el aviso de los brazos en el paso de 5 ms.

05Práctica

Nada va al robot sin pasar por aquí.

E1 · Camino del fabricante listo

10 min

Corre la preparación de DDS, del SDK y de unitree_mujoco.

Listo cuando: el bloque termina en cyclonedds 0.10.2 · unitree_sdk2py ok.

E2 · Compuerta (gate) con DDS

3 min

Corre las tres etapas con paso de 1 ms.

Listo cuando: python3 kit/portao_sim2sim.py --passo 0.001 --dds 2>/dev/null; echo "saída: $?" → PORTÃO: passou (3 de 3 etapas) y saída: 0.

E3 · La compuerta detecta el error

3 min

Corre con el orden de las articulaciones equivocado y anota en qué etapa y en cuánto tiempo reprueba.

Listo cuando: python3 kit/portao_sim2sim.py --ordem sdk; echo "saída: $?" → PORTÃO: reprovou — caiu em t = 1.0 s y saída: 1.

06Prueba de la clase

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

Pregunta 1 de 4

¿Por qué la etapa 3 corre el robot en un proceso separado y se comunica por DDS?competencia

07En tres frases

Compuerta (gate)Menagerie, unitree_mujoco y DDS en tiempo real: tres etapas, mismos criterios.
Error n.º 1El orden de articulaciones equivocado lo tira en 1 s; revisa el joint_ids_map.
AvisoSepara lo que es del simulador (paso, integrador) de lo que es de la policy.

Para ir más allá

Clase anteriorSiguiente clase