Skip to content

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

34 Commits

Folders and files

Repository files navigation

Intelligent Home Care Living Lab — Digital Twin

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. 截圖 2026-08-29 中午12 54 22 截圖 2026-08-29 中午12 53 33

Contents

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.

How it's layered (and how to layer on top)

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 reference nycu_lights.usdz directly for visuals-without-physics.
  • Downstream projects compose, never edit. Reference room.usd onto 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 ...

Usage

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")

Launching a local viewer

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.sh

It 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 calls open_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 — its DomeLight resolves to color_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 strips ROS_DISTRO, AMENT_PREFIX_PATH, CMAKE_PREFIX_PATH, COLCON_PREFIX_PATH, PYTHONPATH and LD_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")

Physics notes

  • Room colliders are static (no RigidBodyAPI on /Room/Temp) with physics:approximation = "none" — the exact triangle mesh is used for collision. Correct and cheap for an immovable environment. Do not put a RigidBodyAPI on 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 with convexHull colliders, washing_machine is a static none collider, and the remaining 16 (all sofa_*, 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).
  • PhysicsScene gravity = −Z, 9.81 m/s².

Notes

  • Textures are bundled inside nycu_lights.usdz and each assets/*.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 DomeLight resolves 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 ceiling RectLight.
  • 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.

Citation

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}
}

License

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.

About

No description, website, or topics provided.

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages