code: def projection(self, p: Vector3) -> Vector3:
      dist = self.signed_distance(p)
      if len(dist.shape) != len(self.normal):
          # non batched plane project a batch of points
          dist = dist[..., None]  # Nx1
      # TODO: TypeError: bad operand type for unary -: 'Scalar'
      return p - dist.data * self.normal
  
imports: from typing import Optional
  from kornia.core import Module, Tensor, stack, where
  from kornia.core.check import KORNIA_CHECK, KORNIA_CHECK_SHAPE, KORNIA_CHECK_TYPE
  from kornia.core.tensor_wrapper import unwrap, wrap
  from kornia.geometry.linalg import batched_dot_product
  from kornia.geometry.vector import Scalar, Vector3
  from kornia.utils.helpers import _torch_svd_cast
label_desc: Use image node_id 8 for calling the Hyperplane obj's underlying member method code with example usage: obj.projection(p) and returns: unknown