Prevent division by zero in Ornstein–Uhlenbeck control noise.

PiperOrigin-RevId: 498753494
Change-Id: Ib43e165a4da524c12fab4ea05848b084b2e7713c
This commit is contained in:
Kevin Zakka
2022-12-31 10:28:11 -08:00
committed by Copybara-Service
parent eb8389fead
commit a173e01f42
4 changed files with 7 additions and 2 deletions
+1
View File
@@ -737,6 +737,7 @@ Euler integrator, semi-implicit in velocity.
def test_float_constant(self):
self.assertEqual(mujoco.mjMAXVAL, 1e10)
self.assertEqual(mujoco.mjMINVAL, 1e-15)
def test_string_constants(self):
self.assertLen(mujoco.mjDISABLESTRING, mujoco.mjtDisableBit.mjNDISABLE)
+3
View File
@@ -78,6 +78,9 @@ PYBIND11_MODULE(_constants, pymodule) {
// from mujoco.h
X(mjVERSION_HEADER);
// from mjtnum.h
X(mjMINVAL);
#undef X
pymodule.attr("mjDISABLESTRING") = MakeTuple(mjDISABLESTRING);
pymodule.attr("mjENABLESTRING") = MakeTuple(mjENABLESTRING);
+2 -1
View File
@@ -136,7 +136,8 @@ def _physics_loop(simulate: Simulate, loader: Optional[_InternalLoaderType]):
# Inject noise.
if simulate.ctrlnoisestd != 0.0:
# Convert rate and scale to discrete time (OrnsteinUhlenbeck).
rate = math.exp(-m.opt.timestep / simulate.ctrlnoiserate)
rate = math.exp(-m.opt.timestep /
max(simulate.ctrlnoiserate, mujoco.mjMINVAL))
scale = simulate.ctrlnoisestd * math.sqrt(1 - rate * rate)
for i in range(m.nu):
+1 -1
View File
@@ -330,7 +330,7 @@ void PhysicsLoop(mj::Simulate& sim) {
// inject noise
if (sim.ctrlnoisestd) {
// convert rate and scale to discrete time (OrnsteinUhlenbeck)
mjtNum rate = mju_exp(-m->opt.timestep / sim.ctrlnoiserate);
mjtNum rate = mju_exp(-m->opt.timestep / mju_max(sim.ctrlnoiserate, mjMINVAL));
mjtNum scale = sim.ctrlnoisestd * mju_sqrt(1-rate*rate);
for (int i=0; i<m->nu; i++) {