import mujoco
m = mujoco.MjModel.from_xml_path("assets/doors/db0002_swing_single/door.xml") # or door_simple.xml / door_minimal.xml-
scene.xmlincludesdoor.xmland sets statistics for the viewer. -
Meshes resolve via
meshdir="../../hardware"; keep the folder structure or edit<compiler meshdir>. -
Merge with a robot using
mujoco.MjSpec(seedoorbench/benchmark/env.py::DoorEnv._build). -
MJX: use
door_simple.xml/door_minimal.xml(primitives only, no tendon limits inminimal). -
Import / physics test over the generated dataset (one door per family + 20 seeded random doors; all tiers,
scene.xml,door.urdf, 500 free steps, QA hold / actuate / relatch / closer,DoorEnvepisode, clearance gate):pytest -q tests/test_mujoco_import.py # ~5 s; DOORBENCH_ASSETS=<dir> to test another dataset directory python scripts/demo_mujoco.py --ids db0002_swing_single --out /tmp/demo # video of a programmatic hand opening it
door.usda(full fidelity): default prim/<door_id>withEnv(static colliders + sites) andArticulation(UsdPhysics.ArticulationRootAPI, fixedbaselink joined to the world, one tree). Rigid bodies carry explicit mass properties; collision shapes are boxes/capsules/spheres + convex-hull meshes referenced fromassets/hardware/*.usdc; revolute/prismatic joints have limits, force drives carrying closer / latch / return springs (stiffness,damping,targetPosition), armature and Coulomb friction asphysxJointAxis:angular|linear:staticFrictionEffort(N·m / N, PhysX ≥ 5.6; the legacy load-dependentphysxJoint:jointFrictioncoefficient is authored 0). MJCF position servos of spring-less joints (automatic sliders) are the PhysX drive itself (doorbench:servo_in_drive); seedocs/ISAAC_LAB.mdfor the full MuJoCo → PhysX parameter mapping.door_rl.usda(canonical): the same 8 links / 7 joints for every door (door_slide,door_hinge,operator_hinge,operator_slide,latch_slide,leaf2_slide,leaf2_hinge; unused slots locked) so Isaac Lab'sMultiUsdFileCfgcan put a different door in every environment;doorbench:rlon the root describes the live slots, thresholds, grip points and sites.- Couplings are
PhysxMimicJointAPIon the driven joint only when both axes are rotational (hook ← handle, dog ← wheel): PhysX articulation mimic joints support rotational axes only and drop the rest silently. Thumbturn → deadbolt, wheel → bolts, cremone and riser ← hinge instead carrydoorbench:coupling_*on the driven joint prim (gearing, offset, the driven DOF's effective inertia, its passive law and gravity bias) plusdoorbench:coupling_reflected_armatureon the driver, so a consumer applies them bilaterally — driven joint tracked, reactionc₁·τ_drivenon the driver. Everything is also indoorbench:couplings(JSON). - Environment-released locks (mag lock, delayed egress, electric bolt, interlock) are breakable
UsdPhysics.FixedJointsbase → leafwithphysics:excludeFromArticulation,breakForce = breakTorque = holding_force_Nandphysics:jointEnabled(listed indoorbench:env_release); clearjointEnabledto release (doorbench_isaaclab.mdp.release_env_lock/DoorEnv._lock_logic). The one-sided latch coupling and the closer asymmetry stay environment logic (doorbench_isaaclab.mdp.DoorMechanismAction). - Self-collision is on (
physxArticulation:enabledSelfCollisions), withPhysxFilteredPairsAPIfor every pair MuJoCo suppresses (same weld body, weld parent/child,<contact><exclude>), so latches that hold one moving link against another (swing pairs, lift pins, drop bolts) behave as in MuJoCo. - Ready-made Isaac Lab tasks, training / evaluation / hero-shot scripts and a one-command GPU-box setup:
docs/ISAAC_LAB.md, isaaclab/README.md. Static validation of every USD:
python scripts/isaaclab/validate_usd_static.py(1000/1000 pass); Isaac Sim import validation:bash isaaclab/cloud/validate.sh(GPU).
door.urdf: root linkworld_env(frame + walls), leaf joints (revolute/prismatic) with<dynamics damping friction>and<limit>. Joint zero is the spec's initial state (doorbench:zero_offset).- Springs (
doorbench:spring), closers (doorbench:closer), ratchets, welds and loop closures are extension elements — apply them with your simulator's joint-spring API. <mimic>couplings are bilateral; the latch bolt follows the operator.
import genesis as gs
scene = gs.Scene()
door = scene.add_entity(gs.morphs.URDF(file="assets/doors/db0002_swing_single/door.urdf", fixed=True))blender/render_door.py (Blender 4.x/5.x, headless) rebuilds a door from model.json with Poly Haven CC0 PBR textures
referenced by spec.leaf.finish.texture / material ids, glass & mirror shaders, and an HDRI, and renders the
catalogue "hero" images.