fix: NaN protection — dof nan_to_num, physics reset on crash
This commit is contained in:
@@ -326,6 +326,13 @@ class DreamWaQTask(Go1WalkTask):
|
||||
|
||||
def update_observation(self, state):
|
||||
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)
|
||||
|
||||
# 更新历史缓冲区
|
||||
|
||||
@@ -187,10 +187,12 @@ class NpEnv(ABEnv):
|
||||
for _ in range(self._cfg.sim_substeps):
|
||||
self._model.step(self._state.data)
|
||||
except Exception as e:
|
||||
# Rust panic / MotrixSim 物理崩溃 → 标记所有 env 为终止
|
||||
# Rust panic / 物理崩溃 → 标记终止 + 清除腐蚀数据
|
||||
n = self._state.data.shape[0]
|
||||
self._state.terminated[:] = True
|
||||
self._state.reward[:] = 0.0
|
||||
# 强制重置物理状态,防止 NaN 传播到 observations/rewards
|
||||
self._state.data.reset(self._model)
|
||||
if not hasattr(self, '_physics_crash_count'):
|
||||
self._physics_crash_count = 0
|
||||
self._physics_crash_count += 1
|
||||
|
||||
Reference in New Issue
Block a user