Get Started with NVIDIA Isaac Sim 4.5 in 25 Minutes

Build your first USD-based robot simulation with NVIDIA Isaac Sim 4.5. Learn OpenUSD basics, scene setup, and robot import.

Problem: Getting Started with Robot Simulation Is Overwhelming

You want to test robot behaviors before deploying real hardware, but existing simulation tools either lack physics accuracy or require weeks to learn their proprietary formats.

You'll learn:

  • Why Isaac Sim uses OpenUSD and what that means for your workflow
  • How to build your first simulation scene from scratch
  • How to import robots and run basic physics simulations

Time: 25 min | Level: Beginner


Why Isaac Sim Uses USD

NVIDIA Isaac Sim is built on NVIDIA Omniverse and enables developers to simulate and test AI-driven robotics solutions in physically based virtual environments. The platform uses OpenUSD (Universal Scene Description) as its core format because USD solves a fundamental problem in robotics: combining 3D models, physics properties, sensor data, and AI behaviors into a single interchangeable format.

What USD gives you:

  • Non-destructive editing where multiple engineers can work on the same scene simultaneously
  • Layer-based composition that separates geometry from physics from AI logic
  • Industry-standard format supported by Maya, Blender, Houdini, and Unreal Engine
  • Physics-accurate assets that work identically across simulation and training

Common use cases:

  • Generating synthetic data for training robot models used for perception, mobility, and manipulation
  • Testing robot stacks through software and hardware-in-loop validation
  • Training reinforcement learning policies in Isaac Lab

Prerequisites

System Requirements

You need a GPU with RT cores for acceptable performance. GPUs with less than 16GB VRAM may be insufficient to run complex scenes rendering more than 16MP per frame.

Minimum:

  • NVIDIA RTX 3060 (12GB VRAM) or better
  • 32GB system RAM (64GB recommended for training)
  • Ubuntu 22.04 or Windows 11
  • 50GB free disk space

Not supported:

  • GPUs without RT Cores like A100 or H100 are not supported

Installation

Download Isaac Sim 4.5 from NGC:

# Install via pip (fastest method)
pip install isaacsim --extra-index-url https://pypi.nvidia.com

# Or use Docker (Linux only)
docker pull nvcr.io/nvidia/isaac-sim:4.5.0

# Or download standalone installer
# Visit catalog.ngc.nvidia.com/orgs/nvidia/containers/isaac-sim

Expected: First launch takes 2-10 minutes as extensions and shaders compile and cache.

If it fails:

  • "Missing NVIDIA drivers": Install driver 550+ from nvidia.com/drivers
  • Docker permission denied: Add user to docker group with sudo usermod -aG docker $USER

Solution

Step 1: Launch Isaac Sim and Understand the Interface

Start Isaac Sim from your installation:

# If installed via pip
isaacsim

# If using Docker
docker run --gpus all -it nvcr.io/nvidia/isaac-sim:4.5.0

What you see: The interface has three main areas. The Viewport (center) shows your 3D scene with real-time physics. The Stage panel (right) displays your USD hierarchy as a tree of Prims (primitives). The Property panel (bottom right) shows attributes for selected objects.

Why this matters: Everything in Isaac Sim is a USD Prim with properties. Prims are containers that hold data types and embody individual nodes in the scene hierarchy, representing geometric shapes, materials, lights, and more.


Step 2: Create Your First USD Scene

Let's build a simple scene with a ground plane and a cube.

Click Create > Physics > Ground Plane in the menu. This creates a static collision plane at the origin. Now add a cube that will fall due to gravity.

# You can also script this via Python console (Window > Script Editor)
from pxr import UsdGeom, Gf

# Get the stage (your USD scene)
stage = omni.usd.get_context().get_stage()

# Create a cube 2 meters above ground
cube_path = "/World/Cube"
cube_prim = stage.DefinePrim(cube_path, "Cube")

# Add transform to position it
xform = UsdGeom.Xformable(cube_prim)
xform.AddTranslateOp().Set(Gf.Vec3f(0, 0, 2))  # X, Y, Z in meters

# Add physics - makes it dynamic and affected by gravity
from pxr import UsdPhysics
UsdPhysics.RigidBodyAPI.Apply(cube_prim)
UsdPhysics.CollisionAPI.Apply(cube_prim)

Why this works: USD uses a hierarchical path system like a file system. /World/Cube means a Cube Prim under the World Prim. The physics APIs tell the PhysX engine this object should simulate rigid body dynamics.

Press Play (spacebar) in the timeline. The cube falls and bounces on the ground plane.

Expected: Cube drops, collides realistically, and settles on the ground.

If it fails:

  • Cube doesn't fall: Check that RigidBodyAPI is applied in the Property panel
  • Cube falls through floor: The ground plane needs PhysicsCollisionAPI applied
  • Simulation is slow: Reduce viewport resolution in Settings > Rendering

Step 3: Import a Robot

Isaac Sim supports importing robotic systems from common formats such as URDF, MJCF, and CAD. Let's import a pre-configured robot from Isaac's asset library.

# Import a Franka Panda robot arm
from isaacsim.robot.manipulators import Franka

# Load the robot at a specific position
robot_path = "/World/Franka"
franka = Franka(prim_path=robot_path, position=[0, 0, 0])

Or use the GUI: File > Import > Browse Isaac Sim Assets > Robots > Franka > franka.usd

What you get: The robot appears with all joints, collision meshes, and physics properties pre-configured. Each joint is articulated, meaning it can move according to defined limits and drives.

Extension naming note: In Isaac Sim 4.5, extensions were renamed from the omni.isaac.* convention to isaacsim.* If you see old tutorials using omni.isaac.core, the equivalent is now isaacsim.core.


Step 4: Add a Simple Controller

Make the robot do something. Here's a basic joint position controller:

# Get the articulation (robot with joints)
from isaacsim.core.utils import ArticulationActions

# Move all joints to a home position
target_positions = [0, -0.785, 0, -2.356, 0, 1.571, 0.785, 0.04, 0.04]

# Create action object
action = ArticulationActions()
action.joint_positions = target_positions

# Apply the action
franka.get_articulation_controller().apply_action(action)

Why this works: Isaac Sim uses position control by default for manipulators. You specify target joint angles in radians, and the physics engine simulates the motor torques needed to reach those positions.

Press Play. The robot arm moves to the specified configuration.

Expected: Smooth motion to target pose over 1-2 seconds.

If it fails:

  • Robot doesn't move: Ensure simulation is playing (timeline should be advancing)
  • Jerky motion: Increase physics substeps in Settings > Physics
  • Robot collapses: Check joint limits weren't exceeded

Step 5: Add Sensors

Robots need perception. Add a camera to the robot's end-effector:

from isaacsim.sensor import Camera

# Create RGB camera at end-effector
camera = Camera(
    prim_path="/World/Franka/panda_hand/camera",
    resolution=(640, 480),
    frequency=30  # Hz
)

# Initialize the sensor
camera.initialize()

# Get image data
rgb_data = camera.get_rgb()  # Returns numpy array [H, W, 3]

What happens: The camera renders from the robot's perspective using RTX ray tracing. You get photorealistic images suitable for training computer vision models.

To visualize: Window > Viewport > New Viewport and set camera to /World/Franka/panda_hand/camera.


Step 6: Save Your Scene

Save your work as a USD file:

# Via script
stage.Export("/path/to/my_robot_scene.usd")

# Or use GUI: File > Save As...

USD file types:

  • .usda - Human-readable text format (good for version control)
  • .usdc - Binary format (smaller, faster to load)
  • .usdz - Packaged format with embedded textures (good for sharing)

Why this matters: OpenUSD layers can be stacked to create a composite output, enabling non-destructive workflows where teams can iterate together. You can have a base robot layer, override joint properties in another layer, and swap environments in a third layer without modifying the original files.


Verification

Run your scene and check:

# Test physics is working
print(f"Gravity enabled: {stage.GetRootLayer().HasSpec('/PhysicsScene')}")

# Verify robot is articulated
print(f"Robot DOF: {franka.num_dof}")  # Should be 9 for Franka

# Check sensor data
print(f"Camera output shape: {rgb_data.shape}")  # (480, 640, 3)

You should see:

  • Cube falling naturally when simulation starts
  • Robot moving smoothly to target positions
  • Camera rendering clear RGB images

What You Learned

  • OpenUSD is a framework for composing, simulating, and collaborating within 3D worlds, giving developers precise control over scene compositions in real-time.
  • Isaac Sim 4.5 uses isaacsim.* extensions instead of the older omni.isaac.* naming
  • Physics simulation requires both RigidBodyAPI and CollisionAPI on objects
  • Robots are imported as articulated USD Prims with pre-configured physics

Limitations:

  • First asset loads take multiple minutes as shaders and extensions cache; larger environment scenes may take as long as ten minutes.
  • Training reinforcement learning requires Isaac Lab (separate framework on top of Isaac Sim)
  • Complex multi-robot scenarios need careful performance tuning

Common Gotchas

Slow performance on RTX 3060: Reduce viewport resolution to 1080p and disable path tracing. Use rasterization mode (Settings > Rendering > Renderer > Storm).

Robot imported but no physics: URDF importers don't always apply physics APIs correctly. Manually add RigidBodyAPI to each link and ensure collision meshes exist.

Scene looks dark: Add a dome light: Create > Light > Dome Light. Set intensity to 1000 for indoor scenes.

Python errors about missing modules: Isaac Sim uses its own Python environment. Don't install packages with system pip. Use isaacsim prefix for all imports.


Additional Resources

  • Official Docs: docs.isaacsim.omniverse.nvidia.com/4.5.0
  • Isaac Lab: For RL training workflows on top of Isaac Sim
  • Learn OpenUSD: developer.nvidia.com/openusd (free curriculum)
  • Forums: forums.developer.nvidia.com/c/omniverse/simulation/69

Tested on Isaac Sim 4.5.0, Ubuntu 22.04, RTX 4090