code: def estimate_pointcloud_normals(
      pointclouds: Union[torch.Tensor, "Pointclouds"],
      neighborhood_size: int = 50,
      disambiguate_directions: bool = True,
      *,
      use_symeig_workaround: bool = True,
  ) -> torch.Tensor:
      """
      Estimates the normals of a batch of `pointclouds`.
  
      The function uses `estimate_pointcloud_local_coord_frames` to estimate
      the normals. Please refer to that function for more detailed information.
  
      Args:
        **pointclouds**: Batch of 3-dimensional points of shape
          `(minibatch, num_point, 3)` or a `Pointclouds` object.
        **neighborhood_size**: The size of the neighborhood used to estimate the
          geometry around each point.
        **disambiguate_directions**: If `True`, uses the algorithm from [1] to
          ensure sign consistency of the normals of neighboring points.
        **use_symeig_workaround**: If `True`, uses a custom eigenvalue
          calculation.
  
      Returns:
        **normals**: A tensor of normals for each input point
          of shape `(minibatch, num_point, 3)`.
          If `pointclouds` are of `Pointclouds` class, returns a padded tensor.
  
      References:
        [1] Tombari, Salti, Di Stefano: Unique Signatures of Histograms for
        Local Surface Description, ECCV 2010.
      """
  
      (
          curvatures,
          local_coord_frames,
      ) = estimate_pointcloud_local_coord_frames(
          pointclouds,
          neighborhood_size=neighborhood_size,
          disambiguate_directions=disambiguate_directions,
          use_symeig_workaround=use_symeig_workaround,
      )
  
      # the normals correspond to the first vector of each local coord frame
      normals = local_coord_frames[:, :, :, 0]
  
      return normals
  
imports: from typing import Tuple, TYPE_CHECKING, Union
  import torch
  from pytorch3d.common.workaround import symeig3x3
  from .utils import convert_pointclouds_to_tensor, get_point_covariances
label_desc: Use image node_id 1 for calling a global function with example usage: estimate_pointcloud_normals(pointclouds, neighborhood_size, disambiguate_directions) and returns: normals