A USD digital twin of the Intelligent Home Care Living Lab (alias: NYCU Room 305), built by the Human-centered Intelligent System Lab (HCIS Lab) — GitHub @HCIS-Lab · HF @hcislab. Authored for NVIDIA Isaac Sim 5.1.
This is a foundation twin: the room shell plus the fixed furniture that actually stands in it —
no robot, no task props. Every project references it and layers its own content on top (a robot,
graspables, sensors) without editing the twin. That keeps one canonical, physics-ready room shared
across projects.

room.usd # ← ENTRY POINT. Thin top composition: Z-up / meters / kg,
# references the visual layer + sublayers the collider layer,
# adds a PhysicsScene and the ceiling RectLight.
nycu_lights.usdz # VISUAL layer — geometry (443 meshes, ~188k pts) + 417 materials
# + bundled textures + DomeLight. No physics. Self-contained.
room_collider.usd # COLLIDER layer — an overlay that adds CollisionAPI (approx=none)
# to every room mesh + a ground physics material bound at /Room.
assets/ # FURNITURE — 13 self-contained .usdz (geometry + bundled textures),
# payloaded by room.usd as 23 placed prims under /Room.
tools/ # not part of the twin — launch_isaac.sh + isaac_startup.py open
# room.usd in a local Isaac Sim 5.1 GUI (see Usage).
robots/ # not part of the twin — fetch.sh pulls pinned third-party robot
# USD (Stretch 3, Kinova Gen3, Agility A1); see robots/README.md.
room.usd composes nycu_lights.usdz, room_collider.usd and assets/*.usdz by relative
paths, so those files must stay side by side.
Scene stats (Isaac Sim 5.1): 747 meshes (~1.92M points), 660 materials, a DomeLight + RectLight,
692 colliders. Approx extent 12.1 × 7.0 × 3.4 m.
The file split follows the layering conventions NVIDIA recommends for simulation-ready USD assets (Isaac Sim asset-structure tutorial, Omniverse USD structure & assembly guide):
- Geometry/visuals live in a binary layer (
nycu_lights.usdz— crate geometry + textures, efficient to load, never hand-edited), while physics lives in a separate ASCII overlay (room_collider.usd— human-readable, diffable, editable without touching geometry). - A thin top composition (
room.usd) is the only entry point: it references the visual layer, sublayers the collider overlay, and owns scene-level facts (stage units, up-axis,PhysicsScene, the ceiling light). You can also referencenycu_lights.usdzdirectly for visuals-without-physics. - Downstream projects compose, never edit. Reference
room.usdonto a prim in your stage and add your robot/furniture/props as sibling prims (or your own sublayers). USD's composition arcs mean the twin stays byte-identical while every project sees its own decorated version of the room:
from pxr import Usd, UsdGeom
stage = Usd.Stage.CreateNew("my_project_scene.usd")
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.z)
UsdGeom.SetStageMetersPerUnit(stage, 1.0)
room = UsdGeom.Xform.Define(stage, "/World/Room")
room.GetPrim().GetReferences().AddReference("/path/to/Intelligent-Home-Care-Living-Lab/room.usd")
# ... now add /World/Robot, /World/Furniture, /World/Props as your own prims ...Clone the repo and open the entry point in Isaac Sim 5.1:
import omni.usd
omni.usd.get_context().open_stage("/path/to/Intelligent-Home-Care-Living-Lab/room.usd")tools/launch_isaac.sh starts a local Isaac Sim 5.1 GUI with the twin already loaded and the
camera inside the room:
tools/launch_isaac.sh # opens room.usd
ISAACSIM_PATH=/opt/isaacsim tools/launch_isaac.sh # non-default install
IHCLL_STAGE=/path/to/other.usd tools/launch_isaac.shIt exists because three things about this scene make a bare isaac-sim.sh misleading:
- A positional USD path does not open a stage. You get an anonymous stage and a black
window. The launcher passes
--exec tools/isaac_startup.py, which callsopen_stage_async()a few frames after startup, once the viewport and hydra extensions are up. - Outside the room is black, and that is where the default camera starts. The twin is a
closed box lit only by the ceiling
RectLight— itsDomeLightresolves tocolor_0C0C0C.exr, a near-black constant (RGB 12,12,12) that contributes almost nothing — so an exterior camera renders pure black on a scene that loaded perfectly. The startup hook frames an interior pose, picking the position with the most measured clearance from the furniture: corner arithmetic once parked the camera 0.06 m from the fridge, which renders every bit as black as being outside. - System ROS breaks the bundled
rclpy./opt/ros/*is python3.10 while the Isaac ROS bridge ships a python3.11 build, so the launcher stripsROS_DISTRO,AMENT_PREFIX_PATH,CMAKE_PREFIX_PATH,COLCON_PREFIX_PATH,PYTHONPATHandLD_LIBRARY_PATH.
Three flags are set: --/exts/isaacsim.core.throttling/enable_async=false (the throttling
extension flips /app/asyncRendering on timeline-stop, which stalls Replicator captures),
--/renderer/activeGpu=0 (override with IHCLL_GPU; it is only honoured at launch), and
--/app/omni.usd/storeCameraSettingsToUsdStage=false, which makes Ctrl+S safe: without it
every save writes the current viewport camera into room.usd's customLayerData, and the
foundation layer other projects reference should not carry a stray camera. Saving is
otherwise unaffected.
Set IHCLL_STATUS=/path/status.json to have the hook write {"ok", "stage", "camera", "eye", "target", "clearance_m", "objects", "unmeasured", "extent_m"} once the stage is open — useful
for scripted or CI launches. clearance_m is the distance from the camera to the nearest object
(null if there was nothing to measure); if it ever comes back near zero the view is inside the
furniture and will look like a failed launch. unmeasured lists payloaded prims that produced no
bounding box — a non-empty list means the clearance search was reading their floor as free.
A second Isaac Sim can run alongside another one, but it cannot take the omni.kvdb
shader-cache lock, so its first frames compile cold and can look flatter until they warm up;
the launcher prints a note when it detects this.
The twin is also published as a Hugging Face dataset —
hcislab/digital-twin:
from huggingface_hub import snapshot_download
path = snapshot_download(repo_id="hcislab/digital-twin", repo_type="dataset")- Room colliders are static (no
RigidBodyAPIon/Room/Temp) withphysics:approximation = "none"— the exact triangle mesh is used for collision. Correct and cheap for an immovable environment. Do not put aRigidBodyAPIon the room shell: it makes all 443 room meshes one dynamic body, and the room falls through the world on Play. - Furniture physics is incomplete. 6 prims (
big_fridge,big_work_table,rack,wall_table,rchair_1,rchair_02) are dynamic rigid bodies withconvexHullcolliders,washing_machineis a staticnonecollider, and the remaining 16 (allsofa_*,chair_0*,chair_1,small_work_table,workstation) carry no collider at all — a robot drives straight through them. Add what your project needs in your own layer. - Ground physics material
/Room/PhysicsMaterials/Ground:staticFriction 0.9,dynamicFriction 0.8,restitution 0. Generic and project-neutral — bound at/Room(inherits to all room colliders). PhysicsScenegravity = −Z, 9.81 m/s².
- Textures are bundled inside
nycu_lights.usdzand eachassets/*.usdz, and resolve via relative paths — all 117 asset paths on the composed stage resolve on disk, with no network or Omniverse Nucleus connection required. - The
DomeLightresolves to the bundled./textures/color_0C0C0C.exr, a near-black constant (RGB 12,12,12). It contributes almost nothing: the room is lit by the ceilingRectLight. - Verified to open cleanly in Isaac Sim 5.1 from a fresh clone, and to load (747 meshes + colliders) when referenced by a downstream scene.
If you use this digital twin, please cite it (a machine-readable CITATION.cff is included):
@misc{hcislab_ihcll_2026,
title = {Intelligent Home Care Living Lab Digital Twin},
author = {{Human-centered Intelligent System Lab}},
year = {2026},
howpublished = {Hugging Face dataset},
url = {https://huggingface.co/datasets/hcislab/digital-twin},
note = {NVIDIA Isaac Sim 5.1 USD digital twin; alias NYCU Room 305}
}CC BY-NC 4.0 (Creative Commons Attribution-NonCommercial 4.0) — see LICENSE.
- ✅ Share and adapt for non-commercial research/education, with attribution (cite as above).
- ❌ No commercial use without separate permission from the lab. For commercial licensing, contact hcislab01@gmail.com.
Note: robots/ is not covered by this licence — those files are third-party assets fetched from their
own upstreams (NVIDIA Isaac Sim asset library, hello-robot/stretch_isaacsim) and governed by their own
licences; they are not redistributed here. See robots/README.md.