Skip to content

Commit 7b20de0

Browse files
Fix joint_pos_out_limit and joint_pos_out_of_manual_limit terminations
1 parent 82cb320 commit 7b20de0

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

source/isaaclab/isaaclab/envs/mdp/terminations.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,23 @@ def root_height_below_minimum(
7878

7979

8080
def joint_pos_out_of_limit(env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor:
81-
"""Terminate when the asset's joint positions are outside of the soft joint limits."""
82-
# extract the used quantities (to enable type-hinting)
81+
"""
82+
Return a boolean tensor of shape `[num_envs]`:
83+
`True` if *any* of the (optionally selected) joints in an env are
84+
outside their soft joint‑position limits.
85+
"""
8386
asset: Articulation = env.scene[asset_cfg.name]
84-
# compute any violations
85-
out_of_upper_limits = torch.any(asset.data.joint_pos > asset.data.soft_joint_pos_limits[..., 1], dim=1)
86-
out_of_lower_limits = torch.any(asset.data.joint_pos < asset.data.soft_joint_pos_limits[..., 0], dim=1)
87-
return torch.logical_or(out_of_upper_limits[:, asset_cfg.joint_ids], out_of_lower_limits[:, asset_cfg.joint_ids])
87+
88+
# Per‑env‑per‑joint mask of violations
89+
joint_pos = asset.data.joint_pos # [N_envs, N_joints]
90+
joint_lower = asset.data.soft_joint_pos_limits[..., 0]
91+
joint_upper = asset.data.soft_joint_pos_limits[..., 1]
92+
violations = (joint_pos < joint_lower) | (joint_pos > joint_upper)
93+
94+
joint_ids = asset_cfg.joint_ids if asset_cfg.joint_ids is not None else slice(None)
95+
96+
# Reduce over *selected* joints → [N_envs]
97+
return torch.any(violations[:, joint_ids], dim=1)
8898

8999

90100
def joint_pos_out_of_manual_limit(
@@ -95,14 +105,15 @@ def joint_pos_out_of_manual_limit(
95105
Note:
96106
This function is similar to :func:`joint_pos_out_of_limit` but allows the user to specify the bounds manually.
97107
"""
98-
# extract the used quantities (to enable type-hinting)
99108
asset: Articulation = env.scene[asset_cfg.name]
100-
if asset_cfg.joint_ids is None:
101-
asset_cfg.joint_ids = slice(None)
102-
# compute any violations
103-
out_of_upper_limits = torch.any(asset.data.joint_pos[:, asset_cfg.joint_ids] > bounds[1], dim=1)
104-
out_of_lower_limits = torch.any(asset.data.joint_pos[:, asset_cfg.joint_ids] < bounds[0], dim=1)
105-
return torch.logical_or(out_of_upper_limits, out_of_lower_limits)
109+
110+
joint_ids = asset_cfg.joint_ids if asset_cfg.joint_ids is not None else slice(None)
111+
joint_pos = asset.data.joint_pos[:, joint_ids] # [N_envs, N_selected]
112+
113+
violations = (joint_pos < bounds[0]) | (joint_pos > bounds[1])
114+
115+
# Reduce over joints → [N_envs]
116+
return torch.any(violations, dim=1)
106117

107118

108119
def joint_vel_out_of_limit(env: ManagerBasedRLEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor:

0 commit comments

Comments
 (0)