code: def deproject(self, depth_image):
          
          # check valid input
          if not isinstance(depth_image, DepthImage):
              raise ValueError('Must provide DepthImage object for projection')
          if depth_image.frame != self._frame:
              raise ValueError('Cannot deproject points in frame %s from camera with frame %s' %(depth_image.frame, self._frame))
  
          # create homogeneous pixels
          row_indices = np.arange(depth_image.height)
          col_indices = np.arange(depth_image.width)
          pixel_grid = np.meshgrid(col_indices, row_indices)
          pixels = np.c_[pixel_grid[0].flatten(), pixel_grid[1].flatten()].T
          depth_data = depth_image.data.flatten()
          pixels_homog = np.r_[pixels, depth_data.reshape(1, depth_data.shape[0])]
  
          # deproject
          points_3d = np.linalg.inv(self.S).dot(pixels_homog - np.tile(self.t.reshape(3,1), [1, pixels_homog.shape[1]]))
          return PointCloud(data=points_3d, frame=self._frame)
docs: Deprojects a DepthImage into a PointCloud.
  
          Parameters
          ----------
          depth_image : :obj:`DepthImage`
              The 2D depth image to projet into a point cloud.
  
          Returns
          -------
          :obj:`autolab_core.PointCloud`
              A 3D point cloud created from the depth image.
  
          Raises
          ------
          ValueError
              If depth_image is not a valid DepthImage in the same reference frame
              as the camera.