robopal.envs.robot 源代码
from typing import Union, Dict
import numpy as np
import mujoco
from robopal.envs.base import MujocoEnv
from robopal.controllers import controllers, BaseController
[文档]
class RobotEnv(MujocoEnv):
""" Robot environment.
:param robot: Robot configuration.
:param render_mode: Choose the render mode.
:param controller: Choose the controller.
:param control_freq: Upper-layer control frequency. i.g. frame per second-fps
Note that high frequency will cause high time-lag.
:param is_interpolate: Use interpolator while stepping.
:param enable_camera_viewer: Use camera or not.
"""
def __init__(self,
robot=None,
control_freq=200,
enable_camera_viewer=False,
controller='JNTIMP',
is_interpolate=False,
camera_name=None,
render_mode='human',
):
super().__init__(
robot=robot,
control_freq=control_freq,
enable_camera_viewer=enable_camera_viewer,
camera_name=camera_name,
render_mode=render_mode,
)
self.is_interpolate = is_interpolate
# choose controller
assert controller in controllers, f"Not supported controller, you can choose from {controllers.keys()}"
self.controller: BaseController = controllers[controller](
self.robot,
is_interpolate=is_interpolate,
interpolator_config={'dof': self.robot.jnt_num, 'control_timestep': self.control_timestep}
)
# check the control frequency
self._n_substeps = int(self.control_timestep / self.model_timestep)
if self._n_substeps == 0:
raise ValueError("Control frequency is too low. Checkout you are not in renderer mode."
"Current Model-Timestep:{}".format(self.model_timestep))
# memorize the initial position and rotation
self.init_pos = dict()
self.init_quat = dict()
for agent in self.robot.agents:
self.init_pos[agent], self.init_quat[agent] = self.controller.forward_kinematics(self.robot.get_arm_qpos(agent), agent)
self.robot.init_pos = self.init_pos
self.robot.init_quat = self.init_quat
[文档]
def auto_render(func):
""" Automatically render the scene. """
def wrapper(self, *args, **kwargs):
ret = func(self, *args, **kwargs)
self.render()
return ret
return wrapper
[文档]
@auto_render
def step(self, action: Union[np.ndarray, Dict[str, np.ndarray]]):
if self.is_interpolate:
self.controller.step_interpolator(action)
joint_inputs = self.controller.step_controller(action)
# Send joint_inputs to simulation
if isinstance(joint_inputs, np.ndarray):
self.set_actuator_ctrl(joint_inputs)
else:
for agent in self.robot.agents:
self.set_actuator_ctrl(joint_inputs[agent], agent)
super().step()
[文档]
def set_gripper_ctrl(self, actuator_name: str, actuator_value: int, agent: str = "arm0"):
""" Gripper control.
:param actuator_name: Gripper actuator name.
:param actuator_value: Gripper actuator value.
"""
self.mj_data.actuator(actuator_name).ctrl = actuator_value
[文档]
@auto_render
def reset(self, seed=None, options=None):
self.controller.reset()
super().reset(seed, options)
@property
def dt(self):
"""
Time of each upper step in the environment.
"""
return self._n_substeps * self.mj_model.opt.timestep