-
Notifications
You must be signed in to change notification settings - Fork 2.6k
Closed
Description
Proposal
IsaacLab/source/extensions/omni.isaac.lab/omni/isaac/lab/envs/mdp/events.py
Lines 219 to 287 in a25b994
| def randomize_actuator_gains( | |
| env: ManagerBasedEnv, | |
| env_ids: torch.Tensor | None, | |
| asset_cfg: SceneEntityCfg, | |
| stiffness_distribution_params: tuple[float, float] | None = None, | |
| damping_distribution_params: tuple[float, float] | None = None, | |
| operation: Literal["add", "scale", "abs"] = "abs", | |
| distribution: Literal["uniform", "log_uniform", "gaussian"] = "uniform", | |
| ): | |
| """Randomize the actuator gains in an articulation by adding, scaling, or setting random values. | |
| This function allows randomizing the actuator stiffness and damping gains. | |
| The function samples random values from the given distribution parameters and applies the operation to the joint properties. | |
| It then sets the values into the actuator models. If the distribution parameters are not provided for a particular property, | |
| the function does not modify the property. | |
| .. tip:: | |
| For implicit actuators, this function uses CPU tensors to assign the actuator gains into the simulation. | |
| In such cases, it is recommended to use this function only during the initialization of the environment. | |
| Raises: | |
| NotImplementedError: If the joint indices are in explicit motor mode. This operation is currently | |
| not supported for explicit actuator models. | |
| """ | |
| # extract the used quantities (to enable type-hinting) | |
| asset: Articulation = env.scene[asset_cfg.name] | |
| # resolve environment ids | |
| if env_ids is None: | |
| env_ids = torch.arange(env.scene.num_envs, device=asset.device) | |
| # resolve joint indices | |
| if asset_cfg.joint_ids == slice(None): | |
| joint_ids_list = range(asset.num_joints) | |
| joint_ids = slice(None) # for optimization purposes | |
| else: | |
| joint_ids_list = asset_cfg.joint_ids | |
| joint_ids = torch.tensor(asset_cfg.joint_ids, dtype=torch.int, device=asset.device) | |
| # check if none of the joint indices are in explicit motor mode | |
| for joint_index in joint_ids_list: | |
| for act_name, actuator in asset.actuators.items(): | |
| # if joint indices are a slice (i.e., all joints are captured) or the joint index is in the actuator | |
| if actuator.joint_indices == slice(None) or joint_index in actuator.joint_indices: | |
| if not isinstance(actuator, ImplicitActuator): | |
| raise NotImplementedError( | |
| "Event term 'randomize_actuator_stiffness_and_damping' is performed on asset" | |
| f" '{asset_cfg.name}' on the joint '{asset.joint_names[joint_index]}' ('{joint_index}') which" | |
| f" uses an explicit actuator model '{act_name}<{actuator.__class__.__name__}>'. This operation" | |
| " is currently not supported for explicit actuator models." | |
| ) | |
| # sample joint properties from the given ranges and set into the physics simulation | |
| # -- stiffness | |
| if stiffness_distribution_params is not None: | |
| stiffness = asset.data.default_joint_stiffness.to(asset.device).clone() | |
| stiffness = _randomize_prop_by_op( | |
| stiffness, stiffness_distribution_params, env_ids, joint_ids, operation=operation, distribution=distribution | |
| )[env_ids][:, joint_ids] | |
| asset.write_joint_stiffness_to_sim(stiffness, joint_ids=joint_ids, env_ids=env_ids) | |
| # -- damping | |
| if damping_distribution_params is not None: | |
| damping = asset.data.default_joint_damping.to(asset.device).clone() | |
| damping = _randomize_prop_by_op( | |
| damping, damping_distribution_params, env_ids, joint_ids, operation=operation, distribution=distribution | |
| )[env_ids][:, joint_ids] | |
| asset.write_joint_damping_to_sim(damping, joint_ids=joint_ids, env_ids=env_ids) | |
Handle the case where the actuator is explicit
Metadata
Metadata
Assignees
Labels
No labels