Source code for mani_skill.agents.controllers.pd_joint_vel

from dataclasses import dataclass
from typing import Sequence, Union

import numpy as np
from gymnasium import spaces

from mani_skill.utils.structs.types import DriveMode

from .base_controller import BaseController, ControllerConfig


# TODO (stao): add GPU support here
[docs]class PDJointVelController(BaseController):
[docs] config: "PDJointVelControllerConfig"
[docs] sets_target_qpos = False
[docs] sets_target_qvel = True
[docs] def _initialize_action_space(self): n = len(self.joints) low = np.float32(np.broadcast_to(self.config.lower, n)) high = np.float32(np.broadcast_to(self.config.upper, n)) self.single_action_space = spaces.Box(low, high, dtype=np.float32)
[docs] def set_drive_property(self): n = len(self.joints) damping = np.broadcast_to(self.config.damping, n) force_limit = np.broadcast_to(self.config.force_limit, n) friction = np.broadcast_to(self.config.friction, n) for i, joint in enumerate(self.joints): drive_mode = self.config.drive_mode if not isinstance(drive_mode, str): drive_mode = drive_mode[i] joint.set_drive_properties( 0, damping[i], force_limit=force_limit[i], mode=drive_mode ) joint.set_friction(friction[i])
[docs] def set_action(self, action: np.ndarray): action = self._preprocess_action(action) self.articulation.set_joint_drive_velocity_targets( action, self.joints, self.active_joint_indices )
@dataclass
[docs]class PDJointVelControllerConfig(ControllerConfig):
[docs] lower: Union[float, Sequence[float]]
[docs] upper: Union[float, Sequence[float]]
[docs] damping: Union[float, Sequence[float]]
[docs] force_limit: Union[float, Sequence[float]] = 1e10
[docs] friction: Union[float, Sequence[float]] = 0.0
[docs] normalize_action: bool = True
[docs] drive_mode: Union[Sequence[DriveMode], DriveMode] = "force"
[docs] controller_cls = PDJointVelController