@@ -78,13 +78,23 @@ def root_height_below_minimum(
78
78
79
79
80
80
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
+ """
83
86
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 )
88
98
89
99
90
100
def joint_pos_out_of_manual_limit (
@@ -95,14 +105,15 @@ def joint_pos_out_of_manual_limit(
95
105
Note:
96
106
This function is similar to :func:`joint_pos_out_of_limit` but allows the user to specify the bounds manually.
97
107
"""
98
- # extract the used quantities (to enable type-hinting)
99
108
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 )
106
117
107
118
108
119
def joint_vel_out_of_limit (env : ManagerBasedRLEnv , asset_cfg : SceneEntityCfg = SceneEntityCfg ("robot" )) -> torch .Tensor :
0 commit comments