PTENES
MÓDULO 2.3

🖥️ Simuladores: MuJoCo, Isaac Sim, PyBullet

Entrena robots sin romper nada: simulación física de alta fidelidad para VLA. MuJoCo a 2.7M steps/s, Isaac Sim con ray-tracing a 94k FPS y PyBullet para prototipado rápido: cada uno tiene su propio nicho.

MuJoCo 2.7M steps/s Contacto suave DeepMind / Google Estándar académico Apache 2 · Código abierto Isaac Sim 94k FPS ray-tracing PhysX 5 + Omniverse NVIDIA · Domain random. Entrenamiento de GR00T N1 Gratis (NVIDIA developer) PyBullet pip install pybullet Bullet Physics Sin GPU dedicada Prototipado rápido zlib · Open-source 🤖 Robot real Velocidad Fidelidad Accesibilidad
6
Temas
35
Minutos
Técnico
Nivel
Práctica
Tipo

Contenido detallado

1

⚡ MuJoCo: 2.7M steps/s, el estándar académico

El simulador de física más rápido para entrenar RL y políticas VLA en CPU.

Concepto principal

MuJoCo (Multi-Joint dynamics with Contact) es un motor de física optimizado para simular el contacto entre cuerpos rígidos y articulaciones. Google DeepMind lo adquirió en 2021 y lo liberó como open-source (Apache 2); procesa 2.7 millones de steps por segundo en CPU — lo que hace viable entrenar políticas VLA con millones de episodios en horas.

✓ Cuándo usar MuJoCo

  • ✓ Reproducir papers académicos (dm_control, Gymnasium)
  • ✓ Entrenar RL a gran escala en CPU
  • ✓ Simular manipulación con contacto suave y preciso
  • ✓ Usar MJX para GPU paralela (JAX backend)

✗ Cuándo NO usar MuJoCo

  • ✗ Necesidad de renderizado fotorrealista para sim-to-real visual
  • ✗ Simular sensores LiDAR/cámara depth nativos
  • ✗ Integrar directamente con ROS2 sin bridge
  • ✗ Simular fluidos o materiales deformables
MJCF
Formato XML de modelos
qpos/qvel
Estado generalizado
MJX
MuJoCo en JAX/GPU
Contactos suaves
Contacto suave estable
2

🎮 NVIDIA Isaac Sim: 94k FPS, trazado de rayos

Simulación fotorrealista para sim-to-real de alta fidelidad: el entorno de GR00T N1.

📊

El número que importa: 94.000 FPS

Isaac Sim ejecuta la 94.000 fotogramas por segundo con ray tracing en una GPU NVIDIA A100. Esto significa que 1 hora de GPU equivale a ~26 horas de simulación en tiempo real, lo que hace posible la domain randomization con texturas fotorrealistas a gran escala. El GR00T N1 de NVIDIA se entrenó por completo en este entorno.

Isaac Sim es la plataforma de simulación robótica de NVIDIA, construida sobre Omniverse y PhysX 5. Ofrece renderizado fotorrealista en tiempo real y puede simular miles de robots en paralelo usando GPU.

Evolución de la plataforma

2020

Isaac Gym (descontinuado)

Primer entorno de RL masivamente paralelo en GPU de NVIDIA. Precursor de Isaac Sim, sin renderizado fotorrealista.

2022

Isaac Sim + Omniverse

Integración con USD (Universal Scene Description) y ray tracing RTX en tiempo real. PhysX 5 con simulación acelerada por GPU.

2024

Isaac Lab + GR00T N1

Framework unificado de RL/IL sobre Isaac Sim. Entorno de entrenamiento del modelo GR00T N1 — foundation model humanoide de NVIDIA.

Omniverse USD
Formato universal de escenas 3D
PhysX 5
Física acelerada por GPU
Isaac Lab
Framework unificado de RL/IL
OmniGraph
Lógica visual (grafo de nodos)
ROS2 bridge
Integración nativa con ROS2
RTX ray-tracing
94k FPS en A100
3

🐍 PyBullet: ligero y de código abierto

Un simulador funcional en cualquier laptop — el camino más rápido para ejecutar tu primera política.

Inicio rápido con PyBullet

import pybullet as p
import pybullet_data

# 1. Conectar ao simulador
p.connect(p.GUI)  # ou p.DIRECT para headless
p.setAdditionalSearchPath(pybullet_data.getDataPath())

# 2. Configurar física
p.setGravity(0, 0, -9.81)
plane = p.loadURDF("plane.urdf")

# 3. Carregar robô
robot = p.loadURDF("kuka/kuka.urdf", basePosition=[0, 0, 0])

# 4. Loop de simulação
for _ in range(1000):
    p.stepSimulation()
    joint_state = p.getJointState(robot, 0)

p.disconnect()

PyBullet es el wrapper de Python de Bullet Physics Engine. Con un simple pip install pybullet, tienes simulación 3D con cargador URDF, detección de colisiones y restricciones: ideal para crear prototipos de políticas antes de migrar a simuladores más pesados.

💡

Consejo: headless para entrenamiento

Usa p.connect(p.DIRECT) en lugar de p.GUI para entrenar sin pantalla: hasta 10× más rápido porque no renderiza frames. Reserva la GUI para la depuración visual.

URDF
Descripción del robot en XML
loadURDF()
Carga un modelo 3D
stepSimulation()
Avanza 1 timestep
pybullet_envs
Wrappers de Gymnasium
4

🔗 Gazebo + ROS2: integración nativa

El simulador que habla ROS2 de forma nativa: el código de simulación y el del robot real son casi idénticos.

Gazebo (gz-sim) 📷 Camera plugin 📡 Plugin de LiDAR 🧲 IMU plugin Archivos de mundo SDF Simulación de sensores reales ros_gz_bridge Gz ↔ ROS2 Topics ROS2 Nodes 🧠 nodo de inferencia VLA 🔄 TF2 transformer 🦾 planificador de MoveIt2 🤖 ros2_control Mismo código → robot real

Gazebo (ahora "Gz") es el simulador integrado al ecosistema ROS2. A diferencia de MuJoCo (enfocado en RL), Gazebo simula sensores reales —cámaras depth, LiDAR, IMU— y se comunica con ROS2 de forma nativa mediante topics a través de ros_gz_bridge.

✓ Ventajas de Gazebo

  • ✓ Código ROS2 idéntico en la simulación y en el robot real
  • ✓ Sensores virtuales (cámara, LiDAR, IMU) integrados
  • ✓ Gazebo Fuel: repositorio de modelos 3D listos para usar
  • ✓ Integración nativa con Nav2 y MoveIt2

✗ Limitaciones

  • ✗ Más lento que MuJoCo para RL a escala
  • ✗ Renderizado no fotorrealista (vs Isaac Sim)
  • ✗ Configuración que requiere más trabajo (SDF + plugins)
  • ✗ Gzebo clásico vs Gz (incompatibilidades)
SDF
Formato de descripción de simulación
ros_gz_bridge
Gz ↔ ROS2 topics
Gz Fuel
Repositorio de modelos
iniciar servicio
Spawn mediante servicio ROS2
5

🎲 Domain Randomization: variabilidad para la transferencia

La técnica que hizo posible el primer sim-to-real exitoso a gran escala.

Concepto central

Domain randomization varía aleatoriamente parámetros del simulador — texturas, iluminación, masas, fricción, colores — durante el entrenamiento. La política aprende a ser robusta ante las variaciones en vez de memorizar el entorno perfecto de la simulación. Fue la técnica que permitió a OpenAI enseñar a un robot a resolver el cubo de Rubik en 2019.

Tipos de aleatorización

👁️

Aleatorización visual

Varía las texturas de los objetos, el color del fondo, la posición y la intensidad de las luces y el tipo de cámara. La política no debe depender de colores específicos para reconocer un objeto.

⚖️

Aleatorización de la física

Varía la masa de los objetos, el coeficiente de fricción, el damping de las articulaciones y la latencia del actuador. Simula la imprecisión del mundo real, donde los parámetros físicos nunca son exactos.

📈

ADR — Automatic Domain Randomization

Curriculum automático: empieza con variaciones pequeñas y las aumenta progresivamente a medida que mejora la política. Implementado por OpenAI para el proyecto Dactyl (mano robótica).

💡

Consejo: empieza de forma sencilla y escala después

No aleatorices todo de una vez: la política puede no converger. Empieza con una aleatorización visual mínima (color del fondo), valida que la política siga aprendiendo y luego agrega física. Usa ADR para automatizar este curriculum.

Visual aleatorio.
Texturas y luz
Aleatorización de la física
Masa y fricción
ADR
Curriculum automático
Reality gap
Diferencia entre simulación y realidad
6

🔄 Sim-to-sim: validación antes de llevarlo al mundo real

Prueba en 2 simuladores diferentes antes de arriesgar hardware costoso: una validación económica y poderosa.

Sim-to-sim es la práctica de transferir una política entrenada en un simulador (p. ej., MuJoCo) a otro simulador con una física diferente (p. ej., Isaac Sim) como etapa intermedia. Si la política falla en otro simulador, fallará en el robot real, pero lo descubriste sin romper nada.

Conversión de formatos de robot

# URDF → MJCF (MuJoCo)
python -m mujoco.mjcf.convert robot.urdf robot.xml

# URDF → USD (Isaac Sim / Omniverse)
from omni.isaac.urdf import _urdf
urdf_interface = _urdf.acquire_urdf_interface()
urdf_interface.parse_urdf(urdf_path, dest_path)

# Benchmark cross-simulator com SIMPLER
python eval_simpler.py \
  --policy checkpoint.pt \
  --env SimplerEnv-MuJoCo \
  --n_eval_episodes 50

# Mesmo benchmark em Isaac Sim
python eval_simpler.py \
  --policy checkpoint.pt \
  --env SimplerEnv-IsaacSim \
  --n_eval_episodes 50

✓ Señales de una política robusta

  • ✓ Tasa de éxito similar en MuJoCo e Isaac Sim
  • ✓ Comportamiento consistente con diferentes texturas
  • ✓ Los intervalos de tolerancia se superponen entre simuladores
  • ✓ Los fallos se distribuyen aleatoriamente, no son sistemáticos

✗ Señales de sobreajuste a la simulación

  • ✗ 90% de éxito en MuJoCo, 20% en Isaac Sim
  • ✗ La política se detiene en el mismo frame cada vez en la 2.ª simulación
  • ✗ Fallos consistentes al cambiar la textura del objeto
  • ✗ Comportamiento diferente con el mismo URDF/MJCF
💡

Protocolo mínimo de validación

Usa siempre N ≥ 50 episodios por entorno para calcular intervalos de confianza (95%). Con N < 20, la variabilidad es tan alta que puedes confundir la suerte con la robustez. Graba videos de los episodios fallidos: revelan patrones que las métricas no capturan.

SIMPLER
Benchmark cross-sim
N episodios
Mín. 50 para CI
URDF/MJCF
Conversión de formatos
Brecha física
Diferencia entre sims

✅ Resumen del módulo

✓
MuJoCo = velocidad — 2.7M pasos/s en CPU, estándar académico, requisito previo para reproducir papers de RL y benchmarks Gymnasium.
✓
Isaac Sim = fidelidad — 94k FPS con ray-tracing, PhysX 5 e integración nativa con ROS2; la opción para sim-to-real visual de alta calidad.
✓
Domain randomization es obligatoria — sin variar texturas, masas e iluminación, las políticas presentan overfitting en la simulación y fallan catastróficamente en el mundo real.
✓
Sim-to-sim antes del mundo real — valida en 2+ simuladores con N ≥ 50 episodios antes de arriesgar hardware costoso; las fallas sistemáticas revelan fragilidades.

Siguiente módulo

2.4 — ROS2: middleware para robótica real