code: def project(self, point_cloud, round_px=True):
          
          if not isinstance(point_cloud, PointCloud) and not (isinstance(point_cloud, Point) and point_cloud.dim == 3):
              raise ValueError('Must provide PointCloud or 3D Point object for projection')
          if point_cloud.frame != self._frame:
              raise ValueError('Cannot project points in frame %s into camera with frame %s' %(point_cloud.frame, self._frame))
  
          points_proj = self._K.dot(point_cloud.data)
          if len(points_proj.shape) == 1:
              points_proj = points_proj[:, np.newaxis]
          point_depths = np.tile(points_proj[2,:], [3, 1])
          points_proj = np.divide(points_proj, point_depths)
          if round_px:
              points_proj = np.round(points_proj)
  
          if isinstance(point_cloud, Point):
              return Point(data=points_proj[:2,:].astype(np.int16), frame=self._frame)
          return ImageCoords(data=points_proj[:2,:].astype(np.int16), frame=self._frame)
docs: Projects a point cloud onto the camera image plane.
  
          Parameters
          ----------
          point_cloud : :obj:`autolab_core.PointCloud` or :obj:`autolab_core.Point`
              A PointCloud or Point to project onto the camera image plane.
  
          round_px : bool
              If True, projections are rounded to the nearest pixel.
  
          Returns
          -------
          :obj:`autolab_core.ImageCoords` or :obj:`autolab_core.Point`
              A corresponding set of image coordinates representing the given
              PointCloud's projections onto the camera image plane. If the input
              was a single Point, returns a 2D Point in the camera plane.
  
          Raises
          ------
          ValueError
              If the input is not a PointCloud or Point in the same reference
              frame as the camera.