<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def frames(self):
 """Retrieve a new frame from the Ensenso and convert it to a ColorImage, a DepthImage, and an IrImage. 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 Ensenso stream is not running. """

        # wait for a new image
        while self._cur_depth_im is None:
            time.sleep(0.01)
            
        # read next image
        depth_im = self._cur_depth_im
        color_im = ColorImage(np.zeros([depth_im.height,
                                        depth_im.width,
                                        3]).astype(np.uint8), frame=self._frame)
        self._cur_depth_im = None
        return color_im, depth_im, None