Verification level

Visible native Isaac. The Run requests runtime.launch_profile: visible; a valid run opens the native Isaac application and reads state through the FastSim API.

Prerequisites

  • FastSim 0.1.0a6, UniRoboSim Core 0.10.0, and unirobosim-isaaclab==0.10.1 in the same environment.
  • Isaac Lab 3.0 / Isaac Sim 6.0 with compatible Python 3.12.
  • An NVIDIA GPU and a working display.

Configuration

The runtime block requests a visible native window and chooses 60 Hz physics and control clocks. Under scenario.scene.robots, alias arm selects the shared two-joint USD. pose places its root in the world. initial_state.joints sets both declared joints to zero.

Each key has one job:

yaml
robots:                              # All robot instances in this scene.
  arm:                               # Alias used later by the control API.
    use: robot://fastsim/demo-two-joint-arm
    pose:
      xyz_m: [0.0, 0.0, 0.0]         # Root translation in world metres.
      quat_xyzw: [0.0, 0.0, 0.0, 1.0] # Root rotation in XYZW order.
    initial_state:
      joints:
        joint_1: 0.0                  # Initial revolute position in radians.
        joint_2: 0.0

Python flow

  1. asyncio.run(main()) creates the caller's async event loop.
  2. fastsim.app(RUN_FILE) compiles the Run and creates a lazy application facade.
  3. async with guarantees backend cleanup, including when the body raises an error.
  4. await simulation.start() prepares the world and starts continuous physics.
  5. run_info() returns stable Run identity; it does not expose private internals.
  6. pause() followed by single_step() establishes one explicit committed boundary, so the following state read has one unambiguous simulation tick.
  7. state() returns one coherent world/observation envelope from the same generation and simulation tick at that boundary.
  8. The final print lists the portable world-state field paths that this backend published.

Run it

bash
cd demo/fundamentals/02_start_and_read_state
fastsim config validate run.yaml --json
python main.py

Expected result: a native Isaac window opens. The terminal reports application state running, backend isaaclab, a positive generation, a non-negative tick, and robots.arm.joint_position among the portable world fields. The window closes after the context manager cleans up the application.

Common errors

  • backend provider ... not installed: install the Isaac Lab Adapter into the exact Python environment running the script.
  • No native window: confirm runtime.launch_profile: visible, DISPLAY, and GPU access.
  • declared joint names ...: the component manifest and USD joint names differ.
  • latest world and observation snapshots do not share one committed tick: preserve the pause() and single_step() boundary used by this example.

Next

Continue with 03 — Lifecycle controls.