PTENES
MODULE 2.3

🖥️ Simulators: MuJoCo, Isaac Sim, PyBullet

Train robots without breaking anything: high-fidelity physics simulation for VLA. MuJoCo at 2.7M steps/s, Isaac Sim with ray tracing at 94k FPS, and PyBullet for rapid prototyping — each has its own niche.

MuJoCo 2.7M steps/s Soft contact DeepMind / Google Academic standard Apache 2 · Open-source Isaac Sim 94k FPS ray tracing PhysX 5 + Omniverse NVIDIA · Domain random. GR00T N1 training Free (NVIDIA developer) PyBullet pip install pybullet Bullet Physics No dedicated GPU Rapid prototyping zlib · Open-source 🤖 Real Robot Speed Fidelity Accessibility
6
Topics
35
Minutes
Technical
Level
Practice
Type

Detailed content

1

⚡ MuJoCo: 2.7M steps/s, the academic standard

The fastest physics simulator for training RL and VLA policies on CPU.

Main Concept

MuJoCo (Multi-Joint dynamics with Contact) is a physics engine optimized for simulating contact between rigid bodies and joints. Acquired by Google DeepMind in 2021 and released as open-source (Apache 2), it processes 2.7 million steps per second on CPU — making it feasible to train VLA policies with millions of episodes in hours.

✓ When to use MuJoCo

  • ✓ Reproduce academic papers (dm_control, Gymnasium)
  • ✓ Train RL at massive scale on CPU
  • ✓ Simulate manipulation with soft, precise contact
  • ✓ Use MJX for parallel GPU execution (JAX backend)

✗ When NOT to use MuJoCo

  • ✗ Need for photorealistic rendering for visual sim-to-real
  • ✗ Simulate native LiDAR/depth camera sensors
  • ✗ Integrate directly with ROS2 without a bridge
  • ✗ Simulate fluids or deformable materials
MJCF
Model XML format
qpos/qvel
Generalized state
MJX
MuJoCo in JAX/GPU
Soft contacts
Stable soft contact
2

🎮 NVIDIA Isaac Sim: 94k FPS, ray tracing

Photorealistic simulation for high-fidelity sim-to-real transfer — the GR00T N1 environment.

📊

The number that matters: 94,000 FPS

Isaac Sim runs the 94,000 frames per second with ray tracing on an NVIDIA A100 GPU. This means 1 hour of GPU time equals ~26 hours of real-time simulation, making it possible to use domain randomization with photorealistic textures at scale. NVIDIA’s GR00T N1 was trained entirely in this environment.

Isaac Sim is NVIDIA’s robotics simulation platform, built on Omniverse and PhysX 5. It offers real-time photorealistic rendering and can simulate thousands of robots in parallel using GPUs.

Platform evolution

2020

Isaac Gym (discontinued)

NVIDIA's first massively parallel GPU RL environment. Precursor to Isaac Sim, without photorealistic rendering.

2022

Isaac Sim + Omniverse

Integration with USD (Universal Scene Description) and real-time RTX ray tracing. PhysX 5 with GPU-accelerated simulation.

2024

Isaac Lab + GR00T N1

Unified RL/IL framework on Isaac Sim. Training environment for NVIDIA's GR00T N1 model — a humanoid foundation model.

Omniverse USD
Universal 3D scene format
PhysX 5
GPU-accelerated physics
Isaac Lab
Unified RL/IL framework
OmniGraph
Visual logic (node graph)
ROS2 bridge
Native integration with ROS2
RTX ray-tracing
94k FPS on A100
3

🐍 PyBullet: lightweight and open-source

A functional simulator on any laptop — the fastest way to run your first policy.

Quick start with 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 is the Python wrapper for the Bullet Physics Engine. With a simple pip install pybullet, you have 3D simulation with a URDF loader, collision detection, and constraints—ideal for prototyping policies before moving to heavier simulators.

💡

Tip: headless for training

Use p.connect(p.DIRECT) instead of p.GUI to train without a display — up to 10× faster because it does not render frames. Reserve GUI for visual debugging.

URDF
XML robot description
loadURDF()
Loads 3D model
stepSimulation()
Advance 1 timestep
pybullet_envs
Gymnasium Wrappers
4

🔗 Gazebo + ROS2: native integration

The simulator with native ROS2 support—simulation and real-robot code are almost identical.

Gazebo (gz-sim) 📷 Camera plugin 📡 LiDAR plugin 🧲 IMU plugin SDF world files Real sensor simulation ros_gz_bridge Gz ↔ ROS2 Topics ROS2 Nodes 🧠 VLA inference node 🔄 TF2 transformer 🦾 MoveIt2 planner 🤖 ros2_control Same code → real robot

Gazebo (now "Gz") is the simulator integrated into the ROS2 ecosystem. Unlike MuJoCo (focused on RL), Gazebo simulates real sensors — depth cameras, LiDAR, IMU — and communicates with ROS2 natively via topics through the ros_gz_bridge.

✓ Advantages of Gazebo

  • ✓ Identical ROS2 code in simulation and on the real robot
  • ✓ Built-in virtual sensors (camera, LiDAR, IMU)
  • ✓ Gazebo Fuel: repository of ready-made 3D models
  • ✓ Native integration with Nav2 and MoveIt2

✗ Limitations

  • ✗ Slower than MuJoCo for large-scale RL
  • ✗ Non-photorealistic rendering (vs Isaac Sim)
  • ✗ More involved configurations (SDF + plugins)
  • ✗ Classic Gazebo vs Gz (incompatibilities)
SDF
Simulation Description Format
ros_gz_bridge
Gz ↔ ROS2 topics
Gz Fuel
Model repository
spawn service
Spawn via ROS2 service
5

🎲 Domain Randomization: variability for transfer

The technique that enabled the first successful sim-to-real transfer at scale.

Core Concept

Domain randomization randomly varies simulator parameters — textures, lighting, masses, friction, colors — during training. The policy learns to be robust to variations instead of memorizing the sim's perfect environment. It was the technique that enabled OpenAI to teach a robot to solve a Rubik's Cube in 2019.

Types of randomization

👁️

Visual Randomization

Vary object textures, background color, light position and intensity, and camera type. The policy shouldn't depend on specific colors to recognize an object.

⚖️

Physics Randomization

Vary object mass, friction coefficient, joint damping, and actuator latency. Simulates real-world imprecision, where physical parameters are never exact.

📈

ADR — Automatic Domain Randomization

Automatic curriculum: starts with small variations and progressively increases them as the policy improves. Implemented by OpenAI for the Dactyl project (robotic hand).

💡

Tip: start simple, scale later

Don’t randomize everything at once — the policy may not converge. Start with minimal visual randomization (background color), verify that the policy still learns, then add physics. Use ADR to automate this curriculum.

Visual random.
Textures and lighting
Physics random.
Mass and Friction
ADR
Automatic curriculum
Reality gap
Sim-to-real gap
6

🔄 Sim-to-sim: validation before the real world

Test in 2 different simulators before risking expensive hardware — a low-cost, powerful validation step.

Sim-to-sim is the practice of transferring a policy trained in one simulator (e.g., MuJoCo) to another simulator with different physics (e.g., Isaac Sim) as an intermediate step. If the policy fails in another simulator, it will fail on a real robot — but you found out without breaking anything.

Robot format conversion

# 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

✓ Signs of a robust policy

  • ✓ Similar success rates in MuJoCo and Isaac Sim
  • ✓ Consistent behavior with different textures
  • ✓ Tolerance intervals overlap across sims
  • ✓ Failures are randomly distributed, not systematic

✗ Signs of overfitting to the sim

  • ✗ 90% success in MuJoCo, 20% in Isaac Sim
  • ✗ Policy stops at the same frame every time in the 2nd sim
  • ✗ Consistent failures when changing the object’s texture
  • ✗ Different behavior with the same URDF/MJCF
💡

Minimum validation protocol

Always use N ≥ 50 episodes per environment to calculate confidence intervals (95%). With N < 20, variance is so high that you may confuse luck with robustness. Record videos of failed episodes — they reveal patterns that metrics do not capture.

SIMPLER
Cross-sim benchmark
N episodes
Min. 50 for CI
URDF/MJCF
Format conversion
Physics gap
Difference between sims

✅ Module Summary

✓
MuJoCo = speed — 2.7M steps/s on CPU, the academic standard and a prerequisite for reproducing RL papers and Gymnasium benchmarks.
✓
Isaac Sim = fidelity — 94k FPS with ray tracing, PhysX 5, and native ROS2 integration; the choice for high-quality visual sim-to-real.
✓
Domain randomization is essential — without varying textures, masses, and lighting, policies overfit in simulation and fail catastrophically in the real world.
✓
Sim-to-sim before the real world — validate in 2+ simulators with N ≥ 50 episodes before risking expensive hardware; systematic failures reveal weaknesses.

Next module

2.4 — ROS2: Middleware for Real-World Robotics