robopal.controllers.jnt_imp_controller 源代码
import numpy as np
from robopal.controllers.base_controller import BaseController
[文档]
class JointImpedanceController(BaseController):
def __init__(
self,
robot,
is_interpolate=False,
interpolator_config: dict = None
):
super().__init__(robot)
self.name = 'JNTIMP'
# hyperparameters of impedance controller
self.B = np.zeros(self.dofs)
self.K = np.zeros(self.dofs)
self.set_jnt_params(
b=20.0 * np.ones(self.dofs),
k=80.0 * np.ones(self.dofs),
)
# choose interpolator
self.interpolator = None
if is_interpolate:
interpolator_config.setdefault('init_qpos', robot.get_arm_qpos())
interpolator_config.setdefault('init_qvel', robot.get_arm_qvel())
self._init_interpolator(interpolator_config)
[文档]
def set_jnt_params(self, b: np.ndarray, k: np.ndarray):
""" Used for changing the parameters. """
self.B = np.array(b)
self.K = np.array(k)
[文档]
def compute_jnt_torque(
self,
q_des: np.ndarray,
v_des: np.ndarray,
q_cur: np.ndarray,
v_cur: np.ndarray,
agent: str = 'agent0'
) -> np.ndarray:
""" robot的关节空间控制的计算公式
Compute desired torque with robot dynamics modeling:
> M(q)qdd + C(q, qd)qd + G(q) + tau_F(qd) = tau_ctrl + tau_env
: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
"""
if self.interpolator is not None:
q_des, v_des = self.interpolator.update_state()
M = self.robot.get_mass_matrix(agent)
compensation = self.robot.get_coriolis_gravity_compensation(agent)
acc_desire = self.K * (q_des - q_cur) + self.B * (v_des - v_cur)
tau = np.dot(M, acc_desire) + compensation
return tau
[文档]
def step_controller(self, action):
"""
:param action: joint position
:return: joint torque
"""
ret = dict()
if isinstance(action, np.ndarray):
action = {self.robot.agents[0]: action}
for agent, act in action.items():
torque = self.compute_jnt_torque(
q_des=act,
v_des=np.zeros(self.dofs),
q_cur=self.robot.get_arm_qpos(agent),
v_cur=self.robot.get_arm_qvel(agent),
agent=agent
)
ret[agent] = torque
return ret
def _init_interpolator(self, cfg: dict):
try:
from robopal.controllers.planners.interpolators import OTG
except ImportError:
raise ImportError("Please install ruckig first: pip install ruckig")
self.interpolator = OTG(
OTG_dim=cfg['dof'],
control_cycle=cfg['control_timestep'],
max_velocity=0.2,
max_acceleration=0.4,
max_jerk=0.6
)
self.interpolator.set_params(cfg['init_qpos'], cfg['init_qvel'])
[文档]
def step_interpolator(self, action):
self.interpolator.update_target_position(action)
[文档]
def reset(self):
if self.interpolator is not None:
self.interpolator.set_params(self.robot.get_arm_qpos(), self.robot.get_arm_qvel())