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):
|
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)
|
||||||
|
|
||||||
# 更新历史缓冲区
|
# 更新历史缓冲区
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user