From aabf1bc1862ca798c7daea50eff3e069834993b0 Mon Sep 17 00:00:00 2001 From: Tibo De Peuter Date: Tue, 28 Apr 2026 14:00:12 +0200 Subject: [PATCH] feat(simulate): configurable camera id --- configs/simulation/default.yaml | 2 ++ scripts/simulate.py | 1 + src/brittle_star_project/configs/config_simulation.py | 2 ++ src/brittle_star_project/evaluation/video.py | 4 ++-- 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/configs/simulation/default.yaml b/configs/simulation/default.yaml index b2ca27a..e689c3b 100644 --- a/configs/simulation/default.yaml +++ b/configs/simulation/default.yaml @@ -18,3 +18,5 @@ morphology_override: null record_video: false # When null, video is saved in a per-model evaluation folder alongside the model. video_output_path: null +# Camera ID to use for video recording (1 is usually the close-up camera) +camera_id: 1 diff --git a/scripts/simulate.py b/scripts/simulate.py index 7f27509..f17d8ef 100644 --- a/scripts/simulate.py +++ b/scripts/simulate.py @@ -148,6 +148,7 @@ def main(dict_cfg: DictConfig) -> None: action_high=action_high, action_mask=action_mask, output_path=output_path, + camera_id=sim_cfg.camera_id, ) save_evaluation_metadata( diff --git a/src/brittle_star_project/configs/config_simulation.py b/src/brittle_star_project/configs/config_simulation.py index 0b93fd8..e15d94e 100644 --- a/src/brittle_star_project/configs/config_simulation.py +++ b/src/brittle_star_project/configs/config_simulation.py @@ -24,3 +24,5 @@ class SimulationSettings: record_video: bool = False # When None, video is saved in a per-model evaluation folder alongside the model. video_output_path: Optional[str] = None + # Camera ID to use for video recording (1 is usually the close-up camera) + camera_id: int = 1 diff --git a/src/brittle_star_project/evaluation/video.py b/src/brittle_star_project/evaluation/video.py index 726edcb..174326b 100644 --- a/src/brittle_star_project/evaluation/video.py +++ b/src/brittle_star_project/evaluation/video.py @@ -62,6 +62,7 @@ def record_episode( action_high: np.ndarray | None, action_mask: np.ndarray | None = None, output_path: Path, + camera_id: int = 1, fps: int = 60, width: int = 640, height: int = 480, @@ -77,6 +78,7 @@ def record_episode( action_high: Maximum action values. action_mask: Boolean mask for the actions. output_path: Where to save the .mp4 file. + camera_id: Camera index to use for rendering (1 is usually close-up). fps: Frames per second for the video. width: Video width. height: Video height. @@ -94,8 +96,6 @@ def record_episode( model = state.mj_model data = state.mj_data - # Use the first camera defined in the environment config, or default to 0 - camera_id = env._config.camera_ids[0] if env._config.camera_ids else 0 renderer = mujoco.Renderer(model, width=width, height=height) ep_return = 0.0