# Copyright (c) 2022-2025, The Isaac Lab Project Developers.# All rights reserved.## SPDX-License-Identifier: BSD-3-Clausefrom__future__importannotationsimporttorchfromcollections.abcimportSequencefromtypingimportTYPE_CHECKINGifTYPE_CHECKING:from.importnoise_cfg### Noise as functions.##
[docs]defconstant_noise(data:torch.Tensor,cfg:noise_cfg.ConstantNoiseCfg)->torch.Tensor:"""Applies a constant noise bias to a given data set. Args: data: The unmodified data set to apply noise to. cfg: The configuration parameters for constant noise. Returns: The data modified by the noise parameters provided. """# fix tensor device for bias on first call and update config parametersifisinstance(cfg.bias,torch.Tensor):cfg.bias=cfg.bias.to(device=data.device)ifcfg.operation=="add":returndata+cfg.biaselifcfg.operation=="scale":returndata*cfg.biaselifcfg.operation=="abs":returntorch.zeros_like(data)+cfg.biaselse:raiseValueError(f"Unknown operation in noise: {cfg.operation}")
[docs]defuniform_noise(data:torch.Tensor,cfg:noise_cfg.UniformNoiseCfg)->torch.Tensor:"""Applies a uniform noise to a given data set. Args: data: The unmodified data set to apply noise to. cfg: The configuration parameters for uniform noise. Returns: The data modified by the noise parameters provided. """# fix tensor device for n_max on first call and update config parametersifisinstance(cfg.n_max,torch.Tensor):cfg.n_max=cfg.n_max.to(data.device)# fix tensor device for n_min on first call and update config parametersifisinstance(cfg.n_min,torch.Tensor):cfg.n_min=cfg.n_min.to(data.device)ifcfg.operation=="add":returndata+torch.rand_like(data)*(cfg.n_max-cfg.n_min)+cfg.n_minelifcfg.operation=="scale":returndata*(torch.rand_like(data)*(cfg.n_max-cfg.n_min)+cfg.n_min)elifcfg.operation=="abs":returntorch.rand_like(data)*(cfg.n_max-cfg.n_min)+cfg.n_minelse:raiseValueError(f"Unknown operation in noise: {cfg.operation}")
[docs]defgaussian_noise(data:torch.Tensor,cfg:noise_cfg.GaussianNoiseCfg)->torch.Tensor:"""Applies a gaussian noise to a given data set. Args: data: The unmodified data set to apply noise to. cfg: The configuration parameters for gaussian noise. Returns: The data modified by the noise parameters provided. """# fix tensor device for mean on first call and update config parametersifisinstance(cfg.mean,torch.Tensor):cfg.mean=cfg.mean.to(data.device)# fix tensor device for std on first call and update config parametersifisinstance(cfg.std,torch.Tensor):cfg.std=cfg.std.to(data.device)ifcfg.operation=="add":returndata+cfg.mean+cfg.std*torch.randn_like(data)elifcfg.operation=="scale":returndata*(cfg.mean+cfg.std*torch.randn_like(data))elifcfg.operation=="abs":returncfg.mean+cfg.std*torch.randn_like(data)else:raiseValueError(f"Unknown operation in noise: {cfg.operation}")
### Noise models as classes##
[docs]classNoiseModel:"""Base class for noise models."""def__init__(self,noise_model_cfg:noise_cfg.NoiseModelCfg,num_envs:int,device:str):"""Initialize the noise model. Args: noise_model_cfg: The noise configuration to use. num_envs: The number of environments. device: The device to use for the noise model. """self._noise_model_cfg=noise_model_cfgself._num_envs=num_envsself._device=device
[docs]defreset(self,env_ids:Sequence[int]|None=None):"""Reset the noise model. This method can be implemented by derived classes to reset the noise model. This is useful when implementing temporal noise models such as random walk. Args: env_ids: The environment ids to reset the noise model for. Defaults to None, in which case all environments are considered. """pass
[docs]defapply(self,data:torch.Tensor)->torch.Tensor:"""Apply the noise to the data. Args: data: The data to apply the noise to. Shape is (num_envs, ...). Returns: The data with the noise applied. Shape is the same as the input data. """returnself._noise_model_cfg.noise_cfg.func(data,self._noise_model_cfg.noise_cfg)
[docs]classNoiseModelWithAdditiveBias(NoiseModel):"""Noise model with an additive bias. The bias term is sampled from a the specified distribution on reset. """def__init__(self,noise_model_cfg:noise_cfg.NoiseModelWithAdditiveBiasCfg,num_envs:int,device:str):# initialize parent classsuper().__init__(noise_model_cfg,num_envs,device)# store the bias noise configurationself._bias_noise_cfg=noise_model_cfg.bias_noise_cfgself._bias=torch.zeros((num_envs,1),device=self._device)
[docs]defreset(self,env_ids:Sequence[int]|None=None):"""Reset the noise model. This method resets the bias term for the specified environments. Args: env_ids: The environment ids to reset the noise model for. Defaults to None, in which case all environments are considered. """# resolve the environment idsifenv_idsisNone:env_ids=slice(None)# reset the bias termself._bias[env_ids]=self._bias_noise_cfg.func(self._bias[env_ids],self._bias_noise_cfg)
[docs]defapply(self,data:torch.Tensor)->torch.Tensor:"""Apply bias noise to the data. Args: data: The data to apply the noise to. Shape is (num_envs, ...). Returns: The data with the noise applied. Shape is the same as the input data. """returnsuper().apply(data)+self._bias