🖥️ 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.
Contenido detallado
⚡ 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
🎮 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
Isaac Gym (descontinuado)
Primer entorno de RL masivamente paralelo en GPU de NVIDIA. Precursor de Isaac Sim, sin renderizado fotorrealista.
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.
Isaac Lab + GR00T N1
Framework unificado de RL/IL sobre Isaac Sim. Entorno de entrenamiento del modelo GR00T N1 — foundation model humanoide de NVIDIA.
🐍 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.
🔗 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 (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)
🎲 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.
🔄 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.
✅ Resumen del módulo
Siguiente módulo
2.4 — ROS2: middleware para robótica real