Skip to content

General Visualizer Fixes#5935

Open
matthewtrepte wants to merge 15 commits into
isaac-sim:developfrom
matthewtrepte:mtrepte/debug
Open

General Visualizer Fixes#5935
matthewtrepte wants to merge 15 commits into
isaac-sim:developfrom
matthewtrepte:mtrepte/debug

Conversation

@matthewtrepte
Copy link
Copy Markdown
Contributor

@matthewtrepte matthewtrepte commented Jun 3, 2026

Description

Fixes

  • remove legacy isaaclab_visualizers/setup.py
  • fix too small ground plane mesh in Rerun and Viser visualizers in some envs
  • fix flickering ground in Viser visualizer
  • fix library conflict with imgui_bundle, which broke Newton viewer's HUD
  • expand viz test to include a specific check for imgui_bundle failure to load (this often occurs due to new conflict libraries which causes Newton visualizer HUD to break)
  • prevent log spam from [Warning] [omni.physx.tensors.plugin] Failed to find rigid body...
  • add contact arrows to newton visualizer with a limitation note to the visualization docs
  • fix an edgecase where wrong viz marker prototype is used when marker count equals number of prototype
  • move the xr visualization test from test/visualization -> test/xr_visualization to separate it more from test/visualizers

Type of change

  • Bug fix (non-breaking change which fixes an issue)

Screenshots

Please attach before and after screenshots of the change if applicable.

Checklist

  • I have read and understood the contribution guidelines
  • I have run the pre-commit checks with ./isaaclab.sh --format
  • I have made corresponding changes to the documentation
  • My changes generate no new warnings
  • I have added tests that prove my fix is effective or that my feature works
  • I have updated the changelog and the corresponding version in the extension's config/extension.toml file
  • I have added my name to the CONTRIBUTORS.md or my name already exists there

@github-actions github-actions Bot added bug Something isn't working isaac-lab Related to Isaac Lab team infrastructure labels Jun 3, 2026
Copy link
Copy Markdown

@isaaclab-review-bot isaaclab-review-bot Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Review: General Visualizer Fixes

Thanks for cleaning up the visualizer stack! The infinite-plane expansion, improved error messages, and imgui dependency checks are all solid improvements. A few items worth discussing:

Summary of Findings

# Severity File Finding
1 🟡 Medium visualizer_cfg.py Default tiled_cam_view changed from FalseTrue — potential breaking behavior change
2 🟡 Medium newton_adapter.py expand_infinite_plane_scale replaces both axes even when only one is non-positive
3 🟢 Low rerun_visualizer.py / viser_visualizer.py log_geo override is duplicated verbatim between both viewers
4 🟢 Low pyproject.toml pyarrow==22.0.0 exact pin may conflict with user environments
5 🟢 Low CI changelog fragments and pre-commit checks are currently failing

Update (126f197)

New commits address the main concerns:

  • Finding 1 Fixed: tiled_cam_view default reverted to False — no breaking behavior change.
  • Finding 2 Fixed: expand_infinite_plane_scale now preserves valid dimensions independently (only replaces non-positive axes).
  • Finding 3 Fixed: Shared log_geo_with_expanded_plane_scale helper extracted to newton_adapter.py — DRY.
  • HUD warning Fixed: Module-level NEWTON_HUD_IMPORT_LOG_WARNING constant now shared between visualizer and integration tests.

New additions in this push (scene-data backend hook for articulation transforms in physx_manager.py, video recorder multi-visualizer warning, Viser plane-grid caching, docs clarifications) look clean. No new issues found in the incremental changes. 👍


Update (feb7046)

Large batch of changes unrelated to the visualizer fixes — primarily task/env architecture refactoring. Visualizer-specific changes in this push are limited to:

  • isaaclab_visualizers version bump (0.1.0 → 0.1.1) and changelog consolidation from fragments
  • Test import path update (CartpoleCameraPresetsEnvCfgCartpoleCameraEnvCfg) following the cartpole task refactor

No new visualizer-specific issues. The broader changes (Newton SDF collision API, cartpole camera consolidation to channel-first output, isaaclab_experimental lazy-export refactoring, TacSL PhysX migration, cloner nested-template fix, RSL-RL CNNModel for image-only policies) are well-structured and follow established patterns. LGTM on the visualizer portions. 👍


Update (2c8bbd9)

Documentation and changelog formatting fixes only:

  • Added notes in visualization.rst clarifying that tiled_cam_target_prim_path and tiled_cam_prim_path defaults may need adjustment per environment
  • Reformatted all changelog fragments to proper RST structure with category headers (Changed, Fixed, Added)

CI Status: pre-commit ✅ and changelog fragments ✅ are now passing — original Finding 5 resolved.

No functional code changes. No new issues. 👍


Update (8b40ba0)

Import-hygiene cleanup only: moved eager submodule imports (mdp, ui in envs; patterns in ray_caster) into the lazy .pyi stubs. No functional changes. No visualizer impact. No new issues. 👍


Update (800d24e)

Newton contact visualization feature and CI link-checker fixes:

  • Contact rendering pipeline: NewtonVisualizer.step() now logs native Newton contact buffers via NewtonManager.get_contacts(), with a PhysX fallback that renders Isaac Lab ContactSensor data as synthesized arrows. Good progressive-enhancement design.
  • Scene data hook: SceneDataProvider.get_contact_sensors() added with lazy BaseContactSensor import — clean and avoids hard dependency.
  • NewtonManager.get_contacts() — minimal public accessor, follows existing API style.
  • Env-filtering: _filter_visible_env_tensor correctly applies _resolved_visible_env_ids to sensor tensors, consistent with the existing visible-worlds system.
  • Tests: Two new tests cover native path (monkeypatched get_contacts returns object) and fallback path (verifying show_contacts toggle and arrow geometry).
  • Docs: New "Newton Contact Visualization" section in visualization.rst clearly documents the backend difference.
  • CI: Added link exclusions for unreachable/flaky URLs in check-links.yml.

No new issues. Implementation is well-structured with proper defensive error handling throughout. 👍


Update (7895ff9)

Final cleanup and polish:

  • Docs: Removed a duplicate paragraph in record_video.rst about multi-visualizer recording, and reformatted line wrapping in visualization.rst for readability (no content change).
  • Code cleanup: Removed the NEWTON_HUD_IMPORT_LOG_WARNING constant and _log_newton_hud_dependency_issue() helper from newton_visualizer.py — this HUD dependency check has been simplified/deferred. Tests updated accordingly (assert_no_newton_hud_dependency_warningassert_no_newton_imgui_bundle_warning).
  • Exports: Cleaned up newton/__init__.py lazy-export stubs to remove the deleted constant.

Purely cosmetic/refactoring changes, no functional impact. PR looks ready to merge. 👍


Update (7abba9e)

CI fixes:

  • Updated typing_extensions license identifier to PSF-2.0 in .github/workflows/license-exceptions.json
  • Removed erroneous Tiled Rendering toctree entry from docs/index.rst (was causing Sphinx warnings)

No functional code changes. No new issues. 👍


Update (e9f31a4)

Documentation formatting and Newton physics tuning:

  • Docs: RST syntax fixes — replaced :py:keyword: with inline literal, changed :ref:contributing to `:doc:`contributing for correct cross-referencing, and reformatted a long bullet paragraph in visualization.rst.
  • Physics config: Spot flat-env Newton config tuned — increased njmax (45→130) and nconmax (30→40), added NewtonCollisionPipelineCfg(max_triangle_pairs=2_500_000), NewtonShapeCfg(margin=0.01), and use_mujoco_contacts=False. Reasonable parameter tuning for more complex contact scenarios.

No functional visualizer changes. No new issues. 👍


Update (686ebc6)

Release prep and housekeeping push — version bumps, changelog consolidation, and a handful of focused fixes:

Visualizer fix (regression #5262):

  • VisualizationMarkers.visualize() now tracks _has_visualized so the first call with marker count == prototype count correctly defaults to prototype index 0 instead of skipping index assignment. New test covers the regression case.

PhysX scene-data backend simplification:

  • Removed the articulation-transform special-casing from PhysxManager — the rigid body view now includes articulation links directly. Wildcard pattern generation is smarter: exact paths are used when a body name collides with a non-rigid prim, preventing PhysX from resolving wildcards incorrectly.
  • Removed dead SceneDataBackend.set_interactive_scene() hook and its call in simulation_context.py.

Newton ls_parallel deprecation:

  • MJWarpSolverCfg.ls_parallel now emits DeprecationWarning and is force-set to False. Manager ignores it via the ignored set. All task/test configs cleaned of the field. Docs updated to remove parallel line search references.

Other:

  • Pinned ovphysx==0.4.13 in pyproject + CI to avoid breaking API changes from newer releases.
  • Removed obsolete scripts/tools/wrap_warp_to_torch.py migration helper.
  • CI license-check migrated to uv for faster installs.
  • Benchmark script wraps first step in torch.inference_mode().
  • Docs: isaaclab_docs.py resolves branch from smv_current_version for versioned docs, camera demo subtitles fixed, toctree entry corrected.
  • Version bumps: isaaclab 6.3.0, isaaclab_newton 0.15.0, isaaclab_rl 0.6.0, isaaclab_tasks 2.0.2, isaaclab_contrib 0.4.2, isaaclab_experimental 0.1.1.

No new issues. Clean release cut. 👍


Update (79c98a8)

PR feedback iteration — final polish addressing reviewer comments:

  • Docs: Fixed RST table formatting in visualization.rst (camera-mode column width), corrected :py:keyword: → literal markup, :ref::doc: cross-references in migration.rst.
  • Visualizer cfg docs: Expanded existing-camera-mode table entry to clarify that tiled_cam_prim_path requires environments with Isaac Lab Camera sensors registered in scene.sensors (e.g. Isaac-Cartpole-Camera vs plain Isaac-Cartpole).
  • Code: No functional changes beyond what was reviewed in 686ebc6.

No new issues. PR is clean. 👍


Update (b470716)

Minor housekeeping:

  • license-exceptions.json: typing_extensions license string updated from PSF-2.0 to Python Software Foundation License (full name form for compliance tooling).
  • simulation_context.py: Docstring clarification on register_interactive_scene — "scene-data providers can expose scene-owned sensors" (more accurate description of the data flow direction).

No functional changes. No new issues. 👍


Update (243f43a)

Cosmetic cleanup only:

  • simulation_context.py: Removed hyphen in docstring ("scene-data" → "scene data")
  • test_visualization_markers.py: Removed inline comment referencing regression case #5262 (the test itself remains)
  • pyproject.toml: Added explanatory comments for the pyarrow==22.0.0 pin ("Match rerun-sdk's supported Arrow stack and avoid resolver drift")

No functional changes. No new issues. 👍


Update (35e470b)

Livestream safety guards:

  • app_launcher.py: New ValueError raised when isaacsim.exp.full.streaming.kit experience is used with livestreaming enabled (modes 1/2) — prevents a known hang/PhysX tensor invalidation issue.
  • sim_launcher.py: Added _get_livestream_mode() (CLI-over-env precedence) and _ensure_livestream_kit_visualizer() — auto-injects the Kit visualizer when livestreaming is active, or raises if --viz none was explicitly set. Integrated into launch_simulation().
  • Tests: 3 new tests in test_kwarg_launch.py (experience rejection absolute/relative + pass-through when disabled) and a new test_sim_launcher.py with 5 tests covering kit-injection, append, rejection, env-var, and no-op cases.

Clean implementation, good test coverage, follows existing CLI-over-env patterns. No new issues. 👍


# Tiled camera settings
tiled_cam_view: bool = False
tiled_cam_view: bool = True
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Behavior change: Changing the default from False to True means all visualizer users will now get tiled camera views by default, even if their environment has no Camera sensors. Combined with the improved error message in camera_view.py, this could surface RuntimeError for existing configurations that previously worked (because tiled cam was off).

Was this intentional? If so, consider mentioning it in the changelog fragment as a behavior change rather than just a bug fix, so downstream users are aware.

Suggested change
tiled_cam_view: bool = True
tiled_cam_view: bool = True

Comment thread source/isaaclab_visualizers/isaaclab_visualizers/newton_adapter.py
"imgui-bundle>=1.92.5",
"typing-extensions>=4.15.0",
]
rerun = [
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Nit: pyarrow==22.0.0 is a very tight pin. If this is inherited from the old setup.py for compatibility with rerun-sdk, consider documenting why this exact version is required (e.g. a compatibility note), or relaxing to pyarrow>=22.0.0,<23 if rerun supports a range. Exact pins can cause resolution conflicts in larger environments.

"Install isaaclab-visualizers[newton] or fix its transitive dependencies "
"(for example typing-extensions>=4.15.0). ImportError: %s",
exc,
)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Minor: The warning message string here ("[NewtonVisualizer] Newton HUD disabled: failed to import imgui_bundle.") differs from the sentinel string checked in the integration test (_NEWTON_HUD_IMPORT_LOG_WARNING = "Newton Visualizer HUD disabled: failed to import imgui_bundle. This can be caused by conflicting libraries."). The test's sentinel won't match this actual warning.

Double-check that _NEWTON_HUD_IMPORT_LOG_WARNING in visualizer_integration_utils.py exactly matches the logged message, or use a substring that's guaranteed to appear in both.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented Jun 3, 2026

Greptile Summary

This PR fixes several visualizer issues: infinite ground planes now render at a proper large finite size in Rerun and Viser by overriding log_geo in both viewer subclasses; the Newton HUD dependency check adds an early imgui_bundle import probe with actionable log output; error messages for missing camera sensors are improved; the legacy setup.py is removed; and typing-extensions>=4.15.0 / pyarrow==22.0.0 are added to the affected extras.

  • Ground-plane fix: new expand_infinite_plane_scale helper in newton_adapter.py is called from log_geo overrides in both NewtonViewerRerun and NewtonViewerViser, converting Newton's non-positive "infinite" plane convention to a 1000 m finite mesh.
  • HUD dependency probe: _log_newton_hud_dependency_issue() is called at NewtonVisualizer init to surface imgui_bundle import failures early, but the warning-string constant in the test helper does not match the actual warning text, so the log-based regression check is inert.
  • Default change: tiled_cam_view default was flipped from False to True in VisualizerCfg, enabling tiled camera creation for all visualizer users who do not explicitly opt out, which is unmentioned in the changelog.

Confidence Score: 3/5

Two changes need attention before merging: the _NEWTON_HUD_IMPORT_LOG_WARNING constant is mismatched with the actual warning text making the new regression detector a no-op, and tiled_cam_view was silently flipped to True as the default changing behavior for all existing visualizer users.

The ground-plane and HUD-probe changes are well-structured and tested. However, the integration-test helper added to catch imgui_bundle failures will never fire because the substring it checks does not appear anywhere in the codebase. Additionally, the silent flip of tiled_cam_view changes the out-of-the-box behavior of every VisualizerCfg subclass without a changelog note.

source/isaaclab_visualizers/test/visualizer_integration_utils.py (broken warning constant) and source/isaaclab/isaaclab/visualizers/visualizer_cfg.py (default-value flip).

Important Files Changed

Filename Overview
source/isaaclab_visualizers/test/visualizer_integration_utils.py Added assert_no_newton_hud_dependency_warning helper with a broken _NEWTON_HUD_IMPORT_LOG_WARNING constant that will never match the actual warning text emitted by newton_visualizer.py, rendering the imgui_bundle regression check inoperable.
source/isaaclab/isaaclab/visualizers/visualizer_cfg.py Default for tiled_cam_view silently flipped from False to True, enabling tiled camera creation by default for all VisualizerCfg subclasses without a changelog entry.
source/isaaclab_visualizers/isaaclab_visualizers/newton_adapter.py Added expand_infinite_plane_scale utility that converts Newton non-positive infinite plane extents to a large finite size for web viewers; logic is correct and well-tested.
source/isaaclab_visualizers/isaaclab_visualizers/newton/newton_visualizer.py Added _log_newton_hud_dependency_issue() pre-flight check called at viewer init to surface imgui_bundle import failures with actionable guidance.
source/isaaclab_visualizers/isaaclab_visualizers/rerun/rerun_visualizer.py Added log_geo override in NewtonViewerRerun to expand infinite-plane extents before delegating to the parent, fixing the small ground plane issue in Rerun.
source/isaaclab_visualizers/isaaclab_visualizers/viser/viser_visualizer.py Added equivalent log_geo override in NewtonViewerViser to expand infinite-plane extents; mirrors the Rerun fix correctly.
source/isaaclab_visualizers/pyproject.toml Added typing-extensions>=4.15.0 to newton extra and pyarrow==22.0.0 to rerun/all extras.
source/isaaclab/isaaclab/envs/utils/camera_view.py Improved find_camera_by_prim_path error messages: empty-sensor-dict case now gives a dedicated actionable error with available sensor paths listed.
source/isaaclab_visualizers/setup.py Removed legacy setup.py; package metadata is fully covered by pyproject.toml.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[NewtonVisualizer.__init__] --> B[_log_newton_hud_dependency_issue]
    B --> C{imgui_bundle importable?}
    C -- Yes --> D[HUD enabled, create NewtonViewerGL]
    C -- No --> E[logger.warning: Newton HUD disabled]
    E --> D
    F[NewtonViewerRerun.log_geo] --> G{geo_type == PLANE?}
    G -- Yes --> H[expand_infinite_plane_scale]
    H --> I[super.log_geo with large extents]
    G -- No --> I
    J[NewtonViewerViser.log_geo] --> K{geo_type == PLANE?}
    K -- Yes --> L[expand_infinite_plane_scale]
    L --> M[super.log_geo with large extents]
    K -- No --> M
Loading

Reviews (1): Last reviewed commit: "init fixes" | Re-trigger Greptile

ASSERT_VISUALIZER_WARNINGS = False

_NEWTON_IMGUI_BUNDLE_PRINT_WARNING = "Warning: imgui_bundle not found"
_NEWTON_HUD_IMPORT_LOG_WARNING = "Newton Visualizer HUD disabled: failed to import imgui_bundle. This can be caused by conflicting libraries."
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Broken warning-string constant — regression check is silently inert

_NEWTON_HUD_IMPORT_LOG_WARNING is checked as a substring of every log record's message, but it will never match the warning actually emitted by _log_newton_hud_dependency_issue(). The function logs "[NewtonVisualizer] Newton HUD disabled: failed to import imgui_bundle. Install isaaclab-visualizers[newton]…", while the constant here is "Newton Visualizer HUD disabled: failed to import imgui_bundle. This can be caused by conflicting libraries." — both the prefix and suffix differ. Because the substring never matches, logged_warnings will always be empty and assert_no_newton_hud_dependency_warning will always pass even when the real warning fires, making the entire new regression detector inoperable.

Suggested change
_NEWTON_HUD_IMPORT_LOG_WARNING = "Newton Visualizer HUD disabled: failed to import imgui_bundle. This can be caused by conflicting libraries."
_NEWTON_HUD_IMPORT_LOG_WARNING = "Newton HUD disabled: failed to import imgui_bundle."

Comment on lines 39 to 40
tiled_cam_view: bool = True
"""Enable a non-interactive tiled camera image view."""
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Undocumented default-behavior flip for all visualizer users

tiled_cam_view was changed from False to True, enabling the tiled camera image view by default for every VisualizerCfg subclass when no explicit value is set. Any existing user that creates a visualizer without passing tiled_cam_view=False will now silently get a tiled camera view and the associated camera sensor creation overhead. The PR description and changelog entry don't mention this change.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Jun 3, 2026
Comment thread docs/index.rst
Comment thread source/isaaclab/isaaclab/sim/simulation_context.py Outdated
Comment thread source/isaaclab_physx/isaaclab_physx/physics/physx_manager.py Outdated
Comment thread source/isaaclab_physx/isaaclab_physx/physics/physx_manager.py Outdated
@matthewtrepte matthewtrepte requested a review from ooctipus as a code owner June 4, 2026 21:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation infrastructure isaac-lab Related to Isaac Lab team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants