robosuite里面的render

MujocoEnv里面通过_initialize_sim函数初始化了MjSim类型的self.sim成员

# MujocoEnv._initialize_sim
def _initialize_sim(self, xml_string=None):
    """
    Creates a MjSim object and stores it in self.sim. If @xml_string is specified, the MjSim object will be created
    from the specified xml_string. Else, it will pull from self.model to instantiate the simulation
    Args:
        xml_string (str): If specified, creates MjSim object from this filepath
    """
		xml = xml_string if xml_string else self.model.get_xml()

    # Create the simulation instance
    self.sim = MjSim.from_xml_string(xml)   # self.sim = MjSim()

    # run a single step to make sure changes have propagated through sim state
    self.sim.forward()
class MjSim:
  def __init__(self, model):
    """
    Args:
        model: should be an MjModel instance created via a factory function
        such as mujoco.MjModel.from_xml_string(xml)
    """
    self.model = MjModel(model)
    self.data = MjData(self.model)

    # offscreen render context object
    self._render_context_offscreen = None

MjSim有三个重要的成员,modelMjModel类型,其中的_model成员其实就是mujoco.MjModel.from_xml_path得到的mujoco模型对象,dataMjData类型,其中的_data成员其实就是mujoco.MjData得到的mujoco数据对象,_render_context_offscreenMjRenderContextOffscreen类型,负责渲染,并返回摄像头的数据

MjSim里面的render函数就是调用了MjRenderContextOffscreen的父类MjRenderContext的render函数,然后获取摄像头的数据

# MjSim.render
def render(self,width=None,height=None,...):
	  camera_id = self.model.camera_name2id(camera_name)
	  with _MjSim_render_lock:
      self._render_context_offscreen.render(width=width, height=height,...)
	      return self._render_context_offscreen.read_pixels(width, height,...)

至于MjRenderContextrender函数,就是调用了mujoco原生的api,包括MjrRectmjv_updateScenemjr_render,可以看到MjRenderContext里面也有modeldata两个成员,因为它在构造的时候需要传入MjSim对象,这两个成员其实就是MjSimmodeldata

# MjRenderContext.render
def render(self, width, height, camera_id=None, segmentation=False):
  viewport = mujoco.MjrRect(0, 0, width, height)
  mujoco.mjv_updateScene(
      self.model._model, self.data._data, self.vopt, self.pert, self.cam, mujoco.mjtCatBit.mjCAT_ALL, self.scn
	  )
  mujoco.mjr_render(viewport, self.scn, self.con)

在MujocoEnv里面是通过viewer成员来调用render函数的,这个viewer成员是个OpenCVRenderer类型的对象,在构造的时候拿到了MujocoEnv的sim成员,然后调用simrender函数,拿到图像数据并显示出来

# OpenCVRenderer.render
def render(self):
    im = self.sim.render(self.camera_name, self.height, self.width)[..., ::-1]
    im = np.flip(im, axis=0)
    cv2.imshow("offscreen render", im)
    key = cv2.waitKey(1)
    if self.keypress_callback:
        self.keypress_callback(key)

这样关系就清楚了

viewer.render() --> sim.render() --> _render_context_offscreen.render&read_pixels

那为什么不直接sim.render,还要多出来一个viewer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值