class_docstr: VideoWrapper which generates videos from a mujoco physics object.
  
  This passes its keyword arguments into the parent `VideoWrapper` class (refer
  here for any default arguments).
code: def _render_frame(self, unused_observation):
      del unused_observation
  
      # We've checked above that this attribute should exist. Pytype won't like
      # it if we just try and do self.environment.physics, so we use the slightly
      # grosser version below.
      physics = getattr(self.environment, "physics")
  
      if self._camera_id is not None:
          frame = physics.render(
              camera_id=self._camera_id,
              height=self._height,
              width=self._width,
          )
      else:
          # If camera_id is None, we create a minimal canvas that will accommodate
          # physics.model.ncam frames, and render all of them on a grid.
          num_cameras = physics.model.ncam
          num_columns = int(np.ceil(np.sqrt(num_cameras)))
          num_rows = int(np.ceil(float(num_cameras) / num_columns))
          height = self._height
          width = self._width
  
          # Make a black canvas.
          frame = np.zeros(
              (num_rows * height, num_columns * width, 3),
              dtype=np.uint8,
          )
  
          for col in range(num_columns):
              for row in range(num_rows):
                  camera_id = row * num_columns + col
  
                  if camera_id >= num_cameras:
                      break
  
                  subframe = physics.render(
                      camera_id=camera_id, height=height, width=width
                  )
  
                  # Place the frame in the appropriate rectangle on the pixel canvas.
                  frame[
                      row * height : (row + 1) * height,
                      col * width : (col + 1) * width,
                  ] = subframe
  
      return frame
  
imports: import os.path
  import tempfile
  from typing import Callable, Optional, Sequence, Tuple, Union
  from acme.utils import paths
  from acme.wrappers import base
  import dm_env
  import matplotlib
  import matplotlib.animation
  import matplotlib.pyplot
  import numpy
label_desc: Use image node_id 2 for calling the MujocoVideoWrapper obj's underlying member method code with example usage: obj._render_frame(unused_observation) and returns: frame