From bf3cc4ef38915835247de29130faee9ce2e62c0b Mon Sep 17 00:00:00 2001 From: James Tigue Date: Mon, 7 Oct 2024 14:08:58 -0400 Subject: [PATCH 1/5] fix device propogation for noise and add noise tests --- .../omni/isaac/lab/utils/noise/noise_model.py | 56 +++++++- .../omni.isaac.lab/test/utils/test_noise.py | 124 ++++++++++++++++++ 2 files changed, 177 insertions(+), 3 deletions(-) create mode 100644 source/extensions/omni.isaac.lab/test/utils/test_noise.py diff --git a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py index 4bd2ff09f48..f5a6ddd21da 100644 --- a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py +++ b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py @@ -18,7 +18,21 @@ def constant_noise(data: torch.Tensor, cfg: noise_cfg.ConstantNoiseCfg) -> torch.Tensor: - """Constant noise.""" + """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 parameters + if isinstance(cfg.bias,torch.Tensor): + if cfg.bias.device is not data.device: + cfg.bias = cfg.bias.to(data.device,) + if cfg.operation == "add": return data + cfg.bias elif cfg.operation == "scale": @@ -30,7 +44,25 @@ def constant_noise(data: torch.Tensor, cfg: noise_cfg.ConstantNoiseCfg) -> torch def uniform_noise(data: torch.Tensor, cfg: noise_cfg.UniformNoiseCfg) -> torch.Tensor: - """Uniform noise.""" + """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 parameters + if isinstance(cfg.n_max,torch.Tensor): + if cfg.n_max.device is not data.device: + cfg.n_max = cfg.n_max.to(data.device) + # fix tensor device for n_min on first call and update config parameters + if isinstance(cfg.n_min,torch.Tensor): + if cfg.n_min.device is not data.device: + cfg.n_min = cfg.n_min.to(data.device) + if cfg.operation == "add": return data + torch.rand_like(data) * (cfg.n_max - cfg.n_min) + cfg.n_min elif cfg.operation == "scale": @@ -42,7 +74,25 @@ def uniform_noise(data: torch.Tensor, cfg: noise_cfg.UniformNoiseCfg) -> torch.T def gaussian_noise(data: torch.Tensor, cfg: noise_cfg.GaussianNoiseCfg) -> torch.Tensor: - """Gaussian noise.""" + """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 parameters + if isinstance(cfg.mean,torch.Tensor): + if cfg.mean.device is not data.device: + cfg.mean = cfg.mean.to(data.device) + # fix tensor device for std on first call and update config parameters + if isinstance(cfg.std,torch.Tensor): + if cfg.std.device is not data.device: + cfg.std = cfg.std.to(data.device) + if cfg.operation == "add": return data + cfg.mean + cfg.std * torch.randn_like(data) elif cfg.operation == "scale": diff --git a/source/extensions/omni.isaac.lab/test/utils/test_noise.py b/source/extensions/omni.isaac.lab/test/utils/test_noise.py new file mode 100644 index 00000000000..ea603b36ca7 --- /dev/null +++ b/source/extensions/omni.isaac.lab/test/utils/test_noise.py @@ -0,0 +1,124 @@ +# Copyright (c) 2022-2024, The Isaac Lab Project Developers. +# All rights reserved. +# +# SPDX-License-Identifier: BSD-3-Clause + +"""Launch Isaac Sim Simulator first.""" + +from omni.isaac.lab.app import AppLauncher, run_tests + +# launch omniverse app +app_launcher = AppLauncher(headless=True) +simulation_app = app_launcher.app + +"""Rest everything follows.""" + +import time +import torch +import unittest +from dataclasses import MISSING + +import omni.isaac.lab.utils.noise as noise +from omni.isaac.lab.utils import configclass + + + +class TestNoise(unittest.TestCase): + """Test different noise implementations.""" + + def test_gaussian_noise(self): + """Test guassian_noise function.""" + + for device in ["cpu","cuda"]: + for noise_device in ["cpu","cuda"]: + for op in ["add","scale","abs"]: + with self.subTest(device=device, noise_device=noise_device, operation=op): + # create random data set + data = torch.rand(10000, 3, device=device) + # define standard deviation and mean + std = torch.tensor([0.1,0.2,0.3],device=noise_device) + mean = torch.tensor([0.4,0.5,0.6],device=noise_device) + # create noise config + noise_cfg = noise.GaussianNoiseCfg(std=std, + mean=mean, + operation=op) + + for i in range(10): + # apply noise + noisy_data = noise_cfg.func(data,cfg=noise_cfg) + # calculate resulting noise compared to original data set + if op=="add": + std_result, mean_result = torch.std_mean(noisy_data-data,dim=0) + elif op=="scale": + std_result, mean_result = torch.std_mean(noisy_data/data,dim=0) + elif op=="abs": + std_result, mean_result = torch.std_mean(noisy_data,dim=0) + + self.assertTrue(noise_cfg.mean.device,device) + self.assertTrue(noise_cfg.std.device,device) + torch.testing.assert_close(noise_cfg.std,std_result,atol=1e-2,rtol=1e-2) + torch.testing.assert_close(noise_cfg.mean,mean_result,atol=1e-2,rtol=1e-2) + + + def test_uniform_noise(self): + """Test uniform_noise function.""" + for device in ["cpu","cuda"]: + for noise_device in ["cpu","cuda"]: + for op in ["add","scale","abs"]: + with self.subTest(device=device, noise_device=noise_device,operation=op): + # create random data set + data = torch.rand(10000, 3, device=device) + # define uniform minimum and maximum + n_min = torch.tensor([0.1,0.2,0.3],device=noise_device) + n_max = torch.tensor([0.4,0.5,0.6],device=noise_device) + # create noise config + noise_cfg = noise.UniformNoiseCfg(n_max=n_max, n_min=n_min,operation=op) + + for i in range(10): + # apply noise + noisy_data = noise_cfg.func(data,cfg=noise_cfg) + # calculate resulting noise compared to original data set + if op=="add": + min_result, _ = torch.min(noisy_data-data,dim=0) + max_result, _ = torch.max(noisy_data-data,dim=0) + elif op=="scale": + min_result, _ = torch.min(torch.div(noisy_data,data),dim=0) + max_result, _ = torch.max(torch.div(noisy_data,data),dim=0) + elif op=="abs": + min_result, _ = torch.min(noisy_data,dim=0) + max_result, _ = torch.max(noisy_data,dim=0) + + self.assertTrue(noise_cfg.n_min.device,device) + self.assertTrue(noise_cfg.n_max.device,device) + self.assertTrue(all(torch.le(noise_cfg.n_min, min_result).tolist())) + self.assertTrue(all(torch.ge(noise_cfg.n_max, max_result).tolist())) + + def test_constant_noise(self): + """Test constant_noise""" + for device in ["cpu","cuda"]: + for noise_device in ["cpu","cuda"]: + for op in ["add","scale","abs"]: + with self.subTest(device=device, noise_device=noise_device,operation=op): + # create random data set + data = torch.rand(10000, 3, device=device) + # define a bias + bias = torch.tensor([0.1,0.2,0.3],device=noise_device) + # create noise config + noise_cfg = noise.ConstantNoiseCfg(bias=bias, operation=op) + + for i in range(10): + # apply noise + noisy_data = noise_cfg.func(data,cfg=noise_cfg) + # calculate resulting noise compared to original data set + if op=="add": + bias_result = noisy_data-data + elif op=="scale": + bias_result = noisy_data/data + elif op=="abs": + bias_result = noisy_data + + self.assertTrue(noise_cfg.bias.device,device) + torch.testing.assert_close(noise_cfg.bias.repeat(data.shape[0],1),bias_result) + +if __name__ == "__main__": + run_tests() \ No newline at end of file From ed0d00eeb75e71f9c8cf5e451b5607b3829e4ea2 Mon Sep 17 00:00:00 2001 From: James Tigue Date: Mon, 7 Oct 2024 14:14:47 -0400 Subject: [PATCH 2/5] formatting --- .../omni/isaac/lab/utils/noise/noise_model.py | 40 +++--- .../omni.isaac.lab/test/utils/test_noise.py | 116 +++++++++--------- 2 files changed, 76 insertions(+), 80 deletions(-) diff --git a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py index f5a6ddd21da..ed4144dbcba 100644 --- a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py +++ b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py @@ -19,19 +19,21 @@ def constant_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. + The data modified by the noise parameters provided. """ # fix tensor device for bias on first call and update config parameters - if isinstance(cfg.bias,torch.Tensor): + if isinstance(cfg.bias, torch.Tensor): if cfg.bias.device is not data.device: - cfg.bias = cfg.bias.to(data.device,) + cfg.bias = cfg.bias.to( + data.device, + ) if cfg.operation == "add": return data + cfg.bias @@ -45,23 +47,23 @@ def constant_noise(data: torch.Tensor, cfg: noise_cfg.ConstantNoiseCfg) -> torch def uniform_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. + The data modified by the noise parameters provided. """ - + # fix tensor device for n_max on first call and update config parameters - if isinstance(cfg.n_max,torch.Tensor): + if isinstance(cfg.n_max, torch.Tensor): if cfg.n_max.device is not data.device: cfg.n_max = cfg.n_max.to(data.device) # fix tensor device for n_min on first call and update config parameters - if isinstance(cfg.n_min,torch.Tensor): + if isinstance(cfg.n_min, torch.Tensor): if cfg.n_min.device is not data.device: - cfg.n_min = cfg.n_min.to(data.device) + cfg.n_min = cfg.n_min.to(data.device) if cfg.operation == "add": return data + torch.rand_like(data) * (cfg.n_max - cfg.n_min) + cfg.n_min @@ -75,23 +77,23 @@ def uniform_noise(data: torch.Tensor, cfg: noise_cfg.UniformNoiseCfg) -> torch.T def gaussian_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. + The data modified by the noise parameters provided. """ # fix tensor device for mean on first call and update config parameters - if isinstance(cfg.mean,torch.Tensor): + if isinstance(cfg.mean, torch.Tensor): if cfg.mean.device is not data.device: cfg.mean = cfg.mean.to(data.device) - # fix tensor device for std on first call and update config parameters - if isinstance(cfg.std,torch.Tensor): + # fix tensor device for std on first call and update config parameters + if isinstance(cfg.std, torch.Tensor): if cfg.std.device is not data.device: - cfg.std = cfg.std.to(data.device) + cfg.std = cfg.std.to(data.device) if cfg.operation == "add": return data + cfg.mean + cfg.std * torch.randn_like(data) diff --git a/source/extensions/omni.isaac.lab/test/utils/test_noise.py b/source/extensions/omni.isaac.lab/test/utils/test_noise.py index ea603b36ca7..f5355d0856e 100644 --- a/source/extensions/omni.isaac.lab/test/utils/test_noise.py +++ b/source/extensions/omni.isaac.lab/test/utils/test_noise.py @@ -13,14 +13,10 @@ """Rest everything follows.""" -import time import torch import unittest -from dataclasses import MISSING import omni.isaac.lab.utils.noise as noise -from omni.isaac.lab.utils import configclass - class TestNoise(unittest.TestCase): @@ -29,96 +25,94 @@ class TestNoise(unittest.TestCase): def test_gaussian_noise(self): """Test guassian_noise function.""" - for device in ["cpu","cuda"]: - for noise_device in ["cpu","cuda"]: - for op in ["add","scale","abs"]: + for device in ["cpu", "cuda"]: + for noise_device in ["cpu", "cuda"]: + for op in ["add", "scale", "abs"]: with self.subTest(device=device, noise_device=noise_device, operation=op): # create random data set data = torch.rand(10000, 3, device=device) # define standard deviation and mean - std = torch.tensor([0.1,0.2,0.3],device=noise_device) - mean = torch.tensor([0.4,0.5,0.6],device=noise_device) + std = torch.tensor([0.1, 0.2, 0.3], device=noise_device) + mean = torch.tensor([0.4, 0.5, 0.6], device=noise_device) # create noise config - noise_cfg = noise.GaussianNoiseCfg(std=std, - mean=mean, - operation=op) + noise_cfg = noise.GaussianNoiseCfg(std=std, mean=mean, operation=op) for i in range(10): # apply noise - noisy_data = noise_cfg.func(data,cfg=noise_cfg) + noisy_data = noise_cfg.func(data, cfg=noise_cfg) # calculate resulting noise compared to original data set - if op=="add": - std_result, mean_result = torch.std_mean(noisy_data-data,dim=0) - elif op=="scale": - std_result, mean_result = torch.std_mean(noisy_data/data,dim=0) - elif op=="abs": - std_result, mean_result = torch.std_mean(noisy_data,dim=0) - - self.assertTrue(noise_cfg.mean.device,device) - self.assertTrue(noise_cfg.std.device,device) - torch.testing.assert_close(noise_cfg.std,std_result,atol=1e-2,rtol=1e-2) - torch.testing.assert_close(noise_cfg.mean,mean_result,atol=1e-2,rtol=1e-2) - + if op == "add": + std_result, mean_result = torch.std_mean(noisy_data - data, dim=0) + elif op == "scale": + std_result, mean_result = torch.std_mean(noisy_data / data, dim=0) + elif op == "abs": + std_result, mean_result = torch.std_mean(noisy_data, dim=0) + + self.assertTrue(noise_cfg.mean.device, device) + self.assertTrue(noise_cfg.std.device, device) + torch.testing.assert_close(noise_cfg.std, std_result, atol=1e-2, rtol=1e-2) + torch.testing.assert_close(noise_cfg.mean, mean_result, atol=1e-2, rtol=1e-2) def test_uniform_noise(self): """Test uniform_noise function.""" - for device in ["cpu","cuda"]: - for noise_device in ["cpu","cuda"]: - for op in ["add","scale","abs"]: - with self.subTest(device=device, noise_device=noise_device,operation=op): + for device in ["cpu", "cuda"]: + for noise_device in ["cpu", "cuda"]: + for op in ["add", "scale", "abs"]: + with self.subTest(device=device, noise_device=noise_device, operation=op): # create random data set data = torch.rand(10000, 3, device=device) # define uniform minimum and maximum - n_min = torch.tensor([0.1,0.2,0.3],device=noise_device) - n_max = torch.tensor([0.4,0.5,0.6],device=noise_device) + n_min = torch.tensor([0.1, 0.2, 0.3], device=noise_device) + n_max = torch.tensor([0.4, 0.5, 0.6], device=noise_device) # create noise config - noise_cfg = noise.UniformNoiseCfg(n_max=n_max, n_min=n_min,operation=op) - + noise_cfg = noise.UniformNoiseCfg(n_max=n_max, n_min=n_min, operation=op) + for i in range(10): # apply noise - noisy_data = noise_cfg.func(data,cfg=noise_cfg) + noisy_data = noise_cfg.func(data, cfg=noise_cfg) # calculate resulting noise compared to original data set - if op=="add": - min_result, _ = torch.min(noisy_data-data,dim=0) - max_result, _ = torch.max(noisy_data-data,dim=0) - elif op=="scale": - min_result, _ = torch.min(torch.div(noisy_data,data),dim=0) - max_result, _ = torch.max(torch.div(noisy_data,data),dim=0) - elif op=="abs": - min_result, _ = torch.min(noisy_data,dim=0) - max_result, _ = torch.max(noisy_data,dim=0) - - self.assertTrue(noise_cfg.n_min.device,device) - self.assertTrue(noise_cfg.n_max.device,device) + if op == "add": + min_result, _ = torch.min(noisy_data - data, dim=0) + max_result, _ = torch.max(noisy_data - data, dim=0) + elif op == "scale": + min_result, _ = torch.min(torch.div(noisy_data, data), dim=0) + max_result, _ = torch.max(torch.div(noisy_data, data), dim=0) + elif op == "abs": + min_result, _ = torch.min(noisy_data, dim=0) + max_result, _ = torch.max(noisy_data, dim=0) + + self.assertTrue(noise_cfg.n_min.device, device) + self.assertTrue(noise_cfg.n_max.device, device) self.assertTrue(all(torch.le(noise_cfg.n_min, min_result).tolist())) self.assertTrue(all(torch.ge(noise_cfg.n_max, max_result).tolist())) def test_constant_noise(self): """Test constant_noise""" - for device in ["cpu","cuda"]: - for noise_device in ["cpu","cuda"]: - for op in ["add","scale","abs"]: - with self.subTest(device=device, noise_device=noise_device,operation=op): + for device in ["cpu", "cuda"]: + for noise_device in ["cpu", "cuda"]: + for op in ["add", "scale", "abs"]: + with self.subTest(device=device, noise_device=noise_device, operation=op): # create random data set data = torch.rand(10000, 3, device=device) # define a bias - bias = torch.tensor([0.1,0.2,0.3],device=noise_device) + bias = torch.tensor([0.1, 0.2, 0.3], device=noise_device) # create noise config noise_cfg = noise.ConstantNoiseCfg(bias=bias, operation=op) - + for i in range(10): # apply noise - noisy_data = noise_cfg.func(data,cfg=noise_cfg) + noisy_data = noise_cfg.func(data, cfg=noise_cfg) # calculate resulting noise compared to original data set - if op=="add": - bias_result = noisy_data-data - elif op=="scale": - bias_result = noisy_data/data - elif op=="abs": + if op == "add": + bias_result = noisy_data - data + elif op == "scale": + bias_result = noisy_data / data + elif op == "abs": bias_result = noisy_data - self.assertTrue(noise_cfg.bias.device,device) - torch.testing.assert_close(noise_cfg.bias.repeat(data.shape[0],1),bias_result) + self.assertTrue(noise_cfg.bias.device, device) + torch.testing.assert_close(noise_cfg.bias.repeat(data.shape[0], 1), bias_result) + if __name__ == "__main__": - run_tests() \ No newline at end of file + run_tests() From 5b992085928f0b14b93a1e12a2b05a627b23cb55 Mon Sep 17 00:00:00 2001 From: jtigue-bdai <166445701+jtigue-bdai@users.noreply.github.com> Date: Fri, 11 Oct 2024 13:44:34 -0400 Subject: [PATCH 3/5] Reduce code and rely on device checking in tensor.to Co-authored-by: Mayank Mittal <12863862+Mayankm96@users.noreply.github.com> Signed-off-by: jtigue-bdai <166445701+jtigue-bdai@users.noreply.github.com> --- .../omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py index ed4144dbcba..d99da58aae0 100644 --- a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py +++ b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py @@ -30,10 +30,7 @@ def constant_noise(data: torch.Tensor, cfg: noise_cfg.ConstantNoiseCfg) -> torch # fix tensor device for bias on first call and update config parameters if isinstance(cfg.bias, torch.Tensor): - if cfg.bias.device is not data.device: - cfg.bias = cfg.bias.to( - data.device, - ) + cfg.bias = cfg.bias.to(device=data.device) if cfg.operation == "add": return data + cfg.bias From 455ae617e61b68b7b62bda0b691cfe979a437a6f Mon Sep 17 00:00:00 2001 From: jtigue-bdai <166445701+jtigue-bdai@users.noreply.github.com> Date: Fri, 11 Oct 2024 14:49:05 -0400 Subject: [PATCH 4/5] Apply suggestions from code review Signed-off-by: jtigue-bdai <166445701+jtigue-bdai@users.noreply.github.com> --- .../omni/isaac/lab/utils/noise/noise_model.py | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py index d99da58aae0..2eeca16b9d1 100644 --- a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py +++ b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py @@ -30,7 +30,7 @@ def constant_noise(data: torch.Tensor, cfg: noise_cfg.ConstantNoiseCfg) -> torch # fix tensor device for bias on first call and update config parameters if isinstance(cfg.bias, torch.Tensor): - cfg.bias = cfg.bias.to(device=data.device) + cfg.bias = cfg.bias.to(device=data.device) if cfg.operation == "add": return data + cfg.bias @@ -55,12 +55,10 @@ def uniform_noise(data: torch.Tensor, cfg: noise_cfg.UniformNoiseCfg) -> torch.T # fix tensor device for n_max on first call and update config parameters if isinstance(cfg.n_max, torch.Tensor): - if cfg.n_max.device is not data.device: - cfg.n_max = cfg.n_max.to(data.device) + cfg.n_max = cfg.n_max.to(data.device) # fix tensor device for n_min on first call and update config parameters if isinstance(cfg.n_min, torch.Tensor): - if cfg.n_min.device is not data.device: - cfg.n_min = cfg.n_min.to(data.device) + cfg.n_min = cfg.n_min.to(data.device) if cfg.operation == "add": return data + torch.rand_like(data) * (cfg.n_max - cfg.n_min) + cfg.n_min @@ -85,12 +83,10 @@ def gaussian_noise(data: torch.Tensor, cfg: noise_cfg.GaussianNoiseCfg) -> torch # fix tensor device for mean on first call and update config parameters if isinstance(cfg.mean, torch.Tensor): - if cfg.mean.device is not data.device: - cfg.mean = cfg.mean.to(data.device) + cfg.mean = cfg.mean.to(data.device) # fix tensor device for std on first call and update config parameters if isinstance(cfg.std, torch.Tensor): - if cfg.std.device is not data.device: - cfg.std = cfg.std.to(data.device) + cfg.std = cfg.std.to(data.device) if cfg.operation == "add": return data + cfg.mean + cfg.std * torch.randn_like(data) From 37b2101192054ea72507625edf0c235dda6ac833 Mon Sep 17 00:00:00 2001 From: Mayank Mittal Date: Sat, 12 Oct 2024 09:29:17 +0200 Subject: [PATCH 5/5] runs formatter --- .../omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py index 2eeca16b9d1..4f3e2e09c18 100644 --- a/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py +++ b/source/extensions/omni.isaac.lab/omni/isaac/lab/utils/noise/noise_model.py @@ -30,7 +30,7 @@ def constant_noise(data: torch.Tensor, cfg: noise_cfg.ConstantNoiseCfg) -> torch # fix tensor device for bias on first call and update config parameters if isinstance(cfg.bias, torch.Tensor): - cfg.bias = cfg.bias.to(device=data.device) + cfg.bias = cfg.bias.to(device=data.device) if cfg.operation == "add": return data + cfg.bias