Skip to main content

Chapter 1: Isaac Sim Introduction

Learning Objectives

  • Understand the architecture and capabilities of NVIDIA Isaac Sim as a robotics simulation platform
  • Install Isaac Sim and navigate its Omniverse-based interface
  • Load robot assets from the NVIDIA asset library and create simulation scenes
  • Use Isaac Sim's Python API to script scene creation and robot control programmatically

What Is NVIDIA Isaac Sim?

NVIDIA Isaac Sim is a scalable robotics simulation platform built on top of NVIDIA Omniverse. It provides physically accurate simulation of robots, sensors, and environments with photorealistic rendering powered by RTX ray tracing. While Gazebo and Unity serve the broader robotics community, Isaac Sim is purpose-built for workflows that demand high visual fidelity, large-scale parallel simulation, and deep integration with NVIDIA's AI ecosystem.

Isaac Sim's core differentiator is its use of NVIDIA PhysX 5 for rigid body and articulation dynamics, combined with RTX rendering for camera sensors. This means simulated camera images look remarkably close to real-world photographs—a critical property for training vision-based robot policies where the sim-to-real gap is often the biggest barrier to deployment.

Key Capabilities

CapabilityDescription
PhysX 5 rigid body dynamicsGPU-accelerated physics for thousands of parallel environments
RTX ray-traced renderingPhotorealistic sensor simulation (cameras, LiDAR)
USD scene formatUniversal Scene Description for composable, version-controlled worlds
ROS 2 integrationNative bridge for topic publishing/subscribing
Domain randomizationBuilt-in tools for texture, lighting, and pose randomization
Synthetic data generationAutomatic bounding box, segmentation, and depth annotation
Isaac Gym interopSeamless transition to GPU-parallel RL training

Architecture Overview

Isaac Sim runs as an Omniverse application, which means it leverages the Omniverse Kit framework for modularity:

  1. Omniverse Kit — the application framework providing the viewport, extension system, and Python scripting
  2. PhysX 5 simulation — the physics backend that handles contacts, joints, and deformable bodies
  3. RTX Renderer — renders camera sensor output using hardware ray tracing
  4. USD Stage — the scene graph format where all robots, objects, and environments are composed
  5. Extensions — modular plugins for ROS 2, RL, synthetic data, and domain randomization

Everything in Isaac Sim is scriptable via Python, making it possible to automate scene creation, run training, and export data programmatically.

Installing Isaac Sim

Isaac Sim is distributed through the NVIDIA Omniverse Launcher. System requirements are significant—you need an NVIDIA RTX GPU (RTX 2070 or better), Ubuntu 20.04/22.04, and at least 32 GB of RAM. Installation steps:

# Step 1: Install NVIDIA Omniverse Launcher
# Download from: https://www.nvidia.com/en-us/omniverse/download/
chmod +x omniverse-launcher-linux.AppImage
./omniverse-launcher-linux.AppImage

# Step 2: From within Omniverse Launcher, install Isaac Sim
# Navigate to Exchange → Isaac Sim → Install (latest version)

# Step 3: Verify Python environment
# Isaac Sim ships with its own Python 3.10 environment
~/.local/share/ov/pkg/isaac_sim-*/python.sh -c "
import omni.isaac.core
print(f'Isaac Sim version: {omni.isaac.core.__version__}')
print('Installation verified successfully')
"
# Expected output:
# Isaac Sim version: 2023.1.x
# Installation verified successfully

# Step 4: Verify GPU compatibility
nvidia-smi --query-gpu=name,driver_version,memory.total --format=csv
# Ensure you see an RTX GPU with driver >= 525

Creating Scenes with the Python API

Isaac Sim provides a comprehensive Python API through the omni.isaac namespace. Here's how to programmatically create a scene with a ground plane, a robot, and a target object:

# create_scene.py — Create a basic Isaac Sim scene programmatically
"""Create a robotic manipulation scene in Isaac Sim using the Python API."""
from dataclasses import dataclass
from typing import Optional


@dataclass
class SceneObject:
"""Represents a USD prim to be placed in an Isaac Sim scene."""
name: str
usd_path: str
position: tuple[float, float, float]
orientation: tuple[float, float, float, float] = (1.0, 0.0, 0.0, 0.0)
scale: tuple[float, float, float] = (1.0, 1.0, 1.0)


@dataclass
class SceneConfig:
"""Configuration for an Isaac Sim scene."""
scene_name: str
physics_dt: float = 1.0 / 60.0 # Physics step size (60 Hz)
rendering_dt: float = 1.0 / 30.0 # Render frame rate (30 Hz)
gravity: tuple[float, float, float] = (0.0, 0.0, -9.81)
objects: list[SceneObject] = None

def __post_init__(self):
if self.objects is None:
self.objects = []


def build_manipulation_scene() -> SceneConfig:
"""Build a tabletop manipulation scene configuration.

Returns a SceneConfig with a table, Franka robot, and target cube.
"""
scene = SceneConfig(
scene_name="franka_tabletop",
physics_dt=1.0 / 120.0, # Higher physics rate for grasping
)

scene.objects = [
# Ground plane
SceneObject(
name="ground_plane",
usd_path="/Isaac/Environments/Grid/default_environment.usd",
position=(0.0, 0.0, 0.0),
),
# Franka Emika Panda robot arm
SceneObject(
name="franka",
usd_path="/Isaac/Robots/Franka/franka_alt_fingers.usd",
position=(0.0, 0.0, 0.0),
),
# Table surface
SceneObject(
name="table",
usd_path="/Isaac/Props/Mounts/table.usd",
position=(0.5, 0.0, 0.0),
),
# Target cube to pick up
SceneObject(
name="target_cube",
usd_path="/Isaac/Props/Blocks/basic_block.usd",
position=(0.5, 0.0, 0.76),
scale=(0.05, 0.05, 0.05),
),
]
return scene


def validate_scene_config(config: SceneConfig) -> dict:
"""Validate a scene configuration before loading into Isaac Sim."""
issues: list[str] = []

if config.physics_dt <= 0:
issues.append("physics_dt must be positive")
if config.physics_dt > config.rendering_dt:
issues.append("physics_dt should be <= rendering_dt for stable simulation")
if not config.objects:
issues.append("Scene has no objects")

# Check for duplicate names
names = [obj.name for obj in config.objects]
duplicates = [n for n in names if names.count(n) > 1]
if duplicates:
issues.append(f"Duplicate object names: {set(duplicates)}")

return {
"valid": len(issues) == 0,
"scene_name": config.scene_name,
"num_objects": len(config.objects),
"physics_hz": int(1.0 / config.physics_dt),
"render_hz": int(1.0 / config.rendering_dt),
"issues": issues,
}


if __name__ == "__main__":
scene = build_manipulation_scene()
result = validate_scene_config(scene)
print(f"Scene: {result['scene_name']}")
print(f"Objects: {result['num_objects']}")
print(f"Physics: {result['physics_hz']} Hz, Render: {result['render_hz']} Hz")
if result["valid"]:
print("✓ Scene configuration is valid")
else:
for issue in result["issues"]:
print(f" ✗ {issue}")
# Expected output:
# Scene: franka_tabletop
# Objects: 4
# Physics: 120 Hz, Render: 30 Hz
# ✓ Scene configuration is valid

Sensor Simulation with RTX

Isaac Sim's RTX-based sensor simulation is a major differentiator. Rather than approximating sensor behavior with simplified models, it traces actual light rays through the scene to produce physically accurate:

  • RGB camera images — with reflections, refractions, and global illumination
  • Depth maps — true per-pixel depth from ray intersections
  • LiDAR point clouds — with accurate beam patterns matching real sensors (Velodyne, Ouster)
  • Segmentation masks — instance and semantic labels rendered directly from the scene graph

This fidelity means that perception algorithms (object detection, pose estimation, SLAM) trained on Isaac Sim data transfer to real sensors more reliably than from lower-fidelity simulators.

Universal Scene Description (USD)

Isaac Sim uses Pixar's USD format for scene representation. USD offers several advantages over SDF and URDF:

  • Composability — layers and references allow assembling complex scenes from reusable components
  • Version control — USD files are text-based and diff-friendly
  • Collaboration — multiple artists/engineers can work on the same scene simultaneously via Omniverse Nucleus
  • Interoperability — USD is adopted by Unity, Unreal Engine, Blender, and CAD tools

Robot models in Isaac Sim are stored as USD assets with articulation properties embedded directly in the scene graph.

Key Takeaways

  • NVIDIA Isaac Sim is an Omniverse-based robotics simulator offering PhysX 5 physics and RTX ray-traced rendering for high-fidelity simulation
  • Its Python API allows fully programmatic scene creation, making it scriptable for CI/CD and large-scale experiments
  • RTX sensor simulation (cameras, LiDAR, depth) produces photorealistic data that transfers well to real hardware
  • USD (Universal Scene Description) is Isaac Sim's scene format, offering composability, version control, and cross-tool interoperability
  • Isaac Sim's hardware requirements are higher than Gazebo's, but the fidelity payoff is significant for vision-heavy robotics applications