Skip to main content

ovfmi — FMI/SSP co-simulation for OpenUSD digital twins

Load FMI behavior models from an OpenUSD stage, step them with FMPy, and synchronize simulation data through a reusable Python API.

Pre-release. The API and the USD-FMI schema may change between minor versions.

What ovfmi does

USD describes world state; FMI and SSP supply simulation behavior. ovfmi joins them through a custom USD schema, so a single USD layer can describe both a scene and its simulation model in a form that stays readable and composable by USD tools.

Applications use the Python API to discover FmuInstance and SspInstance prims, instantiate their referenced models through FMPy, route values between model variables and USD attributes, and advance the models.

  • Declaratively embed individual FMUs and packaged SSP systems in USD.
  • Run FMI 2.0 and FMI 3.0 co-simulation models through the FMPy backend, plus SSP 1.0 archives whose internal FMUs meet FMPy's version constraints.
  • Map FMI variables to USD attributes, including selected vector components and ranges.
  • Step deterministically and synchronously, with explicit data routing.

It is aimed at digital-twin, controls and robotics engineers bringing vendor-neutral FMUs and SSPs into USD-based workflows, and at integrators assembling standards-based simulation applications.

Requirements

  • Python 3.10 to 3.13, on Linux or Windows.
  • FMPy and NumPy, which install with this package.
  • An OpenUSD-capable environment for the stage the models are bound to.

The NVIDIA Omniverse libraries — ovstage, ovrtx and ovphysx — are deliberately not dependencies. They are needed only by the sample application, which ships with the source rather than in this package.

Installation

python -m pip install ovfmi

Quickstart

Import supported symbols directly from ovfmi. The package's __all__ is the compatibility boundary; submodules and names beginning with an underscore are implementation details.

from ovfmi import AttributeWrite, FmiHost

with FmiHost() as fmi:
    report = fmi.attach_ovstage(stage, source_asset=usd_path)
    fmi.update_from_ovstage(input_ordinal, input_ordinal)
    fmi.write(
        [
            AttributeWrite(
                prim_paths=("/World/Body",),
                attribute_name="sim:input",
                values=[[1.0]],
            )
        ]
    )
    fmi.step_sync(1.0 / 60.0)

    with fmi.read() as result:
        consume_outputs(result.groups)

The public symbols are:

Symbol Purpose
FmiHost Owns FMI/SSP instances, routing state and simulation lifecycle for one caller-owned ovstage.
FmiHostConfig Configures discovery, schema validation, SSP support and missing-input behavior.
MissingInputPolicy Selects how unavailable mapped inputs are initialized.
PopulationReport, InstanceInfo Describe instances created during attachment.
AttributeWrite Supplies input values identified by USD prim path and attribute name.
ReadResult, ReadGroup Provide an owned snapshot of output values in USD space.

Every public class and method carries detailed docstrings covering ownership, filtering, operation tokens, ordinals and backend semantics. The present FMPy backend is synchronous, but step() and write() still use the backend-neutral completion-token lifecycle, so an asynchronous backend would not change calling code.

Known limitations

Schema discovery needs the original USD file. The currently supported ovstage release does not expose data authored with unregistered custom schemas, which includes the USD-FMI FmuInstance, SspInstance, FmuConnection and FmuMapping prims, so instances cannot be discovered from a populated ovstage alone. FmiHost.attach_ovstage() therefore accepts the source file through its source_asset argument and pre-parses it with OpenUSD in an isolated helper process. Simulation values still flow through the caller-owned ovstage; the auxiliary parse supplies only the schema description and initial authored values.

Standards and references

License

Apache-2.0. Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES.

Release files for ovfmi 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Built distribution (wheel)

Table of built distributions (wheels) for ovfmi 0.2.0
File Interpreter ABI Platform
ovfmi-0.2.0-py3-none-any.whl Python 3 none any Details

Release files / ovfmi-0.2.0-py3-none-any.whl

Download URL ovfmi-0.2.0-py3-none-any.whl
Size 31.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
54690c27e3a63e88f5c86e4409458547d8c3a7fc701e77bb389d78826aab128d
BLAKE2b-256 checksum
How to use checksums
5bf16d49c5001b7748915bb7bbbbc5e79346387a0b1ef3cefcc1842f3e1f40e3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.14.6

Release history Release notifications | RSS feed

This release

0.2.0 This release

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page