Available Now
Book a demo and get early access. Free trial!
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:
We simulate jobs entering, queuing, being processed, and exiting using USD prims + Python + Omniverse’s simulation core.
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
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.
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()
Each job has:
[3,1,2,5]
)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.
Book a demo and get early access. Free trial!