how are the normals at each point in the point cloud calculated?
You can connect two points to form a line or three points to form a plane. I'd assume that if one has multiple planes intersecting at one point, one can get the normal at that point by adding the normals of all the planes intersecting at that point.
One comment here — seems like a lot of the research in computer vision/3D perception/robotics is moving in the direction of processing point clouds directly since they're the raw data representation returned by a real-world 3D sensor like a LiDAR sensor or RGB-D camera (e.g., many self-driving car companies, like Waymo, are doing deep learning directly on point clouds to identify people, other cars, etc.). The results here are actually super impressive given that point clouds are sparse "sampled" approximations of continuous surfaces. @prathikn and I actually wrote an article on deep learning in 3D (and particularly some state-of-the-art results on point cloud learning) if you're interested in learning more: https://thegradient.pub/beyond-the-pixel-plane-sensing-and-learning-in-3d