# Ray Trace Your Way to a Better Life: Omniverse Libraries, OpenUSD, Agents, and You

## The Attic Story

Welcome to the NVIDIA Physical AI Agent Bootcamp. The first two courses follow one connected story at the Museum of Lost Things.

You’re the agentic engineer called in to recover a glowing **Memory Cube** from the Old Attic. In **Operation Attic Signal — Commission the Scene**, you’ll bring its browser-streamed RTX portal online and make the digital scene trustworthy enough for a future robot to identify, control, and perceive the cube without modifying the original attic.

In the next course, **Operation Attic Containment — Commission the Physical Scene**, you’ll add simulation readiness and physics evidence so a future robotics team can test how the cube and its containment pod behave before deployment.

## Why This, Why You

**Physical AI needs people who know how worlds are built.** A robot’s intelligence begins before a model makes its first prediction. Someone must define the world at the correct scale, organize its objects, establish coordinate frames, rig its sensors, describe what each object means, and decide what evidence can be trusted. These are not finishing touches around the AI system - they are the spatial foundation the system reasons from.

Robotics, autonomous vehicles, digital twins, perception models, and world models cannot be built by models and chips alone. A model can only learn from and act on the world it is given. If a hierarchy is wrong, a sensor is mounted in the wrong frame, or ground-truth labels are inconsistent, that error travels through the application, the model, the infrastructure, and ultimately the physical machine. That is why your 3D expertise is essential.

| Your 3D skill                                    | What physical AI needs it to provide                                                          |
|--------------------------------------------------|-----------------------------------------------------------------------------------------------|
| Scene hierarchy and naming                       | Stable identities for objects, assemblies, environments, and action targets.                  |
| Units, transforms, pivots, and coordinate frames | Shared spatial truth for robot motion, sensors, objects, and world state.                     |
| Cameras, lenses, and framing                     | Calibrated virtual sensors with intentional placement, coverage, and repeatable observations. |
| Geometry, materials, and lighting                | Trustworthy visual and sensor evidence for perception, testing, and synthetic data.           |
| Semantic labels and taxonomies                   | Machine-readable meaning and ground truth for training and evaluation.                        |
| OpenUSD layers and composition                   | A canonical digital twin that many applications and experiments can extend safely.            |
| Render outputs and AOVs                          | The observations engineers and models use to measure and understand the world.                |
![Diagram titled Why This, Why You. On the left, a column of 3D skills - hierarchy and naming, units and transforms, cameras and sensors, materials and lighting, and semantics and layers - connects to a central cutaway of the OpenUSD attic world showing a glowing cube, coordinate axes, a camera, and structure, furniture, object, light, and floor layers. On the right, those skills map to physical AI needs: stable object identities, shared spatial truth, calibrated observations, trustworthy sensor evidence, and machine-readable context. Along the bottom, a chain shows where your decisions propagate: applications to models to infrastructure to chips to energy.](images/lab-1-why-this-why-you.png)

This expertise starts in the **application** and **infrastructure** layers of the five-layer AI cake, but it shapes the whole stack: models receive the observations you define, chips execute the rendering and sensor workloads you request, and energy use follows the scale of those decisions. OpenUSD gives your 3D knowledge a shared, structured form; `ovrtx` turns that world into RTX camera and sensor observations; `ovstream` makes those results operational in a connected application. Agents and skills accelerate the implementation - but they still need someone who understands what a correct world, sensor, transform, and result should be.

**That is where you come in.** Physical AI needs 3D practitioners who can build worlds coherent enough for machines to perceive, simulate, reason about, and act within. In this lab you are not decorating the world around a robot - you are defining the world the robot must learn to trust.

## The Big Picture: RTX, OpenUSD, and Agents

Your whole mission at a glance. Step through the slides, then jump into the build below.

### 1

The Mission

Operation Attic Signal - Commission the Scene.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-package slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path></svg> **Identify** the lost **Memory Cube** as a stable target a future robot can use.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-alert slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg> A robot application cannot act until the scene provides control, focus, and machine-readable perception.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-tools slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5.433 2.304A4.492 4.492 0 0 0 3.5 6c0 1.598.832 3.002 2.09 3.802.518.328.929.923.902 1.64v.008l-.164 3.337a.75.75 0 1 1-1.498-.073l.163-3.33c.002-.085-.05-.216-.207-.316A5.996 5.996 0 0 1 2 6a5.993 5.993 0 0 1 2.567-4.92 1.482 1.482 0 0 1 1.673-.04c.462.296.76.827.76 1.423v2.82c0 .082.041.16.11.206l.75.51a.25.25 0 0 0 .28 0l.75-.51A.249.249 0 0 0 9 5.282V2.463c0-.596.298-1.127.76-1.423a1.482 1.482 0 0 1 1.673.04A5.993 5.993 0 0 1 14 6a5.996 5.996 0 0 1-2.786 5.068c-.157.1-.209.23-.207.315l.163 3.33a.752.752 0 0 1-1.094.714.75.75 0 0 1-.404-.64l-.164-3.345c-.027-.717.384-1.312.902-1.64A4.495 4.495 0 0 0 12.5 6a4.492 4.492 0 0 0-1.933-3.696c-.024.017-.067.067-.067.16v2.818a1.75 1.75 0 0 1-.767 1.448l-.75.51a1.75 1.75 0 0 1-1.966 0l-.75-.51A1.75 1.75 0 0 1 5.5 5.282V2.463c0-.092-.043-.142-.067-.159Z"></path></svg> Turn the empty **Signal Panel** into a robot-readiness console.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-shield-check slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="m8.533.133 5.25 1.68A1.75 1.75 0 0 1 15 3.48V7c0 1.566-.32 3.182-1.303 4.682-.983 1.498-2.585 2.813-5.032 3.855a1.697 1.697 0 0 1-1.33 0c-2.447-1.042-4.049-2.357-5.032-3.855C1.32 10.182 1 8.566 1 7V3.48a1.75 1.75 0 0 1 1.217-1.667l5.25-1.68a1.748 1.748 0 0 1 1.066 0Zm-.61 1.429.001.001-5.25 1.68a.251.251 0 0 0-.174.237V7c0 1.36.275 2.666 1.057 3.859.784 1.194 2.121 2.342 4.366 3.298a.196.196 0 0 0 .154 0c2.245-.957 3.582-2.103 4.366-3.297C13.225 9.666 13.5 8.358 13.5 7V3.48a.25.25 0 0 0-.174-.238l-5.25-1.68a.25.25 0 0 0-.153 0ZM11.28 6.28l-3.5 3.5a.75.75 0 0 1-1.06 0l-1.5-1.5a.749.749 0 0 1 .326-1.275.749.749 0 0 1 .734.215l.97.97 2.97-2.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg> Never touch the source attic - author in app-owned layers.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-stopwatch slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5.75.75A.75.75 0 0 1 6.5 0h3a.75.75 0 0 1 0 1.5h-.75v1l-.001.041a6.724 6.724 0 0 1 3.464 1.435l.007-.006.75-.75a.749.749 0 0 1 1.275.326.749.749 0 0 1-.215.734l-.75.75-.006.007a6.75 6.75 0 1 1-10.548 0L2.72 5.03l-.75-.75a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l.75.75.007.006A6.72 6.72 0 0 1 7.25 2.541V1.5H6.5a.75.75 0 0 1-.75-.75ZM8 14.5a5.25 5.25 0 1 0-.001-10.501A5.25 5.25 0 0 0 8 14.5Zm.389-6.7 1.33-1.33a.75.75 0 1 1 1.061 1.06L9.45 8.861A1.503 1.503 0 0 1 8 10.75a1.499 1.499 0 1 1 .389-2.95Z"></path></svg> A structured build first, then open exploration to make it your own.

### 2

What You’ll Build

By the end of the mission, you can…

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-browser slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25ZM14.5 6h-13v7.25c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm-6-3.5v2h6V2.75a.25.25 0 0 0-.25-.25ZM5 2.5v2h2v-2Zm-3.25 0a.25.25 0 0 0-.25.25V4.5h2v-2Z"></path></svg> **Launch** a browser-streamed RTX viewer.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-arrow-switch slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5.22 14.78a.75.75 0 0 0 1.06-1.06L4.56 12h8.69a.75.75 0 0 0 0-1.5H4.56l1.72-1.72a.75.75 0 0 0-1.06-1.06l-3 3a.75.75 0 0 0 0 1.06l3 3Zm5.56-6.5a.75.75 0 1 1-1.06-1.06l1.72-1.72H2.75a.75.75 0 0 1 0-1.5h8.69L9.72 2.28a.75.75 0 0 1 1.06-1.06l3 3a.75.75 0 0 1 0 1.06l-3 3Z"></path></svg> **Control** the cube with replay-safe poses and a focus camera.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-eye slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8 2c1.981 0 3.671.992 4.933 2.078 1.27 1.091 2.187 2.345 2.637 3.023a1.62 1.62 0 0 1 0 1.798c-.45.678-1.367 1.932-2.637 3.023C11.67 13.008 9.981 14 8 14c-1.981 0-3.671-.992-4.933-2.078C1.797 10.83.88 9.576.43 8.898a1.62 1.62 0 0 1 0-1.798c.45-.677 1.367-1.931 2.637-3.022C4.33 2.992 6.019 2 8 2ZM1.679 7.932a.12.12 0 0 0 0 .136c.411.622 1.241 1.75 2.366 2.717C5.176 11.758 6.527 12.5 8 12.5c1.473 0 2.825-.742 3.955-1.715 1.124-.967 1.954-2.096 2.366-2.717a.12.12 0 0 0 0-.136c-.412-.621-1.242-1.75-2.366-2.717C10.824 4.242 9.473 3.5 8 3.5c-1.473 0-2.825.742-3.955 1.715-1.124.967-1.954 2.096-2.366 2.717ZM8 10a2 2 0 1 1-.001-3.999A2 2 0 0 1 8 10Z"></path></svg> **Perceive** the scene through semantic segmentation and lidar.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-package slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="m8.878.392 5.25 3.045c.54.314.872.89.872 1.514v6.098a1.75 1.75 0 0 1-.872 1.514l-5.25 3.045a1.75 1.75 0 0 1-1.756 0l-5.25-3.045A1.75 1.75 0 0 1 1 11.049V4.951c0-.624.332-1.201.872-1.514L7.122.392a1.75 1.75 0 0 1 1.756 0ZM7.875 1.69l-4.63 2.685L8 7.133l4.755-2.758-4.63-2.685a.248.248 0 0 0-.25 0ZM2.5 5.677v5.372c0 .09.047.171.125.216l4.625 2.683V8.432Zm6.25 8.271 4.625-2.683a.25.25 0 0 0 .125-.216V5.677L8.75 8.432Z"></path></svg> **Package** a repeatable workflow as a reusable agent skill.

### 3

Who Owns What

Each piece has a clear job.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-stack slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg> **OpenUSD** describes and names the attic and its prims.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-cpu slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M6.5.75V2h3V.75a.75.75 0 0 1 1.5 0V2h1.25c.966 0 1.75.784 1.75 1.75V5h1.25a.75.75 0 0 1 0 1.5H14v3h1.25a.75.75 0 0 1 0 1.5H14v1.25A1.75 1.75 0 0 1 12.25 14H11v1.25a.75.75 0 0 1-1.5 0V14h-3v1.25a.75.75 0 0 1-1.5 0V14H3.75A1.75 1.75 0 0 1 2 12.25V11H.75a.75.75 0 0 1 0-1.5H2v-3H.75a.75.75 0 0 1 0-1.5H2V3.75C2 2.784 2.784 2 3.75 2H5V.75a.75.75 0 0 1 1.5 0Zm5.75 11.75a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25ZM5.75 5h4.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1-.75-.75v-4.5A.75.75 0 0 1 5.75 5Zm.75 4.5h3v-3h-3Z"></path></svg> **`ovrtx`** loads the stage and renders RTX frames plus sensor output.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-broadcast slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8.75 8.582v5.668a.75.75 0 0 1-1.5 0V8.582a1.75 1.75 0 1 1 1.5 0Zm3.983-7.125a.75.75 0 0 1 1.06.026A7.976 7.976 0 0 1 16 7c0 2.139-.84 4.083-2.207 5.517a.75.75 0 1 1-1.086-1.034A6.474 6.474 0 0 0 14.5 7a6.474 6.474 0 0 0-1.793-4.483.75.75 0 0 1 .026-1.06Zm-9.466 0c.3.286.312.76.026 1.06A6.474 6.474 0 0 0 1.5 7a6.47 6.47 0 0 0 1.793 4.483.75.75 0 0 1-1.086 1.034A7.973 7.973 0 0 1 0 7c0-2.139.84-4.083 2.207-5.517a.75.75 0 0 1 1.06-.026Zm8.556 2.321A4.988 4.988 0 0 1 13 7a4.988 4.988 0 0 1-1.177 3.222.75.75 0 1 1-1.146-.967A3.487 3.487 0 0 0 11.5 7c0-.86-.309-1.645-.823-2.255a.75.75 0 0 1 1.146-.967Zm-6.492.958A3.48 3.48 0 0 0 4.5 7a3.48 3.48 0 0 0 .823 2.255.75.75 0 0 1-1.146.967A4.981 4.981 0 0 1 3 7a4.982 4.982 0 0 1 1.188-3.236.75.75 0 1 1 1.143.972Z"></path></svg> **`ovstream`** carries frames to the browser and input back.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-browser slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25ZM14.5 6h-13v7.25c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm-6-3.5v2h6V2.75a.25.25 0 0 0-.25-.25ZM5 2.5v2h2v-2Zm-3.25 0a.25.25 0 0 0-.25.25V4.5h2v-2Z"></path></svg> **The browser** displays the stream - it never renders the scene.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-tools slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M5.433 2.304A4.492 4.492 0 0 0 3.5 6c0 1.598.832 3.002 2.09 3.802.518.328.929.923.902 1.64v.008l-.164 3.337a.75.75 0 1 1-1.498-.073l.163-3.33c.002-.085-.05-.216-.207-.316A5.996 5.996 0 0 1 2 6a5.993 5.993 0 0 1 2.567-4.92 1.482 1.482 0 0 1 1.673-.04c.462.296.76.827.76 1.423v2.82c0 .082.041.16.11.206l.75.51a.25.25 0 0 0 .28 0l.75-.51A.249.249 0 0 0 9 5.282V2.463c0-.596.298-1.127.76-1.423a1.482 1.482 0 0 1 1.673.04A5.993 5.993 0 0 1 14 6a5.996 5.996 0 0 1-2.786 5.068c-.157.1-.209.23-.207.315l.163 3.33a.752.752 0 0 1-1.094.714.75.75 0 0 1-.404-.64l-.164-3.345c-.027-.717.384-1.312.902-1.64A4.495 4.495 0 0 0 12.5 6a4.492 4.492 0 0 0-1.933-3.696c-.024.017-.067.067-.067.16v2.818a1.75 1.75 0 0 1-.767 1.448l-.75.51a1.75 1.75 0 0 1-1.966 0l-.75-.51A1.75 1.75 0 0 1 5.5 5.282V2.463c0-.092-.043-.142-.067-.159Z"></path></svg> **Your agent** builds and changes the app for you.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-book slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg> **Skills** give the agent the reliable, source-backed route.

### 4

Runtime Path

The server renders, the browser displays.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-stack slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M7.122.392a1.75 1.75 0 0 1 1.756 0l5.003 2.902c.83.481.83 1.68 0 2.162L8.878 8.358a1.75 1.75 0 0 1-1.756 0L2.119 5.456a1.251 1.251 0 0 1 0-2.162ZM8.125 1.69a.248.248 0 0 0-.25 0l-4.63 2.685 4.63 2.685a.248.248 0 0 0 .25 0l4.63-2.685ZM1.601 7.789a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0L1.874 8.814A.75.75 0 0 1 1.6 7.789Zm0 3.5a.75.75 0 0 1 1.025-.273l5.249 3.044a.248.248 0 0 0 .25 0l5.249-3.044a.75.75 0 0 1 .752 1.298l-5.248 3.044a1.75 1.75 0 0 1-1.756 0l-5.248-3.044a.75.75 0 0 1-.273-1.025Z"></path></svg> **1. OpenUSD** - the composed scene to render.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-cpu slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M6.5.75V2h3V.75a.75.75 0 0 1 1.5 0V2h1.25c.966 0 1.75.784 1.75 1.75V5h1.25a.75.75 0 0 1 0 1.5H14v3h1.25a.75.75 0 0 1 0 1.5H14v1.25A1.75 1.75 0 0 1 12.25 14H11v1.25a.75.75 0 0 1-1.5 0V14h-3v1.25a.75.75 0 0 1-1.5 0V14H3.75A1.75 1.75 0 0 1 2 12.25V11H.75a.75.75 0 0 1 0-1.5H2v-3H.75a.75.75 0 0 1 0-1.5H2V3.75C2 2.784 2.784 2 3.75 2H5V.75a.75.75 0 0 1 1.5 0Zm5.75 11.75a.25.25 0 0 0 .25-.25v-8.5a.25.25 0 0 0-.25-.25h-8.5a.25.25 0 0 0-.25.25v8.5c0 .138.112.25.25.25ZM5.75 5h4.5a.75.75 0 0 1 .75.75v4.5a.75.75 0 0 1-.75.75h-4.5a.75.75 0 0 1-.75-.75v-4.5A.75.75 0 0 1 5.75 5Zm.75 4.5h3v-3h-3Z"></path></svg> **2. `ovrtx`** - renders each RTX frame from that scene.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-broadcast slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M8.75 8.582v5.668a.75.75 0 0 1-1.5 0V8.582a1.75 1.75 0 1 1 1.5 0Zm3.983-7.125a.75.75 0 0 1 1.06.026A7.976 7.976 0 0 1 16 7c0 2.139-.84 4.083-2.207 5.517a.75.75 0 1 1-1.086-1.034A6.474 6.474 0 0 0 14.5 7a6.474 6.474 0 0 0-1.793-4.483.75.75 0 0 1 .026-1.06Zm-9.466 0c.3.286.312.76.026 1.06A6.474 6.474 0 0 0 1.5 7a6.47 6.47 0 0 0 1.793 4.483.75.75 0 0 1-1.086 1.034A7.973 7.973 0 0 1 0 7c0-2.139.84-4.083 2.207-5.517a.75.75 0 0 1 1.06-.026Zm8.556 2.321A4.988 4.988 0 0 1 13 7a4.988 4.988 0 0 1-1.177 3.222.75.75 0 1 1-1.146-.967A3.487 3.487 0 0 0 11.5 7c0-.86-.309-1.645-.823-2.255a.75.75 0 0 1 1.146-.967Zm-6.492.958A3.48 3.48 0 0 0 4.5 7a3.48 3.48 0 0 0 .823 2.255.75.75 0 0 1-1.146.967A4.981 4.981 0 0 1 3 7a4.982 4.982 0 0 1 1.188-3.236.75.75 0 1 1 1.143.972Z"></path></svg> **3. `ovstream`** - carries frames out, input back.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-browser slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 2.75C0 1.784.784 1 1.75 1h12.5c.966 0 1.75.784 1.75 1.75v10.5A1.75 1.75 0 0 1 14.25 15H1.75A1.75 1.75 0 0 1 0 13.25ZM14.5 6h-13v7.25c0 .138.112.25.25.25h12.5a.25.25 0 0 0 .25-.25Zm-6-3.5v2h6V2.75a.25.25 0 0 0-.25-.25ZM5 2.5v2h2v-2Zm-3.25 0a.25.25 0 0 0-.25.25V4.5h2v-2Z"></path></svg> **4. Browser** - displays the stream.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-alert slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z"></path></svg> Most “why doesn’t this work” bugs live at a **boundary** between two of these.

### 5

Prompt Contract

One repeatable four-field habit.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-milestone slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M7.75 0a.75.75 0 0 1 .75.75V3h3.634c.414 0 .814.147 1.13.414l2.07 1.75a1.75 1.75 0 0 1 0 2.672l-2.07 1.75a1.75 1.75 0 0 1-1.13.414H8.5v5.25a.75.75 0 0 1-1.5 0V10H2.75A1.75 1.75 0 0 1 1 8.25v-3.5C1 3.784 1.784 3 2.75 3H7V.75A.75.75 0 0 1 7.75 0Zm4.384 8.5a.25.25 0 0 0 .161-.06l2.07-1.75a.248.248 0 0 0 0-.38l-2.07-1.75a.25.25 0 0 0-.161-.06H2.75a.25.25 0 0 0-.25.25v3.5c0 .138.112.25.25.25h9.384Z"></path></svg> **Goal** - what should be true after this step.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-book slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 1.75A.75.75 0 0 1 .75 1h4.253c1.227 0 2.317.59 3 1.501A3.743 3.743 0 0 1 11.006 1h4.245a.75.75 0 0 1 .75.75v10.5a.75.75 0 0 1-.75.75h-4.507a2.25 2.25 0 0 0-1.591.659l-.622.621a.75.75 0 0 1-1.06 0l-.622-.621A2.25 2.25 0 0 0 5.258 13H.75a.75.75 0 0 1-.75-.75Zm7.251 10.324.004-5.073-.002-2.253A2.25 2.25 0 0 0 5.003 2.5H1.5v9h3.757a3.75 3.75 0 0 1 1.994.574ZM8.755 4.75l-.004 7.322a3.752 3.752 0 0 1 1.992-.572H14.5v-9h-3.495a2.25 2.25 0 0 0-2.25 2.25Z"></path></svg> **Skills** - which source-backed procedures the agent should read.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-info slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z"></path></svg> **Context** - the application, scene, current state, and constraints.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-check-circle slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm1.5 0a6.5 6.5 0 1 0 13 0 6.5 6.5 0 0 0-13 0Zm10.28-1.72-4.5 4.5a.75.75 0 0 1-1.06 0l-2-2a.751.751 0 0 1 .018-1.042.751.751 0 0 1 1.042-.018l1.47 1.47 3.97-3.97a.751.751 0 0 1 1.042.018.751.751 0 0 1 .018 1.042Z"></path></svg> **Done when** - observable evidence that proves the work is complete.

<svg version="1.1" width="1.3em" height="1.3em" class="sd-octicon sd-octicon-repo slide-icon" viewBox="0 0 16 16" aria-hidden="true"><path d="M2 2.5A2.5 2.5 0 0 1 4.5 0h8.75a.75.75 0 0 1 .75.75v12.5a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h1.75v-2h-8a1 1 0 0 0-.714 1.7.75.75 0 1 1-1.072 1.05A2.495 2.495 0 0 1 2 11.5Zm10.5-1h-8a1 1 0 0 0-1 1v6.708A2.486 2.486 0 0 1 4.5 9h8ZM5 12.25a.25.25 0 0 1 .25-.25h3.5a.25.25 0 0 1 .25.25v3.25a.25.25 0 0 1-.4.2l-1.45-1.087a.249.249 0 0 0-.3 0L5.4 15.7a.25.25 0 0 1-.4-.2Z"></path></svg> Learn the **pattern**, not the exact strings - that’s what makes it repeatable.

## Case File: Operation Attic Signal — Commission the Scene

**The story:** You’re the agentic engineer on call for the Museum of Lost Things. A glowing **Memory Cube** has been misplaced in the Old Attic, and because the museum only stores its most long-lost items in this attic, the cube must be removed. The museum relies on robot assistance for these treacherous tasks, and your job is to commission the digital scene and its remote portal so a future robotics team can identify the target, inspect it from repeatable viewpoints, and evaluate machine-readable sensor evidence before a real robot is deployed.

**The problem:** The Memory Cube is easy for a person to recognize, but the attic is not yet ready for a robot. A robot-ready application needs stable identity, deterministic commands, repeatable sensor views, and machine-readable evidence before physical hardware enters the scene.

First, you’ll bring the Attic Portal online: an interactive RTX viewport streamed into your browser. Then you’ll turn the human observation “the glowing cyan cube” into a scene contract a future robot application can use - an exact OpenUSD prim, replay-safe commands, a repeatable camera, semantic labels, and lidar evidence.

**Your mission:** Turn the empty diagnostics panel beside the viewport into a robot-readiness console. You’ll prove that the application can resolve and move `/Root/Workshop/Cube`, create a nondestructive focus camera, expose semantic segmentation, and activate an `ovrtx` lidar sensor - all through the existing browser connection with Omniverse libraries and your agent.

You’ll work through a structured build, then extend the portal on your own.

The **What You’ll Build** slide above previews these, and each mission page proves one of them.

## Before You Start

- **Provided assets:** the Old Attic scene (`~/RTXViewport/Attic_Nvidia/old_attic.usd`), the prepared Attic Portal project (`~/RTXViewport/Attic_Portal`), and the Omniverse Realtime Viewer skill (`~/RTXViewport/skills/omniverse-realtime-viewer`).
- **Prerequisites:** basic comfort with a browser and a terminal. No graphics or RTX experience required.
- **Your AI agent:** if you haven’t already, follow [Initialize Your AI Agent](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/get-started.md) to start the agent and point it at the skills.

## Download Course Materials

Download the assets, starter code, and NVIDIA agent skills used in this course:

- **Course materials:** [Download the course bundle (`ovlibraries_physicalai.zip`)](https://developer.nvidia.com/downloads/omniverse/learning/courses/physicalaiagentbootcamp/ovlibraries_physicalai.zip)

#### WARNING
The course bundle is roughly **5 GB**. You don’t have to download it to complete this course - you can work through every mission with assets you already have. Grab the bundle only if you want the exact starter assets, code, and agent skills used here.

## Key Ingredients

- **`ovrtx`** - a lightweight C and Python SDK for Omniverse RTX that loads the OpenUSD stage and produces real-time, physically accurate rendering and sensor output inside the server application.
- **`ovstream`** - a streaming library that carries server-rendered frames to the browser and native input back to the application.
- **OpenUSD** - the open framework that describes and composes the attic, including its hierarchy, materials, cameras, and prim identities.
- **The browser** - displays the video stream and collects your controls; it does not render the USD scene.
- **Agent skills** - version-specific procedures that give your agent the reliable route. `AGENTS.md` gives context; each `SKILL.md` points the agent at real source code.

## Your Prompt Contract

Every mission brief uses the same four fields, so you learn a repeatable habit rather than memorizing specific strings.

```text
Goal:      <what should be true after this step>
Skills:    <which source-backed procedures the agent should read>
Context:   <the application, scene, current state, and constraints>
Done when: <observable evidence that proves the work is complete>
```

You don’t have to know all four fields up front. Start with what you already know - often the **Goal** and the **Done when** that will prove it - and fill in as much **Context** as you can. You don’t need to name the right skills yourself: this course supplies each mission’s **Goal** and the **Skills** route to the source-backed procedures the agent should read. Your job is to sharpen the **Context** the agent should not guess and the **Done when** that is your test contract, then compare the agent’s result against that proof.

This course supplies the mission and the tested implementation route. You supply the 3D judgment that makes the result useful. Every mission follows the same loop:

1. **Inspect** - examine the scene, output, or production problem through the lens of your own discipline.
2. **Specify** - decide the 3D judgment this mission needs and shape it in the Prompt Builder.
3. **Build** - inject your answers into the prompt’s `Context` and `Done when`, then direct the agent to implement it with the supplied skills.
4. **Verify** - approve or reject the result against the evidence you defined, not merely whether the code ran.

```text
Course mission + library skills + your specification
                         ↓
                  agent implementation
                         ↓
              your evidence-based approval
```

The Prompt Builder does not generate the entire prompt. **Goal** and **Skills** remain the reliable course contract; your decisions strengthen **Context** and **Done when**. Commit at least one `Context` or `Done when` decision of your own before you build - that judgment is the point of the course. Use the finished prompt to check your work or to unblock yourself if you get stuck, not as the default.

#### IMPORTANT
Review-before-run is the core habit this course builds. Read and understand the generated diff, then run only after the code makes sense to you.

#### NOTE
Different AI coding agents and models work at different speeds, so how long a prompt takes to finish - and how many steps it runs - will vary. A longer wait doesn’t mean something is wrong. Judge each result against your **Done when** evidence, not the clock.

## Two Ways to Work

Every build card gives you two paths:

1. **Make the mission yours** - open the [Prompt Builder](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/prompt-builder.md), answer its questions, and review how your 3D decisions change `Context` and `Done when`. This is where the learning happens.
2. **Check or unblock** - if you get stuck, expand the **Show a finished prompt** dropdown to compare against a tested prompt. Treat it as a way to check your work or recover, not the default path.

## Your Route

| Mission                     | Inspect and specify                                                                      | Build and verify                                                                                  |
|-----------------------------|------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------|
| **1.a Attic Portal**        | Decide which evidence distinguishes a live viewport from a robot-ready world.            | Launch the portal, then verify the runtime path and your chosen commissioning evidence.           |
| **2.b Cube Link**           | Select the stable prim and define a replay-safe transform contract.                      | Build the controls, then prove they always reach the same authored targets.                       |
| **2.c Cube Focus**          | Define framing, motion-envelope coverage, context, and rejection criteria.               | Author the nondestructive camera preset, then approve or revise its observation.                  |
| **3.a Semantic Perception** | Define which authored identities and labels must survive appearance changes.             | Build the semantic view, then verify its IDs and taxonomy.                                        |
| **3.b Lidar Coverage**      | Decide which task surfaces the sensor must observe and what counts as credible evidence. | Build the sensor link, then inspect coverage and telemetry rather than accepting a visual effect. |
| **Part 4 Your Skill**       | Turn one production-quality rule into NEVER GUESS, REQUIRE, and PROVE guidance.          | Create the skill, then forward-test whether another agent can repeat your quality bar.            |

While each brief runs, review the plan and prepare the acceptance checks you’ll hold the result to. If a build fails, revise the brief and try the step again.

## In This Course

Work through the pages in order:

1. [Open the Attic Portal](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/lab-1-rtx-viewport/open-the-attic-portal.md) - launch the browser-streamed RTX viewport and trace the render–stream–input lifecycle.
2. [Establish the Cube Link](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/lab-1-rtx-viewport/establish-the-cube-link.md) - give a future robot application a reliable prim identity, replay-safe pose controls, and a focus camera.
3. [Add Machine Perception](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/lab-1-rtx-viewport/give-r17-machine-perception.md) - add semantic segmentation and a lidar sensor from the same scene.
4. [Create Your Own Agent Skill](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/lab-1-rtx-viewport/create-your-own-skill.md) - package a repeatable workflow for your open-build exploration.
5. [Knowledge Check](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/lab-1-rtx-viewport/knowledge-check.md) - check your understanding of the core concepts.
6. [Review](https://docs.nvidia.com/learning/physical-ai/physical-ai-agent-bootcamp/latest/lab-1-rtx-viewport/review.md) - recap, references, and what comes next.

---
