Skip to main content
Pre-release

This release is a pre-release and may not be stable for production use.

UniEnv Genesis Lab

This repository contains the implementation of the adaptor that connects the Genesis simulation engine to the UniEnv's node system interface. It is designed as a full simulation framework in the spirit of mjlab and IsaacLab, bringing the same modular, composable scene-building philosophy to Genesis.

Node System

mjlab (MuJoCo's Python interface) and IsaacLab (NVIDIA's GPU-accelerated RL framework for Omniverse) both share a common idea: a simulation environment should be assembled from independent, reusable building blocks — robots, sensors, scene elements — each responsible for its own lifecycle. genesis_adaptor mirrors this philosophy for the Genesis engine, providing:

  • A node-based scene description system that lets you compose robots, sensors, and scene geometry declaratively.
  • A priority-ordered lifecycle that guarantees correct initialisation order without manual dependency management.
  • Pluggable controllers that decouple the physics entity from the control law, just as IsaacLab separates actuator models from robot assets.
  • Transparent batching so that the same node code runs identically on a single environment or thousands of parallelised GPU environments.

Lifecycle Phases & Priorities

Each lifecycle phase is executed by sorting all registered nodes by their declared priority for that phase and calling them in descending order. A higher priority number runs first.

Phase Purpose
reload Destroy the old scene; add geometry / entities to the new one.
after_reload Scene is compiled. Initialise controllers, cache entity handles.
reset Move entities back to their starting poses; clear queued actions.
after_reset Populate the first observation cache after reset.
pre_environment_step Apply the pending action to the physics engine.
post_environment_step Read back state and refresh the observation cache.

Typical priority assignments:

Priority Range Node Catgories
[80, 100) static scene geometry (planes, tables)
[50, 80) robots and articulated entities
(-20, 0] controllers and sensors that depend on entities
$\mathbb{Z}$ Task control logic can declare any priority to ensure it runs after all the necessary state has been updated by the controllers and sensors.

This means a floor plane is always added to the scene before a robot, and a camera that is attached to a robot link is always attached after the robot entity exists.

Composing a Scene

world  = GenesisWorld()
plane  = PlaneBuilder(world, name="floor")
table  = TableBuilder(world, name="table", pos=(0, 0, 0.6))
franka = FrankaFR3WithHand(world, name="franka", pos=(-0.7, 0, 0.6))
camera = CameraSensorNode(world, name="camera", ...)

env = WorldEnv(world, [plane, table, franka, camera])
context, obs, info = env.reset(seed=0, reload=True)
# obs = {
#   "franka": {"joint_position": ..., "eef_position": ..., ...},
#   "camera": {"rgb": ..., "depth": ...},
# }

WorldEnv calls each node's lifecycle methods in the correct priority order automatically. You do not manage dependencies by hand.

Articulated Rooms

Rooms furnished with fixed articulated furniture (RoboCasa kitchen cabinets, drawers and appliances; ReplicaCAD fridges, cupboards and doors; ArtVIP USD appliances; MolmoSpaces Ai2-THOR furniture; Lightwheel SimReady assets; NVIDIA SimReady Warehouse rigid props) are built by RoomBuilder (baked layouts or procedural sampling), and a single named joint of one furniture instance can be driven by OpenArticulatedJointTask — dense fraction-tracking reward, per-env goals, masked resets:

room = RoomBuilder(world, name="room", layout_yaml="robocasa_kitchen/open_kitchen")
task = OpenArticulatedJointTask(
    world, room, furniture_key="cabinet_hinge", joint_name="rightdoorhinge",
    grasp_link_name="cabinet_hinge_right_door_handle",
)
env = WorldEnv(world, [room, franka, task])

Procedural rooms sample from a catalog-backed furniture pool, e.g. make_artvip_pool(tags="kitchen", n=6) for the ArtVIP USD appliances, make_molmospaces_pool(tags="kitchen", n=6) for the MolmoSpaces THOR furniture, make_lightwheel_pool(tags="kitchen", n=6) for the Lightwheel SimReady assets or make_simready_warehouse_pool(tags="prop", n=8) for the Warehouse rigid props (see docs/articulated_rooms.md).

See docs/articulated_rooms.md for the API, the packaged assets (RoboCasa CC BY 4.0; ArtVIP is Apache-2.0 per its card with no committed LICENSE file — caveat there; ReplicaCAD and Lightwheel are CC BY-NC 4.0 — non-commercial, see the license caveats there; MolmoSpaces is CC BY 4.0 with attribution; the SimReady Warehouse card tags CC BY 4.0 but the archive commits no LICENSE file — caveat there) and how to regenerate them, plus the runnable examples/room_open_drawer_fr3.py.


Installation

Install from PyPI:

pip install unienv_genesis

Or install the adaptor locally from source:

git clone https://github.com/UniEnvOrg/genesis_adaptor/
cd genesis_adaptor
pip install -e .

Metadata

Release files for unienv-genesis 0.0.2a1

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

Source distribution (sdist)

Source distribution for unienv-genesis 0.0.2a1
File Size Uploaded
unienv_genesis-0.0.2a1.tar.gz 596.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for unienv-genesis 0.0.2a1
File Interpreter ABI Platform
unienv_genesis-0.0.2a1-py3-none-any.whl Python 3 none any Details

Total release size: 1.1 MB

Release files / unienv_genesis-0.0.2a1.tar.gz

Download URL unienv_genesis-0.0.2a1.tar.gz
Size 596.1 kB
Tags Source
SHA-256 checksum
How to use checksums
d839a1e020a42d969752577dde3456227a23db8db30373c4a961b667ed4fa5b9
BLAKE2b-256 checksum
How to use checksums
05ba16919a37070ba86eb10c4df1bb6e6805fe4199328f3c5e1f6f8036634776
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.

Transparency log

Release files / unienv_genesis-0.0.2a1-py3-none-any.whl

Download URL unienv_genesis-0.0.2a1-py3-none-any.whl
Size 454.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
ed7151f9196726c4bff0ca06d3219913b87bba5ee7ceda6dc615a8dee877ad6c
BLAKE2b-256 checksum
How to use checksums
9b968aaddd75a46b75dd8560c9c42291be1a4b9393eb148a9dc6aae2bbff8a51
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.

Transparency log
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