diff --git a/source/isaaclab/changelog.d/fix-pre-kit-env-import.fixed.rst b/source/isaaclab/changelog.d/fix-pre-kit-env-import.fixed.rst new file mode 100644 index 000000000000..064a7936f00b --- /dev/null +++ b/source/isaaclab/changelog.d/fix-pre-kit-env-import.fixed.rst @@ -0,0 +1 @@ +* Avoided loading MoviePy's unrelated editing dependencies when importing the video recorder. diff --git a/source/isaaclab/isaaclab/envs/utils/video_recorder.py b/source/isaaclab/isaaclab/envs/utils/video_recorder.py index 5e0520ac0017..7df49c1815b0 100644 --- a/source/isaaclab/isaaclab/envs/utils/video_recorder.py +++ b/source/isaaclab/isaaclab/envs/utils/video_recorder.py @@ -20,7 +20,7 @@ import numpy as np try: - from moviepy.editor import ImageSequenceClip + from moviepy.video.io.ImageSequenceClip import ImageSequenceClip except ImportError: ImageSequenceClip = None # type: ignore[assignment,misc] diff --git a/source/isaaclab_rl/changelog.d/fix-pre-kit-env-import.fixed.rst b/source/isaaclab_rl/changelog.d/fix-pre-kit-env-import.fixed.rst new file mode 100644 index 000000000000..4357d036e47b --- /dev/null +++ b/source/isaaclab_rl/changelog.d/fix-pre-kit-env-import.fixed.rst @@ -0,0 +1,3 @@ +* Fixed Isaac Sim crashing at startup in OpenBLAS's at-fork handler when ``moviepy`` is installed: the + reinforcement learning entry points imported the environment runtime, and with it the video recorder's + ``moviepy`` and SciPy, before the launch. diff --git a/source/isaaclab_rl/isaaclab_rl/entrypoints/common.py b/source/isaaclab_rl/isaaclab_rl/entrypoints/common.py index a2576b9a5feb..dfc2243225ec 100644 --- a/source/isaaclab_rl/isaaclab_rl/entrypoints/common.py +++ b/source/isaaclab_rl/isaaclab_rl/entrypoints/common.py @@ -29,7 +29,7 @@ from PIL import Image from isaaclab.app import LoadingScreen -from isaaclab.envs import DirectMARLEnvCfg, DirectRLEnvCfg, ManagerBasedRLEnvCfg, multi_agent_to_single_agent +from isaaclab.envs import DirectMARLEnvCfg, DirectRLEnvCfg, ManagerBasedRLEnvCfg from isaaclab.envs.utils.video_recorder_cfg import VideoRecorderCfg from isaaclab.renderers.renderer_cfg import RendererCfg from isaaclab.utils.assets import retrieve_file_path @@ -501,6 +501,9 @@ def create_isaaclab_env( env = WarpFrontend.build_env(env_cfg, task) if convert_marl_to_single_agent and isinstance(env.unwrapped.cfg, DirectMARLEnvCfg): + # Import the environment runtime only after simulation launch. + from isaaclab.envs import multi_agent_to_single_agent + env = multi_agent_to_single_agent(env) return env diff --git a/source/isaaclab_rl/test/test_entrypoints.py b/source/isaaclab_rl/test/test_entrypoints.py index 3371f4ec6760..7c24021bdb32 100644 --- a/source/isaaclab_rl/test/test_entrypoints.py +++ b/source/isaaclab_rl/test/test_entrypoints.py @@ -31,6 +31,7 @@ [ ("import isaaclab_rl", ["isaaclab_rl.entrypoints", "torch"]), ("import isaaclab_rl.entrypoints.backends", ["torch"]), + ("import isaaclab_rl.entrypoints.common", ["isaaclab.envs.direct_marl_env", "moviepy"]), # the LEAPP runtime must only load once the simulation has launched ("import isaaclab_rl.entrypoints.backends.export_rsl_rl", ["leapp", "isaaclab.utils.leapp"]), ("import isaaclab_rl.rl_games", ["isaaclab_rl.rl_games.rl_games", "rl_games", "torch"]),