Simulating a Job-Shop in Omniverse

Build discrete-event simulation logic on top of physics-enabled USD scenes to model, visualize, and analyze complex job-shop workflows with real-time state transitions, resource contention, and dynamic task routing in a fully programmable environment.

simulating-a-job-shop-in-omniverse
Last updated:
June 14, 2025

A job-shop is a manufacturing system with jobs that visit multiple stations in a custom order. In a job-shop manufacturing system, no two jobs follow exactly the same path. Each product moves through a unique sequence of workstations, competing for shared machines, and creating complex scheduling challenges that are difficult to optimize without simulation.

Each:

  • 🔧 Station = physical workstation (e.g., welding, painting)
  • 🧱 Job = product type with unique routing
  • 🕒 Task = action at a specific station with a service time

We simulate jobs entering, queuing, being processed, and exiting using USD prims + Python + Omniverse’s simulation core.

💰 Where Does This Make Financial Sense?

Job-shop simulation pays off when variability is high and capacity is expensive. Industries include:

🔧 1. Aerospace & Defense

🚘 2. Automotive Prototyping / Tooling

💡 3. Industrial Machinery & Robotics

🛠 4. Precision Manufacturing (e.g., medical devices)

🧪 5. R&D and Custom Fabrication Labs

Grand View Research. (2024). Simulation software market size, share & trends analysis report. https://www.grandviewresearch.com/industry-analysis/simulation-software-market

Define Station Layout with USD

Each station is a Xform prim with metadata for machines and queues.

from pxr import Usd, UsdGeom

stage = Usd.Stage.CreateNew("jobshop.usda")

stations = ["Station_1", "Station_2", "Station_3", "Station_4", "Station_5"]
for i, name in enumerate(stations):
    path = f"/JobShop/{name}"
    xform = UsdGeom.Xform.Define(stage, path)
    xform.AddTranslateOp().Set((i * 5.0, 0, 0))
    xform.GetPrim().CreateAttribute("machines", Sdf.ValueTypeNames.Int).Set(2)

Each station could have a machines attribute for capacity and location in the scene graph.

Simulate Discrete Events with Python ⏱️

We mimic a discrete-event engine using a sorted list of (time, event_fn).

import heapq, random

event_queue = []
current_time = 0.0

def schedule(delay, fn): 
    heapq.heappush(event_queue, (current_time + delay, fn))

def run_sim():
    global current_time
    while event_queue:
        current_time, fn = heapq.heappop(event_queue)
        fn()

# Example: Arrival
def job_arrival():
    print(f"Job arrives at t={current_time:.2f}")
    schedule(random.expovariate(4), job_arrival)  # next arrival

schedule(0, job_arrival)
run_sim()

Add Intelligence: Routes, Queues, and Stats 📊

Each job has:

  • A route ([3,1,2,5])
  • A task pointer
  • A per-station queue system
stations = {i: {"queue": [], "busy": 0, "machines": 2} for i in range(1, 6)}

def serve_job(station_id, job):
    stations[station_id]["busy"] += 1
    delay = random.gammavariate(2, job["service"][job["task"]])
    print(f"Serving job at Station {station_id}, task {job['task']}")
    schedule(delay, lambda: job_depart(station_id, job))

def job_depart(station_id, job):
    stations[station_id]["busy"] -= 1
    job["task"] += 1
    if job["task"] < len(job["route"]):
        schedule(0, lambda: job_arrive(job))
    else:
        print(f"Job complete at t={current_time:.2f}")

You can visualize everything in Omniverse Kit or USDView. The next step is integrating Omniverse Isaac Sim to add physics, robotic arms, or automated decision logic.

🚀 Ready to accelerate your simulation flow?👉 Visit champion3d.io to see how AI + USD can transform your engineering workflows—turning custom job-shop models into intelligent, testable simulations that scale with your business.

Available Now

Book a demo and get early access. Free trial!

Email Address:
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Email Address:
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
Join the Champion3D Insider List
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.
What’s Your Biggest Outdoor Robotics Challenge?
Which factor causes you the most pain during mobile robot field testing?
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.