From 38ab401153c6cd7780d9e9c4c7334e8d2358d1d5 Mon Sep 17 00:00:00 2001 From: Octi Zhang Date: Thu, 13 Aug 2026 22:12:02 -0700 Subject: [PATCH] Fix Factory collision prim resolution Resolve collision analyzer bodies through the clone plan instead of rewriting environment wildcard spellings. This keeps Factory compatible with segment-safe prim-path expressions. --- .../changelog.d/zhengyuz-factory-env-regex.rst | 4 ++++ .../contrib/nist/utils/collision_analyzer.py | 11 ++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 source/isaaclab_tasks/changelog.d/zhengyuz-factory-env-regex.rst diff --git a/source/isaaclab_tasks/changelog.d/zhengyuz-factory-env-regex.rst b/source/isaaclab_tasks/changelog.d/zhengyuz-factory-env-regex.rst new file mode 100644 index 000000000000..45af7994baa7 --- /dev/null +++ b/source/isaaclab_tasks/changelog.d/zhengyuz-factory-env-regex.rst @@ -0,0 +1,4 @@ +Fixed +^^^^^ + +* Fixed ``IsaacContrib-Factory-Franka`` startup with segment-safe environment prim-path expressions. diff --git a/source/isaaclab_tasks/isaaclab_tasks/contrib/nist/utils/collision_analyzer.py b/source/isaaclab_tasks/isaaclab_tasks/contrib/nist/utils/collision_analyzer.py index 803cc420587a..f26e278f7b44 100644 --- a/source/isaaclab_tasks/isaaclab_tasks/contrib/nist/utils/collision_analyzer.py +++ b/source/isaaclab_tasks/isaaclab_tasks/contrib/nist/utils/collision_analyzer.py @@ -12,7 +12,7 @@ import torch import warp as wp -from isaaclab.sim.utils import get_first_matching_child_prim +from isaaclab.sim.utils import resolve_matching_prims_from_source from isaaclab_tasks.contrib.nist.utils import mesh_ops as _mesh_ops from isaaclab_tasks.contrib.nist.utils.rigid_object_hasher import RigidObjectHasher @@ -52,14 +52,15 @@ def __init__(self, cfg: CollisionAnalyzerCfg, env: ManagerBasedRLEnv): self.body_ids = [] self.local_pts = [] for body_name in body_names: - prim = get_first_matching_child_prim( - self.asset.cfg.prim_path.replace(".*", "0", 1), + _, prim_path_pattern = resolve_matching_prims_from_source( + self.asset.cfg.prim_path, predicate=lambda p: p.GetName() == body_name and p.HasAPI(UsdPhysics.RigidBodyAPI), - ) + expected_num_matches=1, + )[0] local_pts = _mesh_ops.sample_object_point_cloud( num_envs=env.num_envs, num_points=cfg.num_points, - prim_path_pattern=str(prim.GetPath()).replace("env_0", "env_.*", 1), + prim_path_pattern=prim_path_pattern, device=device, ) if local_pts is not None: