code: def frames(self):
          
          if not self._running:
              raise RuntimeError('Device pointing to %s not runnning. Cannot read frames' %(self._path_to_images))
  
          if self._im_index >= self._num_images:
              raise RuntimeError('Device is out of images')
  
          # read images
          datapoint = self._dataset.datapoint(self._im_index,
                                              TensorDatasetVirtualSensor.IMAGE_FIELDS)
          color_im = ColorImage(datapoint[TensorDatasetVirtualSensor.COLOR_IM_FIELD],
                                frame=self._frame)
          depth_im = DepthImage(datapoint[TensorDatasetVirtualSensor.DEPTH_IM_FIELD],
                                frame=self._frame)
          if self._image_rescale_factor != 1.0:
              color_im = color_im.resize(self._image_rescale_factor)
              depth_im = depth_im.resize(self._image_rescale_factor, interp='nearest')
          self._im_index = (self._im_index + 1) % self._num_images
          return color_im, depth_im, None
docs: Retrieve the next frame from the tensor dataset and convert it to a ColorImage,
          a DepthImage, and an IrImage.
  
          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.
  
          Raises
          ------
          RuntimeError
              If the stream is not running or if all images in the
              directory have been used.