Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion scripts/tutorials/04_sensors/run_ray_caster_camera.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def define_sensor() -> RayCasterCamera:

# Setup camera sensor
camera_cfg = RayCasterCameraCfg(
prim_path="/World/Origin_.*/CameraSensor",
prim_path="/World/Origin_[^/]+/CameraSensor",
mesh_prim_paths=["/World/ground"],
update_period=0.1,
offset=RayCasterCameraCfg.OffsetCfg(pos=(0.0, 0.0, 0.0), rot=(1.0, 0.0, 0.0, 0.0)),
Expand Down
4 changes: 1 addition & 3 deletions source/isaaclab/test/app/standalone_script_cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -265,9 +265,7 @@ class SmokeResult:
"scripts/tutorials/03_envs/run_cartpole_rl_env.py": ScriptOverride(readiness_pattern=r"Resetting environment"),
"scripts/tutorials/04_sensors/add_sensors_on_robot.py": ScriptOverride(args=("--enable_cameras",)),
"scripts/tutorials/04_sensors/run_ray_caster.py": ScriptOverride(visualizers=("none", "kit")),
"scripts/tutorials/04_sensors/run_ray_caster_camera.py": ScriptOverride(
args=("--enable_cameras",), visualizers=("none", "kit")
),
"scripts/tutorials/04_sensors/run_ray_caster_camera.py": ScriptOverride(visualizers=("none", "kit")),
"scripts/tutorials/04_sensors/run_usd_camera.py": ScriptOverride(visualizers=("none", "kit")),
"scripts/tutorials/07_visualizers/run_tiled_camera_visualizer.py": ScriptOverride(
readiness_pattern=r"Gym action space",
Expand Down
2 changes: 1 addition & 1 deletion source/isaaclab/test/app/test_standalone_scripts.py
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ def test_commands_respect_script_launcher_capabilities():
if case.spec.relative_path == "scripts/tutorials/04_sensors/run_ray_caster_camera.py"
and case.visualizer == "none"
)
assert "--enable_cameras" in ray_camera_case.command()
assert "--enable_cameras" not in ray_camera_case.command()

usd_camera_case = next(
case
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Fixed
^^^^^

* Fixed legacy Newton multi-mesh ray casters failing to associate tracked target sites when target discovery
produced a different path expression than site registration.
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,18 @@ class _LegacyNewtonRayCasterMixin(_NewtonRayCasterPoseMixin):

def __init__(self: Any, cfg):
super().__init__(cfg)
self._tracked_site_labels_by_target: dict[tuple[str, ...], list[str]] = {}
self._tracked_site_labels: list[list[str]] = []
self._tracked_target_index = 0
for target_cfg in getattr(self, "_raycast_targets_cfg", []):
if target_cfg.track_mesh_transforms:
owner_exprs = self._resolve_target_owner_exprs(target_cfg.prim_expr)
labels = self._register_target_sites_for_exprs(owner_exprs)
self._tracked_site_labels_by_target[tuple(owner_exprs)] = labels
self._tracked_site_labels.append(labels)

def _initialize_warp_meshes(self: Any) -> None:
"""Reset tracked-target association before creating mesh views."""
self._tracked_target_index = 0
super()._initialize_warp_meshes()

def _resolve_target_owner_exprs(self, prim_expr: str) -> list[str]:
"""Resolve mesh target expressions to owning rigid-body expressions."""
Expand Down Expand Up @@ -71,8 +77,8 @@ def _register_target_sites_for_exprs(self, owner_exprs: list[str]) -> list[str]:

def _create_tracked_target_view(self: Any, target_prim_path: str | list[str]) -> wp.array:
"""Resolve dynamic multi-mesh target sites to Newton site indices."""
target_exprs = target_prim_path if isinstance(target_prim_path, list) else [target_prim_path]
labels = self._tracked_site_labels_by_target[tuple(target_exprs)]
labels = self._tracked_site_labels[self._tracked_target_index]
self._tracked_target_index += 1
site_indices = self._resolve_site_indices(labels, str(target_prim_path), self._num_envs)
return wp.array(site_indices, dtype=wp.int32, device=self._device)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,13 @@
from isaaclab.assets import RigidObject, RigidObjectCfg
from isaaclab.scene import InteractiveScene, InteractiveSceneCfg
from isaaclab.sensors.camera import CameraCfg
from isaaclab.sensors.ray_caster import MultiMeshRayCaster, MultiMeshRayCasterCamera, RayCasterCamera, RayCasterCfg
from isaaclab.sensors.ray_caster import (
MultiMeshRayCaster,
MultiMeshRayCasterCamera,
MultiMeshRayCasterCfg,
RayCasterCamera,
RayCasterCfg,
)
from isaaclab.sensors.ray_caster.patterns import GridPatternCfg
from isaaclab.sim import SimulationCfg
from isaaclab.terrains import TerrainImporterCfg
Expand Down Expand Up @@ -162,6 +168,35 @@ def test_remaining_warp_mesh_factories_select_legacy_newton_adapters(sim):
assert MultiMeshRayCasterCamera.resolve_class() is LegacyMultiMeshRayCasterCamera


def test_legacy_multi_mesh_tracks_ad_hoc_regex_target(sim):
"""Tracked target registration remains valid when discovery returns concrete owner paths."""
obstacle_cfg = sim_utils.CuboidCfg(
size=(1.0, 1.0, 1.0),
rigid_props=sim_utils.RigidBodyBaseCfg(kinematic_enabled=True),
mass_props=sim_utils.MassPropertiesCfg(mass=1.0),
collision_props=sim_utils.CollisionBaseCfg(),
)
obstacle_cfg.func("/World/Origin_00/Obstacle", obstacle_cfg)

sensor_cfg = MultiMeshRayCasterCfg(
prim_path="/World/Origin_[^/]+/Obstacle",
mesh_prim_paths=[
MultiMeshRayCasterCfg.RaycastTargetCfg(
prim_expr="/World/Origin_[^/]+/Obstacle",
track_mesh_transforms=True,
)
],
pattern_cfg=GridPatternCfg(resolution=1.0, size=(0.0, 0.0)),
)
sensor = MultiMeshRayCaster(sensor_cfg)

sim.reset()
sensor.update(sim.get_physics_dt(), force_recompute=True)

assert sensor.num_instances == 1
assert sensor.data.ray_hits_w.shape[0] == 1


def test_bvh_refit_tracks_moving_geometry(sim):
"""Sliding a box under the sensor changes the hits, proving the BVH refits live."""
scene = InteractiveScene(RaycastTestSceneCfg(num_envs=1))
Expand Down
Loading