Skip to content

IsaacLab 视频录制修复说明

问题

IsaacLab 的 isaaclab.python.headless.rendering.kit experience 文件缺少 isaacsim.core.rendering_manager 扩展依赖,导致视频录制时出现:

ModuleNotFoundError: No module named 'isaacsim.core.rendering_manager'

根本原因

  • isaacsim.core.rendering_manager 扩展包含 ViewportManager 类,用于设置相机视角
  • 该扩展在 isaaclab.python.kit 中有声明,但在 isaaclab.python.headless.rendering.kit 中缺失
  • 当使用 enable_cameras=True 启动 headless 模式时,会加载后者,导致扩展未加载

解决方案:运行时手动加载扩展

不修改 IsaacLab 源码,而是在 l2/utils/video.py 中运行时手动加载扩展:

python
def _ensure_rendering_manager_loaded():
    """确保 isaacsim.core.rendering_manager 扩展已加载。"""
    try:
        # 先尝试导入,如果成功说明已经加载
        from isaacsim.core.rendering_manager import ViewportManager
        return True
    except ImportError:
        pass

    # 如果导入失败,手动启用扩展
    import omni.kit.app
    ext_manager = omni.kit.app.get_app().get_extension_manager()
    ext_id = "isaacsim.core.rendering_manager"

    if not ext_manager.is_extension_enabled(ext_id):
        ext_manager.set_extension_enabled_immediate(ext_id, True)

        # 等待扩展加载
        for _ in range(10):
            omni.kit.app.get_app().update()

    # 验证是否成功
    from isaacsim.core.rendering_manager import ViewportManager
    return True

这个函数在 wrap_env_with_video_recorder() 中自动调用,用户无需手动操作。

优点

  • ✅ 不修改 IsaacLab 源码
  • ✅ 更新 IsaacLab 时不需要重新应用修复
  • ✅ 对用户透明,自动处理
  • ✅ 如果扩展已加载(例如使用非 headless 模式),不会重复加载

验证修复

运行以下命令验证:

bash
uv --project l2 run python -c "
from isaaclab.app import AppLauncher
launcher = AppLauncher({'headless': True, 'enable_cameras': True})
app = launcher.app

import sys
sys.path.insert(0, 'l2')
from video_utils import _ensure_rendering_manager_loaded

success = _ensure_rendering_manager_loaded()
print(f'Extension loaded: {success}')

if success:
    from isaacsim.core.rendering_manager import ViewportManager
    print('SUCCESS: ViewportManager imported!')

app.close()
"

如果看到 SUCCESS: ViewportManager imported!,说明修复成功。

替代方案(不推荐)

如果你想修改 IsaacLab 源码,可以编辑 IsaacLab/apps/isaaclab.python.headless.rendering.kit,在 [dependencies] 部分添加:

toml
"isaacsim.core.rendering_manager" = {}

但这需要在每次更新 IsaacLab 时重新应用修复。