Skip to content

Commit 14efc99

Browse files
committed
wip
1 parent 9305232 commit 14efc99

6 files changed

Lines changed: 55 additions & 5 deletions

File tree

source/isaaclab/isaaclab/cli/commands/install.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,9 @@ def _install_extra_frameworks(framework_name: str = "all") -> None:
305305
"newton_actuators",
306306
"warp",
307307
"mujoco_warp",
308+
"websockets",
309+
"viser",
310+
"imgui_bundle",
308311
]
309312
"""Package directory names in Isaac Sim prebundle directories to repoint.
310313
@@ -352,7 +355,25 @@ def _repoint_prebundle_packages() -> None:
352355
print_warning(f"site-packages directory not found: {site_packages} — skipping prebundle repoint.")
353356
return
354357

355-
prebundle_dirs = list(isaacsim_path.rglob("pip_prebundle"))
358+
# Discover pip_prebundle directories from both the Isaac Sim tree and
359+
# Omniverse cache roots. Some Isaac Sim directories are symlinked into
360+
# ~/.local/share/ov and may be missed by a plain rglob() on _isaac_sim.
361+
candidate_roots: set[Path] = set()
362+
for root in (
363+
isaacsim_path,
364+
isaacsim_path.resolve(),
365+
isaacsim_path / "extscache",
366+
Path.home() / ".local" / "share" / "ov" / "data" / "exts",
367+
Path.home() / ".local" / "share" / "ov" / "data" / "exts" / "v2",
368+
):
369+
if root.exists():
370+
candidate_roots.add(root)
371+
candidate_roots.add(root.resolve())
372+
373+
prebundle_dirs: set[Path] = set()
374+
for root in candidate_roots:
375+
prebundle_dirs.update(root.rglob("pip_prebundle"))
376+
356377
if not prebundle_dirs:
357378
print_debug("No pip_prebundle directories found under Isaac Sim.")
358379
return

source/isaaclab/isaaclab/sim/simulation_context.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,11 @@ def update_visualizers(self, dt: float) -> None:
747747
visualizers_to_remove.append(viz)
748748
continue
749749
if viz.is_rendering_paused():
750+
# Keep non-Kit visualizer event loops responsive while rendering is paused.
751+
# KitVisualizer pumps app.update() and had historical pause/unpause issues
752+
# with zero-dt stepping, so skip it.
753+
if not viz.pumps_app_update():
754+
viz.step(0.0)
750755
continue
751756
while viz.is_training_paused() and viz.is_running():
752757
viz.step(0.0)

source/isaaclab/test/sim/test_simulation_context_visualizers.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ def __init__(
4545
training_paused_steps=0,
4646
raises_on_step=False,
4747
requires_forward=False,
48+
pumps_app_update=False,
4849
):
4950
self._env_ids = env_ids
5051
self._running = running
@@ -53,6 +54,7 @@ def __init__(
5354
self._training_paused_steps = training_paused_steps
5455
self._raises_on_step = raises_on_step
5556
self._requires_forward = requires_forward
57+
self._pumps_app_update = pumps_app_update
5658
self.step_calls = []
5759
self.close_calls = 0
5860

@@ -87,6 +89,9 @@ def get_visualized_env_ids(self):
8789
def requires_forward_before_step(self):
8890
return self._requires_forward
8991

92+
def pumps_app_update(self):
93+
return self._pumps_app_update
94+
9095

9196
def _make_context(visualizers, provider=None):
9297
ctx = object.__new__(SimulationContext)
@@ -136,11 +141,21 @@ def test_update_visualizers_removes_closed_nonrunning_and_failed(caplog):
136141
assert stopped_viz.close_calls == 1
137142
assert failing_viz.close_calls == 1
138143
assert paused_viz.close_calls == 0
139-
assert paused_viz.step_calls == []
144+
assert paused_viz.step_calls == [0.0]
140145
assert healthy_viz.step_calls == [0.1]
141146
assert any("Error stepping visualizer" in r.message for r in caplog.records)
142147

143148

149+
def test_update_visualizers_skips_zero_dt_for_paused_app_pumping_visualizer():
150+
provider = _FakeProvider()
151+
paused_app_pumping_viz = _FakeVisualizer(rendering_paused=True, pumps_app_update=True)
152+
ctx = _make_context([paused_app_pumping_viz], provider=provider)
153+
154+
ctx.update_visualizers(0.3)
155+
156+
assert paused_app_pumping_viz.step_calls == []
157+
158+
144159
def test_update_visualizers_handles_training_pause_loop():
145160
provider = _FakeProvider()
146161
viz = _FakeVisualizer(training_paused_steps=1)

source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ def initialize(self, scene_data_provider: BaseSceneDataProvider) -> None:
8686
("lookat", self.cfg.lookat),
8787
("cam_source", self.cfg.cam_source),
8888
("visualizer_camera_prim_path", self.cfg.visualizer_camera_prim_path),
89+
("focal_length", self.cfg.focal_length),
8990
("enable_visualizer_cam", self.cfg.enable_visualizer_cam),
9091
("num_visualized_envs", num_visualized_envs),
9192
("create_viewport", self.cfg.create_viewport),
@@ -321,6 +322,11 @@ def _create_and_assign_camera(self, usd_stage) -> None:
321322
camera_prim = usd_stage.GetPrimAtPath(camera_path)
322323
if not camera_prim.IsValid():
323324
UsdGeom.Camera.Define(usd_stage, camera_path)
325+
camera_prim = usd_stage.GetPrimAtPath(camera_path)
326+
327+
camera_geom = UsdGeom.Camera(camera_prim)
328+
if camera_geom:
329+
camera_geom.GetFocalLengthAttr().Set(float(self.cfg.focal_length))
324330

325331
if self._viewport_api:
326332
self._viewport_api.set_active_camera(camera_path)

source/isaaclab_visualizers/isaaclab_visualizers/kit/kit_visualizer_cfg.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ class KitVisualizerCfg(VisualizerCfg):
2525
visualizer_camera_prim_path: str = "/World/Cameras/KitVisualizerCamera"
2626
"""Dedicated camera prim path controlled by the Kit visualizer."""
2727

28+
focal_length: float = 12.0
29+
"""Focal length in millimeters applied to the dedicated visualizer camera."""
30+
2831
enable_visualizer_cam: bool = True
2932
"""Whether the Kit visualizer should control/bind a dedicated viewport camera.
3033

source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ def __init__(
5656
self._fallback_draw_controls = True
5757

5858
def is_training_paused(self) -> bool:
59-
"""Return whether training is paused by viewer controls."""
59+
"""Return whether physics is paused by viewer controls."""
6060
return self._paused_training
6161

6262
def is_rendering_paused(self) -> bool:
@@ -68,7 +68,7 @@ def _render_training_controls(self, imgui):
6868
imgui.separator()
6969
imgui.text("IsaacLab Controls")
7070

71-
pause_label = "Resume Training" if self._paused_training else "Pause Training"
71+
pause_label = "Resume Physics" if self._paused_training else "Pause Physics"
7272
if imgui.button(pause_label):
7373
self._paused_training = not self._paused_training
7474

@@ -110,7 +110,7 @@ def _render_ui(self):
110110
imgui.set_next_window_pos(imgui.ImVec2(320, 10))
111111

112112
flags = 0
113-
if imgui.begin("Training Controls", flags=flags):
113+
if imgui.begin("Physics Controls", flags=flags):
114114
self._render_training_controls(imgui)
115115
imgui.end()
116116
return None

0 commit comments

Comments
 (0)