Skip to content

Commit 22c8750

Browse files
Updated based on feedback
1 parent 45f7aa6 commit 22c8750

File tree

4 files changed

+55
-22
lines changed

4 files changed

+55
-22
lines changed

source/isaaclab/isaaclab/envs/mdp/actions/joint_actions.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,8 @@ def IO_descriptor(self) -> GenericActionIODescriptor:
138138
else:
139139
self._IO_descriptor.offset = self._offset
140140
#FIXME: This is not correct. Add list support.
141-
if self.cfg.clip is not None:
142-
self._IO_descriptor.clip = self._clip
141+
if isinstance(self._clip, torch.Tensor):
142+
self._IO_descriptor.clip = self._clip[0].detach().cpu().numpy().tolist()
143143
else:
144144
self._IO_descriptor.clip = None
145145
return self._IO_descriptor

source/isaaclab/isaaclab/envs/mdp/observations.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030
record_dtype,
3131
record_joint_names,
3232
record_shape,
33+
record_joint_pos_offsets,
34+
record_joint_vel_offsets,
3335
)
3436

3537
"""
@@ -198,7 +200,7 @@ def joint_pos(env: ManagerBasedEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("
198200

199201

200202
@generic_io_descriptor(
201-
observation_type="JointState", on_inspect=[record_joint_names, record_dtype, record_shape], units="rad"
203+
observation_type="JointState", on_inspect=[record_joint_names, record_dtype, record_shape, record_joint_pos_offsets], units="rad"
202204
)
203205
def joint_pos_rel(env: ManagerBasedEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")) -> torch.Tensor:
204206
"""The joint positions of the asset w.r.t. the default joint positions.
@@ -241,7 +243,7 @@ def joint_vel(env: ManagerBasedEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("
241243

242244

243245
@generic_io_descriptor(
244-
observation_type="JointState", on_inspect=[record_joint_names, record_dtype, record_shape], units="rad/s"
246+
observation_type="JointState", on_inspect=[record_joint_names, record_dtype, record_shape, record_joint_vel_offsets], units="rad/s"
245247
)
246248
def joint_vel_rel(env: ManagerBasedEnv, asset_cfg: SceneEntityCfg = SceneEntityCfg("robot")):
247249
"""The joint velocities of the asset w.r.t. the default joint velocities.

source/isaaclab/isaaclab/envs/utils/io_descriptors.py

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,39 @@ def record_joint_names(output: torch.Tensor, descriptor: GenericIODescriptor, **
192192
joint_ids = list(range(len(asset.joint_names)))
193193
descriptor.joint_names = [asset.joint_names[i] for i in joint_ids]
194194

195-
196195
def record_body_names(output: torch.Tensor, descriptor: GenericIODescriptor, **kwargs):
197196
asset: Articulation = kwargs["env"].scene[kwargs["asset_cfg"].name]
198197
body_ids = kwargs["asset_cfg"].body_ids
199198
if body_ids == slice(None, None, None):
200199
body_ids = list(range(len(asset.body_names)))
201200
descriptor.body_names = [asset.body_names[i] for i in body_ids]
201+
202+
def record_joint_pos_offsets(output: torch.Tensor, descriptor: GenericIODescriptor, **kwargs):
203+
asset: Articulation = kwargs["env"].scene[kwargs["asset_cfg"].name]
204+
ids = kwargs["asset_cfg"].joint_ids
205+
# Get the offsets of the joints for the first robot in the scene.
206+
# This assumes that all robots have the same joint offsets.
207+
descriptor.joint_pos_offsets = asset.data.default_joint_pos[:, ids][0]
208+
209+
def record_joint_vel_offsets(output: torch.Tensor, descriptor: GenericIODescriptor, **kwargs):
210+
asset: Articulation = kwargs["env"].scene[kwargs["asset_cfg"].name]
211+
ids = kwargs["asset_cfg"].joint_ids
212+
# Get the offsets of the joints for the first robot in the scene.
213+
# This assumes that all robots have the same joint offsets.
214+
descriptor.joint_vel_offsets = asset.data.default_joint_vel[:, ids][0]
215+
216+
217+
def export_articulations_data(env: ManagerBasedEnv):
218+
articulation_joint_data = {}
219+
for articulation_name, articulation in env.scene.articulations.items():
220+
articulation_joint_data[articulation_name] = {}
221+
articulation_joint_data[articulation_name]["joint_names"] = articulation.joint_names
222+
articulation_joint_data[articulation_name]["default_joint_pos"] = articulation.data.default_joint_pos[0].detach().cpu().numpy().tolist()
223+
articulation_joint_data[articulation_name]["default_joint_vel"] = articulation.data.default_joint_vel[0].detach().cpu().numpy().tolist()
224+
articulation_joint_data[articulation_name]["default_joint_pos_limits"] = articulation.data.default_joint_pos_limits[0].detach().cpu().numpy().tolist()
225+
articulation_joint_data[articulation_name]["default_joint_damping"] = articulation.data.default_joint_damping[0].detach().cpu().numpy().tolist()
226+
articulation_joint_data[articulation_name]["default_joint_stiffness"] = articulation.data.default_joint_stiffness[0].detach().cpu().numpy().tolist()
227+
articulation_joint_data[articulation_name]["default_joint_friction"] = articulation.data.default_joint_friction[0].detach().cpu().numpy().tolist()
228+
articulation_joint_data[articulation_name]["default_joint_armature"] = articulation.data.default_joint_armature[0].detach().cpu().numpy().tolist()
229+
return articulation_joint_data
230+

source/isaaclab/isaaclab/managers/observation_manager.py

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -233,9 +233,10 @@ def get_IO_descriptors(self):
233233
A dictionary with keys as the group names and values as the IO descriptors.
234234
"""
235235

236-
data = []
236+
group_data = {}
237237

238238
for group_name in self._group_obs_term_names:
239+
group_data[group_name] = []
239240
# check ig group name is valid
240241
if group_name not in self._group_obs_term_names:
241242
raise ValueError(
@@ -261,26 +262,27 @@ def get_IO_descriptors(self):
261262
if k in ["modifiers", "clip", "scale", "history_length", "flatten_history_dim"]:
262263
overloads[k] = v
263264
desc.update(overloads)
264-
data.append(desc)
265+
group_data[group_name].append(desc)
265266
except Exception as e:
266267
print(f"Error getting IO descriptor for term '{term_name}' in group '{group_name}': {e}")
267268
# Format the data for YAML export
268269
formatted_data = {}
269-
for item in data:
270-
name = item.pop("name")
271-
formatted_item = {"overloads": {}, "extras": item.pop("extras")}
272-
for k, v in item.items():
273-
# Check if v is a tuple and convert to list
274-
if isinstance(v, tuple):
275-
v = list(v)
276-
if k in ["scale", "clip", "history_length", "flatten_history_dim"]:
277-
formatted_item["overloads"][k] = v
278-
elif k in ["modifiers", "description", "units"]:
279-
formatted_item["extras"][k] = v
280-
else:
281-
formatted_item[k] = v
282-
formatted_data[name] = formatted_item
283-
270+
for group_name, data in group_data.items():
271+
formatted_data[group_name] = []
272+
for item in data:
273+
name = item.pop("name")
274+
formatted_item = {"name": name, "overloads": {}, "extras": item.pop("extras")}
275+
for k, v in item.items():
276+
# Check if v is a tuple and convert to list
277+
if isinstance(v, tuple):
278+
v = list(v)
279+
if k in ["scale", "clip", "history_length", "flatten_history_dim"]:
280+
formatted_item["overloads"][k] = v
281+
elif k in ["modifiers", "description", "units"]:
282+
formatted_item["extras"][k] = v
283+
else:
284+
formatted_item[k] = v
285+
formatted_data[group_name].append(formatted_item)
284286
return formatted_data
285287

286288
"""

0 commit comments

Comments
 (0)