From 186b6f968cbe46ccf8d344af3888f95a93aa9b08 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Thu, 5 Mar 2026 03:46:16 +0000 Subject: [PATCH 1/4] wip --- embodichain/lab/gym/envs/embodied_env.py | 8 +++++++- embodichain/lab/gym/envs/managers/randomization/visual.py | 7 +++++++ embodichain/lab/gym/utils/gym_utils.py | 1 + 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/embodichain/lab/gym/envs/embodied_env.py b/embodichain/lab/gym/envs/embodied_env.py index 5db51660..6cf0a30c 100644 --- a/embodichain/lab/gym/envs/embodied_env.py +++ b/embodichain/lab/gym/envs/embodied_env.py @@ -64,7 +64,7 @@ class EnvLightCfg: direct: List[LightCfg] = [] # TODO: support more types of indirect light in the future. - # indirect: Dict[str, Any] | None = None + indirect: dict[str, Any] | None = None robot: RobotCfg = MISSING @@ -496,9 +496,15 @@ def _setup_sensors(self, **kwargs) -> Dict[str, BaseSensor]: def _setup_lights(self) -> None: """Setup the lights in the environment.""" + # Set direct lights. for cfg in self.cfg.light.direct: self.sim.add_light(cfg=cfg) + # Set indirect lights. + if self.cfg.light.indirect is not None: + if "emission_light" in self.cfg.light.indirect: + self.sim.set_emission_light(**self.cfg.light.indirect["emission_light"]) + def _setup_background(self) -> None: """Setup the static rigid objects in the environment.""" for cfg in self.cfg.background: diff --git a/embodichain/lab/gym/envs/managers/randomization/visual.py b/embodichain/lab/gym/envs/managers/randomization/visual.py index a1b1a978..b1f58608 100644 --- a/embodichain/lab/gym/envs/managers/randomization/visual.py +++ b/embodichain/lab/gym/envs/managers/randomization/visual.py @@ -342,6 +342,13 @@ def randomize_light( light.set_intensity(new_intensity, env_ids=env_ids) +# def randomize_emission_light( +# env: EmbodiedEnv, +# env_ids: Union[torch.Tensor, None], +# color_range: tuple[list[float], list[float]] | None = None, +# intensity_range: tuple[float, float] | None = None, + + def randomize_camera_intrinsics( env: EmbodiedEnv, env_ids: Union[torch.Tensor, None], diff --git a/embodichain/lab/gym/utils/gym_utils.py b/embodichain/lab/gym/utils/gym_utils.py index d8b4427f..e9823d6e 100644 --- a/embodichain/lab/gym/utils/gym_utils.py +++ b/embodichain/lab/gym/utils/gym_utils.py @@ -430,6 +430,7 @@ class ComponentCfg: env_cfg.light.direct = [ LightCfg.from_dict(l) for l in config["light"].get("direct", []) ] + env_cfg.light.indirect = config["light"].get("indirect", None) # parser background objects config if "background" in config: From 827d2d185b94e27093e798ac3426903b672daff1 Mon Sep 17 00:00:00 2001 From: yuecideng Date: Thu, 5 Mar 2026 12:13:23 +0800 Subject: [PATCH 2/4] wip --- .../gym/envs/managers/randomization/visual.py | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) diff --git a/embodichain/lab/gym/envs/managers/randomization/visual.py b/embodichain/lab/gym/envs/managers/randomization/visual.py index b1f58608..71b1fef0 100644 --- a/embodichain/lab/gym/envs/managers/randomization/visual.py +++ b/embodichain/lab/gym/envs/managers/randomization/visual.py @@ -20,6 +20,8 @@ import os import random import copy +import numpy as np + from typing import TYPE_CHECKING, Literal, Union, Dict from embodichain.lab.sim.objects import ( @@ -52,6 +54,7 @@ __all__ = [ "randomize_camera_extrinsics", "randomize_light", + "randomize_emission_light", "randomize_camera_intrinsics", "set_rigid_object_visual_material", "set_rigid_object_group_visual_material", @@ -342,11 +345,44 @@ def randomize_light( light.set_intensity(new_intensity, env_ids=env_ids) -# def randomize_emission_light( -# env: EmbodiedEnv, -# env_ids: Union[torch.Tensor, None], -# color_range: tuple[list[float], list[float]] | None = None, -# intensity_range: tuple[float, float] | None = None, +def randomize_emission_light( + env: EmbodiedEnv, + env_ids: Union[torch.Tensor, None], + color_range: tuple[list[float], list[float]] | None = None, + intensity_range: tuple[float, float] | None = None, +) -> None: + """Randomize emission light properties by adding, scaling, or setting random values. + + This function allows randomizing emission light properties in the scene. The function samples random values from the + given distribution parameters and adds, scales, or sets the values into the physics simulation based on the + operation. + + The distribution parameters are lists of two elements each, representing the lower and upper bounds of the + distribution for the r, g, b components of the light color and intensity. The function samples random values for each + component independently. + + .. attention:: + This function applied the same emission light properties for all the environments. + + color_range is the absolute r, g, b value set to the emission light. + intensity_range is the absolute value added into the emission light's intensity. + """ + + color = None + if color_range: + color = torch.zeros((1, 3), dtype=torch.float32) + random_value = sample_uniform( + lower=torch.tensor(color_range[0]), + upper=torch.tensor(color_range[1]), + size=color.shape, + ) + color += random_value + + intensity = None + if intensity_range: + intensity = np.random.uniform(intensity_range[0], intensity_range[1]) + + env.sim.set_emission_light(color=color.squeeze_(0).tolist(), intensity=intensity) def randomize_camera_intrinsics( From 1d9ba9d4f28f62f439b89f174864afe277f9868f Mon Sep 17 00:00:00 2001 From: yuecideng Date: Thu, 5 Mar 2026 12:16:47 +0800 Subject: [PATCH 3/4] wip --- docs/source/overview/gym/event_functors.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/source/overview/gym/event_functors.md b/docs/source/overview/gym/event_functors.md index f1dfdcc7..cd101cc1 100644 --- a/docs/source/overview/gym/event_functors.md +++ b/docs/source/overview/gym/event_functors.md @@ -31,6 +31,8 @@ This page lists all available event functors that can be used with the Event Man - Randomize textures, base colors, and material properties (metallic, roughness, IOR). Implemented as a Functor class. Supports both RigidObject and Articulation assets. * - ``randomize_light`` - Vary light position, color, and intensity within specified ranges. +* - ``randomize_emission_light`` + - Randomize global emission light color and intensity. Applies the same emission light properties across all environments. * - ``randomize_camera_extrinsics`` - Randomize camera poses for viewpoint diversity. Supports both attach mode (pos/euler perturbation) and look_at mode (eye/target/up perturbation). * - ``randomize_camera_intrinsics`` From ddd6afdd0d2095a94efd8925b61755173414e6bd Mon Sep 17 00:00:00 2001 From: yuecideng Date: Thu, 5 Mar 2026 13:24:14 +0800 Subject: [PATCH 4/4] wip --- .../lab/gym/envs/managers/randomization/visual.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/embodichain/lab/gym/envs/managers/randomization/visual.py b/embodichain/lab/gym/envs/managers/randomization/visual.py index 71b1fef0..66d3d6fb 100644 --- a/embodichain/lab/gym/envs/managers/randomization/visual.py +++ b/embodichain/lab/gym/envs/managers/randomization/visual.py @@ -364,8 +364,8 @@ def randomize_emission_light( .. attention:: This function applied the same emission light properties for all the environments. - color_range is the absolute r, g, b value set to the emission light. - intensity_range is the absolute value added into the emission light's intensity. + color_range is the absolute r, g, b value set on the emission light. + intensity_range is the absolute intensity value set on the emission light. """ color = None @@ -382,7 +382,11 @@ def randomize_emission_light( if intensity_range: intensity = np.random.uniform(intensity_range[0], intensity_range[1]) - env.sim.set_emission_light(color=color.squeeze_(0).tolist(), intensity=intensity) + if isinstance(color, torch.Tensor): + color_arg = color.squeeze(0).tolist() + else: + color_arg = None + env.sim.set_emission_light(color=color_arg, intensity=intensity) def randomize_camera_intrinsics(