Skip to content

SimWorld: An Open-ended Realistic Simulator for Autonomous Agents in Physical and Social Worlds

License

Notifications You must be signed in to change notification settings

SimWorld-AI/SimWorld

Repository files navigation

SimWorld: An Open-ended Realistic Simulator for Autonomous Agents in Physical and Social Worlds

image

SimWorld is a simulation platform for developing and evaluating LLM/VLM AI agents in complex physical and social environments.

Website GitHub Stars Documentation arXiv:2512.01078

In summary, SimWorld supports three levels of usage:

  • Base: use the Base package (two lightweight city scenes + one empty map) for core agent interaction and quick testing.
  • Additional Environments: optionally expand Base with 100+ pre-built maps for richer scenarios.
  • Customization: bring your own UE environments, assets, and agent models to SimWorld for fully customized simulations.

See Setup and Make Your SimWorld for details.

📌 Table of Contents

🎬 Demonstration

SimWorld Demo Video

▶ See all our demo videos on YouTube

🔥 News

  • 2026.1 SimWorld now supports importing customized environments and agents(doc)!
  • 2025.11 The white paper of SimWorld is available on arxiv!
  • 2025.9 SimWorld has been accepted to NeurIPS 2025 main track as a spotlight paper! 🎉
  • 2025.6 The first formal release of SimWorld has been published! 🚀
  • 2025.3 Our demo of SimWorld has been accepted by CVPR 2025 Demonstration Track! 🎉

💡 Introduction

SimWorld is built on Unreal Engine 5 and offers core capabilities to meet the needs of modern agent development. It provides:

  • Realistic, open-ended world simulation with accurate physics and language-based procedural generation.
  • Rich interface for LLM/VLM agents, supporting multi-modal perception and natural language actions.
  • Diverse and customizable physical and social reasoning scenarios, enabling systematic training and evaluation of complex agent behaviors like navigation, planning, and strategic cooperation.

🏗️ Architecture

image

SimWorld consists of three layers:

  • the Unreal Engine Backend, providing diverse and open-ended environments, rich assets and realistic physics simulation;
  • the Environment layer, supporting procedural city generation, language-driven scene editing, gym-like APIs for LLM/VLM agents and traffic simulation;
  • the Agent layer, enabling LLM/VLM agents to reason over multimodal observations and history while executing actions via a local action planner.

SimWorld's architecture is designed to be modular and flexible, supporting an array of functionalities such as dynamic world generation, agent control, and performance benchmarking. The components are seamlessly integrated to provide a robust platform for Embodied AI and Agents research and applications.

Project Structure

simworld/               # Python package
    local_planner/      # Local action planner component
    agent/              # Agent system
    assets_rp/          # Live editor component for retrieval and re-placing
    citygen/            # City layout procedural generator
    communicator/       # Core component to connect Unreal Engine
    config/             # Configuration loader and default config file
    llm/                # Basic llm class
    map/                # Basic map class and waypoint system
    traffic/            # Traffic system
    utils/              # Utility functions
    data/               # Default data files, e.g., object categories
    weather/            # Weather system
data/                   # Necessary input data
config/                 # Example configuration file and user configuration file
examples/                # Examples of usage, such as layout generation and traffic simulation
docs/                   # Documentation source files
README.md

🚀 Quick Tour

Here's a minimal example showing how to create an LLM-driven navigation task in SimWorld. This demo creates a humanoid agent that autonomously navigates to a target location using natural language reasoning and a Gym-like interface.

Note that the code is simplified for demonstration. For the complete implementation, see examples/gym_interface_demo.ipynb. More examples are available in the examples/ directory.

import sys
import os
import time
import re
import math
from simworld.config import Config
from simworld.communicator.communicator import Communicator
from simworld.communicator.unrealcv import UnrealCV
from simworld.llm.base_llm import BaseLLM
from simworld.map.map import Map
from simworld.agent.humanoid import Humanoid
from simworld.utils.vector import Vector

# 1. Define Agent class - uses LLM to decide navigation actions
class Agent():
    def __init__(self):
        self.llm = BaseLLM("gpt-4o")
        self.system_prompt = """ ... Your task is to ..."""

    def action(self, obs, target):
        position = obs['position']
        direction = obs['direction']

        # Calculate angle to target
        current_yaw = math.degrees(math.atan2(direction.y, direction.x))
        # ... calculate angle difference to target ...

        prompt = f""" ... Choose your next action ..."""

        action, _ = self.llm.generate_text(system_prompt=self.system_prompt, user_prompt=prompt)
        return action.strip()

# 2. Define Environment class - Gym-like interface
class Environment:
    def __init__(self, communicator, config=Config()):
        self.communicator = communicator
        self.agent = None
        self.target = None
        # ... initialize map and config ...

    def reset(self):
        """Spawn/reset humanoid and return initial observation."""
        spawn_location = Vector(0, 0)
        spawn_forward = Vector(1, 0)

        # ============ IMPORTANT: Spawn humanoid agent in UE world ============
        self.agent = Humanoid(  # <=========== Create humanoid agent
            communicator=self.communicator,
            position=spawn_location,
            direction=spawn_forward,
            config=self.config,
            map=self.map
        )
        self.communicator.spawn_agent(self.agent, name=None, model_path=agent_bp, type="humanoid")  # <=========== Spawn in UE
        self.target = Vector(1700, -1700)

        # ============ IMPORTANT: Get initial observation ============
        loc_3d = self.communicator.unrealcv.get_location(self.agent_name)  # <=========== Get agent position
        position = Vector(loc_3d[0], loc_3d[1])

        orientation = self.communicator.unrealcv.get_orientation(self.agent_name)  # <=========== Get agent orientation
        yaw = orientation[1]  # Yaw angle in degrees
        # Convert yaw to direction vector
        direction = Vector(math.cos(math.radians(yaw)), math.sin(math.radians(yaw)))

        ego_view = self.communicator.get_camera_observation(self.agent.camera_id, "lit")  # <=========== Get camera view

        observation = {
            'position': position,
            'direction': direction,  # unit vector
            'ego_view': ego_view     # RGB image
        }
        return observation

    def step(self, action):
        """Parse and execute action, return new observation and reward."""
        # ============ IMPORTANT: Execute humanoid movement commands ============
        if action.startswith("forward"):
            # Extract duration and execute forward movement
            self.communicator.humanoid_step_forward(self.agent.id, duration, direction=0)  # <=========== Move forward
        elif action.startswith("rotate"):
            # Extract angle and direction, execute rotation
            self.communicator.humanoid_rotate(self.agent.id, angle, direction)  # <=========== Rotate left/right
        # ... handle other actions ...

        # Get new observation and calculate reward
        # ... update position, direction, ego_view ...
        reward = -position.distance(self.target)  # negative distance
        return observation, reward, success

# 3. Main loop - observe, decide, execute
communicator = Communicator(UnrealCV())
agent = Agent()
env = Environment(communicator)

obs = env.reset()
print(f"Task: Navigate to target position {env.target}")

for i in range(100):
    # Agent decides next action based on observation
    action = agent.action(obs, env.target)
    print(f"Step {i+1}: Action = '{action}'")

    # Execute action and get new observation
    obs, reward, success = env.step(action)

    if success:
        print(f"  Position: {obs['position']}, Reward: {reward:.2f}")

        # Check if reached target
        if obs['position'].distance(env.target) < 200:
            print("Target reached!")
            break

⚙️ Setup

This section walks through the minimal setup to run SimWorld using our provided UE packages and the Python client. If you want to use your own custom environments, assets, or agent models, you can import them via .pak files. See Make Your SimWorld for instructions.

System Requirements: SimWorld requires Windows or Linux operating system, a dedicated GPU with ≥6GB VRAM, 32GB RAM, and 50-200GB disk space depending on the package. For detailed hardware requirements and recommendations, see the Device Requirement.

Installation

Step 1. Install the Python Client

Make sure to use Python 3.10 or later.

git clone https://github.com/SimWorld-AI/SimWorld.git
cd SimWorld
conda create -n simworld python=3.10
conda activate simworld
pip install -e .

Step 2. Download the UE Server Package

First, download and extract the Base UE server package for your OS. The Base package includes two lightweight city scenes and one empty map for quickly testing SimWorld’s core features, including core agent interaction and procedural city generation.

  • Base (required, 2 city maps and 1 empty map)

If you want more pre-built scenes for demos and diverse scenarios, you can optionally install Additional Environments (100+ Maps). This is an add-on map pack that extends the Base installation. Download the maps you need and copy the .pak files into the Base server folder at: SimWorld/Content/Paks/.

  • Additional Environments (optional, 100+ maps)

The Additional Environments package is organized as separate .pak files, so you can download only the maps you need. Please check the download and installation for usage instructions, including how to load specific maps and what each .pak contains.

Quick Start

We provide several examples of code in examples/, showcasing how to use the basic functionalities of SimWorld, including city layout generation, traffic simulation, asset retrieval, and activity-to-actions. Please follow the examples to see how SimWorld works.

Start the UE Server

Start the SimWorld UE server first, then run the Python examples. From the extracted UE server package directory:

  • Windows: double-click SimWorld.exe, or launch it from the command line:

    ./SimWorld.exe <MAP_PATH>
  • Linux: run:

    ./SimWorld.sh <MAP_PATH>

<MAP_PATH> refers to the Unreal Engine internal path to a map file (e.g., /Game/hospital/map/demo.umap). SimWorld's base binary contains 2 city maps and 1 empty map. See Base Environments for details. In addition, users can download 100+ additional environment paks. See the Additional Environments for the installation and complete list of available map paths. If <MAP_PATH> is not specified, the default map (/Game/Maps/demo_1) will be open.

📚 Configuration and API Reference

Configuration

SimWorld uses a YAML configuration file to control global simulator settings (e.g., seed, dt, UE blueprint paths) and module behaviors (e.g., city generation, traffic simulation, asset retrieval, and agent/LLM options).

For a comprehensive reference of all configuration parameters, see the Configuration Reference documentation.

We provide two configuration files to help you get started:

  • simworld/config/default.yaml contains the built-in defaults shipped with the package (reference/fallback). We recommend not editing this file.
  • config/example.yaml is a user template with placeholders for local paths. Copy it to create your own config.

If you want to customize SimWorld for your own setup, follow the steps below to create and load your own config:

  1. Create a custom config from the template:

    cp config/example.yaml config/your_config.yaml
  2. Modify the configuration values in your_config.yaml according to your needs.

  3. Load your custom configuration in your code:

    from simworld.config import Config
    config = Config('path/to/your_config')    # use absolute path here

API and Usage

Agent Action Space

SimWorld provides a comprehensive action space for pedestrians, vehicles, and robots (e.g., move forward, sit down, pick up). For more details, see actions and examples/ue_command.ipynb.

Using UE Cameras and Sensors

SimWorld supports a variety of sensors, including RGB images, segmentation maps, and depth images. For more details, please refer to the sensors and the example script examples/camera.ipynb.

Commonly Used APIs

All APIs are located in simworld/communicator. Some of the most commonly used ones are listed below:

🛠️ Make Your SimWorld

Bring your own Unreal Engine environments, assets, and agent models into SimWorld. This lets you add new maps, objects, and characters beyond the built-in library. For example, you can turn almost any idea into a playable world, such as a rainy campus, a night market, or a sci-fi city, and then drop agents into it to explore, interact, and learn. To import your content into SimWorld, package it as a custom .pak file. See full instructions in Make Your Own Pak Files.

🔮 Next Steps

The SimWorld framework is under active development. Future releases will include (see the Next Steps page for more details and contact information):

  • Plugin System: Support for importing user-defined custom environments and agents to extend SimWorld's capabilities (doc).
  • Comprehensive Agent Framework: A unified training and evaluation pipeline for autonomous agents (details).
  • Code Generation for Scenes: AI-powered coding agents capable of generating diverse simulation scenarios programmatically.
  • Interactive Layout Editor: Web-based interface for real-time city layout visualization and editing.
  • Arbitrary Natural Language → UE Actions: ground free-form language instructions into executable UE actions/tools (details).
  • RL Training Pipeline: provide a unified RL interface and training pipeline for SimWorld embodied tasks (details).
  • City-Scale Multi-Agent Simulation: support large-scale “city society” environments with 1K+ concurrent agents running in the same city (details).
  • Video-to-Scene Generation: Support generating simulation-ready UE scenes from input videos, including dynamic object reconstruction, scene layout inference, and asset placement consistent with the video context (details).
  • MuJoCo Integration: Integrate MuJoCo as an optional physics backend to enable high-frequency, high-fidelity simulation for robotics and control research while maintaining compatibility with existing SimWorld environments (details).
  • Expanded Agents, Actions, and Interactable Objects: Expand the simulator’s embodied ecosystem by introducing additional agent types (e.g., drones), richer and more standardized action spaces, and a broader set of interactable objects to support more diverse tasks and research settings (details).

🤝 Contributing

We welcome contributions from the community! Whether you want to report bugs, suggest features, or submit code improvements, your input is valuable. Please check out our Contributing Guidelines for details on how to get started.

⭐ Star History

Star History Chart

About

SimWorld: An Open-ended Realistic Simulator for Autonomous Agents in Physical and Social Worlds

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 9

Languages