Source code for isaaclab.ui.xr_widgets.teleop_visualization_manager
# Copyright (c) 2022-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause
from typing import Any
from isaaclab.ui.xr_widgets import DataCollector, TriggerType, VisualizationManager
from isaaclab.ui.xr_widgets.instruction_widget import hide_instruction
[docs]
class TeleopVisualizationManager(VisualizationManager):
"""Specialized visualization manager for teleoperation scenarios.
For sample and debug use.
Provides teleoperation-specific visualization features including:
- IK error handling and display
"""
[docs]
def __init__(self, data_collector: DataCollector):
"""Initialize the teleop visualization manager and register callbacks.
Args:
data_collector: DataCollector instance to read data for visualization use.
"""
super().__init__(data_collector)
# Handle error event
self._error_text_color = 0xFF0000FF
self.ik_error_widget_id = "/ik_solver_failed"
self.register_callback(TriggerType.TRIGGER_ON_EVENT, {"event_name": "ik_error"}, self._handle_ik_error)
def _handle_ik_error(self, mgr: VisualizationManager, data_collector: DataCollector, params: Any = None) -> None:
"""Handle IK error events by displaying an error message widget.
Args:
data_collector: DataCollector instance (unused in this handler)
"""
# Todo: move display_widget to instruction_widget.py
if not hasattr(mgr, "_ik_error_widget_timer"):
self.display_widget(
"IK Error Detected",
mgr.ik_error_widget_id,
VisualizationManager.message_widget_preset()
| {"text_color": self._error_text_color, "display_duration": None},
)
mgr._ik_error_widget_timer = mgr.register_callback(
TriggerType.TRIGGER_ON_PERIOD, {"period": 3.0, "initial_countdown": 3.0}, self._hide_ik_error_widget
)
if mgr._ik_error_widget_timer is None:
mgr.cancel_rule(TriggerType.TRIGGER_ON_PERIOD, mgr._ik_error_widget_timer)
mgr.cancel_rule(TriggerType.TRIGGER_ON_EVENT, "ik_solver_failed")
raise RuntimeWarning("Failed to register IK error widget timer")
else:
mgr._ik_error_widget_timer.countdown = 3.0
def _hide_ik_error_widget(self, mgr: VisualizationManager, data_collector: DataCollector) -> None:
"""Hide the IK error widget.
Args:
data_collector: DataCollector instance (unused in this handler)
"""
hide_instruction(mgr.ik_error_widget_id)
mgr.cancel_rule(TriggerType.TRIGGER_ON_PERIOD, mgr._ik_error_widget_timer)
delattr(mgr, "_ik_error_widget_timer")