robopal.controllers.jnt_vel_controller 源代码

from collections import deque

import numpy as np

from robopal.controllers.base_controller import BaseController


[文档] class JointVelocityController(BaseController): def __init__( self, robot, is_interpolate=False, interpolator_config: dict = None ): super().__init__(robot) if is_interpolate: raise ValueError("JointVelocityController does not support interpolation") self.name = 'JNTVEL' # hyperparameters of impedance controller self.k_p = np.zeros(self.dofs) self.k_d = np.zeros(self.dofs) self.set_jnt_params( p=0.3 * np.ones(self.dofs), d=0.1 * np.ones(self.dofs), ) self.last_err = np.zeros(robot.jnt_num) self.err_buffer = deque(maxlen=5)
[文档] def set_jnt_params(self, p: np.ndarray, d: np.ndarray): self.k_p = p self.k_d = d
[文档] def compute_jnt_torque( self, q_des: np.ndarray, v_des: np.ndarray, q_cur: np.ndarray, v_cur: np.ndarray, agent: str = 'agent0' ): """ robot的关节空间控制的计算公式 Compute desired torque with robot dynamics modeling: > k_p * (vd - v) = tau :param q_des: desired joint position :param v_des: desired joint velocity :param q_cur: current joint position :param v_cur: current joint velocity :return: desired joint torque """ compensation = self.robot.get_coriolis_gravity_compensation(agent) err = v_des - v_cur derr = err - self.last_err self.last_err = err self.err_buffer.append(derr) tau = self.k_p * err - self.k_d * np.asarray(self.err_buffer).flatten().mean() + compensation return tau
[文档] def step_controller(self, action): q_target, qdot_target = np.zeros(self.dofs), action torque = self.compute_jnt_torque( q_des=q_target, v_des=qdot_target, q_cur=self.robot.get_arm_qpos(), v_cur=self.robot.get_arm_qvel(), ) return torque