isaaclab_mimic.envs.franka_stack_ik_abs_mimic_env 源代码
# Copyright (c) 2024-2026, The Isaac Lab Project Developers (https://github.com/isaac-sim/IsaacLab/blob/main/CONTRIBUTORS.md).
# All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
import torch
from collections.abc import Sequence
import isaaclab.utils.math as PoseUtils
from isaaclab.envs import ManagerBasedRLMimicEnv
[文档]
class FrankaCubeStackIKAbsMimicEnv(ManagerBasedRLMimicEnv):
"""
Isaac Lab Mimic environment wrapper class for Franka Cube Stack IK Abs env.
"""
[文档]
def get_robot_eef_pose(self, eef_name: str, env_ids: Sequence[int] | None = None) -> torch.Tensor:
"""Get current robot end effector pose."""
if env_ids is None:
env_ids = slice(None)
# Retrieve end effector pose from the observation buffer
eef_pos = self.obs_buf["policy"]["eef_pos"][env_ids]
eef_quat = self.obs_buf["policy"]["eef_quat"][env_ids]
# Quaternion format is w,x,y,z
return PoseUtils.make_pose(eef_pos, PoseUtils.matrix_from_quat(eef_quat))
[文档]
def target_eef_pose_to_action(
self, target_eef_pose_dict: dict, gripper_action_dict: dict, noise: float | None = None, env_id: int = 0
) -> torch.Tensor:
"""Convert target pose to action.
This method transforms a dictionary of target end-effector poses and gripper actions
into a single action tensor that can be used by the environment.
The function:
1. Extracts target position and rotation from the pose dictionary
2. Extracts gripper action for the end effector
3. Concatenates position and quaternion rotation into a pose action
4. Optionally adds noise to the pose action for exploration
5. Combines pose action with gripper action into a final action tensor
Args:
target_eef_pose_dict: Dictionary containing target end-effector pose(s),
with keys as eef names and values as pose tensors.
gripper_action_dict: Dictionary containing gripper action(s),
with keys as eef names and values as action tensors.
noise: Optional noise magnitude to apply to the pose action for exploration.
If provided, random noise is generated and added to the pose action.
env_id: Environment ID for multi-environment setups, defaults to 0.
Returns:
torch.Tensor: A single action tensor combining pose and gripper commands.
"""
# target position and rotation
(target_eef_pose,) = target_eef_pose_dict.values()
target_pos, target_rot = PoseUtils.unmake_pose(target_eef_pose)
# get gripper action for single eef
(gripper_action,) = gripper_action_dict.values()
# add noise to action
pose_action = torch.cat([target_pos, PoseUtils.quat_from_matrix(target_rot)], dim=0)
if noise is not None:
noise = noise * torch.randn_like(pose_action)
pose_action += noise
return torch.cat([pose_action, gripper_action], dim=0).unsqueeze(0)
[文档]
def action_to_target_eef_pose(self, action: torch.Tensor) -> dict[str, torch.Tensor]:
"""Convert action to target pose."""
eef_name = list(self.cfg.subtask_configs.keys())[0]
target_pos = action[:, :3]
target_quat = action[:, 3:7]
target_rot = PoseUtils.matrix_from_quat(target_quat)
target_poses = PoseUtils.make_pose(target_pos, target_rot).clone()
return {eef_name: target_poses}
[文档]
def actions_to_gripper_actions(self, actions: torch.Tensor) -> dict[str, torch.Tensor]:
"""Extract gripper actions."""
# last dimension is gripper action
return {list(self.cfg.subtask_configs.keys())[0]: actions[:, -1:]}
[文档]
def get_subtask_term_signals(self, env_ids: Sequence[int] | None = None) -> dict[str, torch.Tensor]:
"""Get subtask termination signals."""
if env_ids is None:
env_ids = slice(None)
signals = dict()
subtask_terms = self.obs_buf["subtask_terms"]
signals["grasp_1"] = subtask_terms["grasp_1"][env_ids]
signals["grasp_2"] = subtask_terms["grasp_2"][env_ids]
signals["stack_1"] = subtask_terms["stack_1"][env_ids]
return signals