fix: NaN protection — dof nan_to_num, physics reset on crash

This commit is contained in:
8x54zj-m
2026-07-01 10:51:36 +08:00
parent 35a6f66511
commit ef3ccb2e1a
2 changed files with 10 additions and 1 deletions

View File

@@ -326,6 +326,13 @@ class DreamWaQTask(Go1WalkTask):
def update_observation(self, state): def update_observation(self, state):
data = state.data data = state.data
# 清理物理崩溃残留的 NaN/Inf仅在检测到时才修改避免无谓开销
dv = data.dof_vel
if np.any(~np.isfinite(dv)):
data.set_dof_vel(np.nan_to_num(np.array(dv), nan=0.0, posinf=0.0, neginf=0.0))
dp = data.dof_pos
if np.any(~np.isfinite(dp)):
data.set_dof_pos(np.nan_to_num(np.array(dp), nan=0.0, posinf=0.0, neginf=0.0), self._model)
obs = self._get_obs(data, state.info) obs = self._get_obs(data, state.info)
# 更新历史缓冲区 # 更新历史缓冲区

View File

@@ -187,10 +187,12 @@ class NpEnv(ABEnv):
for _ in range(self._cfg.sim_substeps): for _ in range(self._cfg.sim_substeps):
self._model.step(self._state.data) self._model.step(self._state.data)
except Exception as e: except Exception as e:
# Rust panic / MotrixSim 物理崩溃 → 标记所有 env 为终止 # Rust panic / 物理崩溃 → 标记终止 + 清除腐蚀数据
n = self._state.data.shape[0] n = self._state.data.shape[0]
self._state.terminated[:] = True self._state.terminated[:] = True
self._state.reward[:] = 0.0 self._state.reward[:] = 0.0
# 强制重置物理状态,防止 NaN 传播到 observations/rewards
self._state.data.reset(self._model)
if not hasattr(self, '_physics_crash_count'): if not hasattr(self, '_physics_crash_count'):
self._physics_crash_count = 0 self._physics_crash_count = 0
self._physics_crash_count += 1 self._physics_crash_count += 1