def frames(self):
        """Retrieve a new frame from the PhoXi 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.
        """
        # Run a software trigger
        times = []

        rospy.ServiceProxy('phoxi_camera/start_acquisition', Empty)()
        rospy.ServiceProxy('phoxi_camera/trigger_image', TriggerImage)()

        self._cur_color_im = None
        self._cur_depth_im = None
        self._cur_normal_map = None

        rospy.ServiceProxy('phoxi_camera/get_frame', GetFrame)(-1)

        max_time = 5.0
        time_waiting = 0.0
        while self._cur_color_im is None or self._cur_depth_im is None or self._cur_normal_map is None:
            time.sleep(0.05)
            time_waiting += 0.05
            if time_waiting > max_time:
                raise SensorUnresponsiveException('PhoXi sensor seems to be non-responsive')
        return self._cur_color_im, self._cur_depth_im, None