docs: def _frames_and_index_map(self, skip_registration=False):
          """Retrieve a new frame from the Kinect and return a ColorImage,
          DepthImage, IrImage, and a map from depth pixels to color pixel indices.
  
          Parameters
          ----------
          skip_registration : bool
              If True, the registration step is skipped.
  
          Returns
          -------
          :obj:`tuple` of :obj:`ColorImage`, :obj:`DepthImage`, :obj:`IrImage`, :obj:`numpy.ndarray`
              The ColorImage, DepthImage, and IrImage of the current frame, and an
              ndarray that maps pixels of the depth image to the index of the
              corresponding pixel in the color image.
  
          Raises
          ------
          RuntimeError
              If the Kinect stream is not running.
          """
          if not self._running:
              raise RuntimeError('Kinect2 device %s not runnning. Cannot read frames' %(self._device_num))
  
          # read frames
          frames = self._listener.waitForNewFrame()
          unregistered_color = frames['color']
          distorted_depth = frames['depth']
          ir = frames['ir']
  
          # apply color to depth registration
          color_frame = self._color_frame
          color = unregistered_color
          depth = distorted_depth
          color_depth_map = np.zeros([depth.height, depth.width]).astype(np.int32).ravel()
          if not skip_registration and self._registration_mode == Kinect2RegistrationMode.COLOR_TO_DEPTH:
              color_frame = self._ir_frame
              depth = lf2.Frame(depth.width, depth.height, 4, lf2.FrameType.Depth)
              color = lf2.Frame(depth.width, depth.height, 4, lf2.FrameType.Color)
              self._registration.apply(unregistered_color, distorted_depth, depth, color, color_depth_map=color_depth_map)
  
          # convert to array (copy needed to prevent reference of deleted data
          color_arr = copy.copy(color.asarray())
          color_arr[:,:,[0,2]] = color_arr[:,:,[2,0]] # convert BGR to RGB
          color_arr[:,:,0] = np.fliplr(color_arr[:,:,0])
          color_arr[:,:,1] = np.fliplr(color_arr[:,:,1])
          color_arr[:,:,2] = np.fliplr(color_arr[:,:,2])
          color_arr[:,:,3] = np.fliplr(color_arr[:,:,3])
          depth_arr = np.fliplr(copy.copy(depth.asarray()))
          ir_arr = np.fliplr(copy.copy(ir.asarray()))
  
          # convert meters
          if self._depth_mode == Kinect2DepthMode.METERS:
              depth_arr = depth_arr * MM_TO_METERS
  
          # Release and return
          self._listener.release(frames)
          return (ColorImage(color_arr[:,:,:3], color_frame),
                  DepthImage(depth_arr, self._ir_frame),
                  IrImage(ir_arr.astype(np.uint16), self._ir_frame),
                  color_depth_map)