Simulating a Job-Shop in Omniverse

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.
Thank you! Your submission has been received!
Oops! Something went wrong while submitting the form.