🌍 Global Registration |
📦 Object Pose Estimation |
🚗 LiDAR Odometry |
POLI turns sparse, messy LiDAR point clouds into rich geometric understanding — a single self-supervised network predicts a Gaussian ellipsoid per point, capturing local geometry on a statistical manifold. Plug it into any 3D perception pipeline — registration, object pose estimation, LiDAR odometry — and get instant accuracy gains. No labels. No architectural changes. Just better geometry.
Paper: arXiv
Accepted for publication in Robotics: Science and Systems (RSS) 2026.
@misc{lee2026learningpointcloudgeometry,
title = {Learning Point Cloud Geometry as a Statistical Manifold: Theory and Practice},
author = {Jinwoo Lee and Jiwoo Kim and Woojae Shin and Giseop Kim and Hyondong Oh},
year = {2026},
eprint = {2605.10456},
archivePrefix = {arXiv},
primaryClass = {cs.RO},
url = {https://arxiv.org/abs/2605.10456},
}Point clouds are a fundamental representation for robotic perception tasks such as localization, mapping, and object pose estimation. However, LiDAR-acquired point clouds are inherently sparse and non-uniform, providing incomplete observations of the underlying geometry. Such sparsity and non-uniformity hinder reliable geometric reasoning, leading to degraded performance in downstream perception tasks. To mitigate these issues, prior work has attempted to compensate for the sparsity and non-uniformity of point clouds by estimating point cloud geometry. However, in the absence of an explicit model of point cloud geometry, existing approaches have predominantly relied on either hand-crafted statistics of local point distributions or end-to-end supervised deep learning, which often suffer from limited scalability or require large amounts of accurately labeled training data. To address these challenges, we explicitly model and estimate point cloud geometry under a principled mathematical formulation. Theoretically, we represent the point cloud geometry as a statistical manifold induced by a family of Gaussian distributions that captures the local geometry of each point. Building on this formulation, we design a probabilistic model that predicts per-point local geometry in the form of a Gaussian distribution. Practically, we introduce a deep neural network to instantiate the estimation of these Gaussian distributions, and term the resulting estimator as Point-to-Ellipsoid (POLI). By consistently estimating point-wise local geometry across diverse point clouds, POLI learns a mapping between point cloud observations and their underlying geometry. Importantly, this mapping is learned in a self-supervised manner, removing the reliance on labeled data while maintaining strong geometric inductive biases. The resulting representation integrates seamlessly into existing robotic perception pipelines without requiring architectural modifications. Extensive experiments demonstrate that the proposed theory and practice enable accurate and robust estimation of point cloud geometry and consistently improve performance across a wide range of robotic perception tasks.
git clone https://github.com/jinwoolee1230/POLI.git
cd POLIconda env create -f environment.yml
conda activate poliFor Training
| Package | Repository |
|---|---|
pointnet2_ops |
Pointnet2_PyTorch/pointnet2_ops |
sdprlayer / sdprlayers |
utiasASRL/sdprlayer |
torch_kdtree |
thomgrand/torch_kdtree |
For Demo and Testing
| Package | Repository |
|---|---|
pointnet2_ops |
Pointnet2_PyTorch/pointnet2_ops |
ROBIN / spark_robin |
MIT-SPARK/ROBIN |
pyridescence |
koide3/iridescence |
torch_kdtree |
thomgrand/torch_kdtree |
| Sensor / Task | Available Checkpoints |
|---|---|
| VLP (Velodyne) | 0.2 m · 0.5 m · 1.0 m |
| OS2 (Ouster) | 1.0 m · 1.5 m · 2.0 m |
| Object Pose Estimation | object_500n1000points.pth |
Command
python applications/global_registration/POLI_FPFH_ROBIN_GNC.pyPipeline — POLI-Densification + FPFH + ROBIN + GNC-TLS
# 1. Load the pretrained POLI model
model = load_model(checkpoint)
# 2. Predict the underlying geometric structure of each point cloud
P, Q, C_p, C_q = predict_covariances(model, P, Q)
# 3. Densify point clouds by sampling from the learned distributions
P_dense = densify_points(P, C_p, samples_per_point=100, n_std=0.5)
Q_dense = densify_points(Q, C_q, samples_per_point=100, n_std=0.5)
# 4. Compute FPFH features on the densified point clouds
fpfh_p = compute_fpfh(P_dense)
fpfh_q = compute_fpfh(Q_dense)
# 5. Establish mutual feature correspondences
src_idx, tgt_idx = estimate_mutual_feature_matches(fpfh_p, fpfh_q)
# 6. Extract the maximum consensus set
src_inliers, tgt_inliers = maximum_consensus(P_dense[src_idx], Q_dense[tgt_idx])
# 7. Estimate the rigid transformation
R_est, t_est = registration(src_inliers, tgt_inliers)Command
python applications/object_pose_estimation/POLI_FPFH_ROBIN_GNC.pyPipeline — POLI-Normal + FPFH + ROBIN + GNC-TLS
# 1. Load the pretrained POLI model
model = load_model(checkpoint)
# 2. Predict the underlying geometric structure of each point cloud
P, Q, C_p, C_q = predict_covariances(model, P, Q)
# 3. Compute normals from predicted covariances
n_p = extract_normal(C_p)
n_q = extract_normal(C_q)
# 4. Compute FPFH features using the predicted normals
fpfh_p = compute_fpfh(P, n_p)
fpfh_q = compute_fpfh(Q, n_q)
# 5. Establish mutual feature correspondences
src_idx, tgt_idx = estimate_mutual_feature_matches(fpfh_p, fpfh_q)
# 6. Extract the maximum consensus set
src_inliers, tgt_inliers = maximum_consensus(P_dense[src_idx], Q_dense[tgt_idx])
# 7. Estimate the rigid transformation
R_est, t_est = registration(src_inliers, tgt_inliers)Command
python applications/lidar_odometry/POLI_GICP.py \
--checkpoint ./weights/HeLiPR/vlp_helipr_0.2m.pth \
--dataset_dir [/path/to/train_data] \
--output_folder ./tmp/poli_gicpPipeline — POLI-Covariance + Generalized-ICP
# 1. Load the pretrained POLI model
model = load_model(checkpoint)
# 2. Predict the underlying geometric structure of each point cloud
P, Q, C_p, C_q = predict_covariances(model, P, Q)
# 3. Run Generalized-ICP using the learned covariances
R, t = GICP(P, Q, C_p, C_q)Download the HeLiPR dataset from the official website.
Scene pairs must be generated from each HeLiPR sequence before training.
Required Inputs
| Argument | Description |
|---|---|
--lidar_scan |
Directory containing LiDAR scan files (.bin) from a single HeLiPR sequence |
--ground_truth |
Ground-truth trajectory file corresponding to the same sequence |
--output_folder |
Output directory where generated training data will be saved |
--voxel_size |
Voxel size in meters |
Note: This preprocessing step should be performed separately for each HeLiPR sequence.
python data_preprocess/scene/HeLiPR_make_dataset.py \
--lidar_scan [/path/to/helipr/lidar] \
--ground_truth [/path/to/helipr_gt.txt] \
--output_folder [/path/to/train_data] \
--voxel_size [voxel_size (meter)]Required Arguments
| Argument | Description |
|---|---|
--dataset_dir |
Dataset directory generated in the preprocessing step |
--logdir |
Directory where training logs and checkpoints will be saved |
--mean |
Mean value used for z-score normalization |
--scaling_factor |
Standard deviation for z-score normalization (default: 100.0) |
python train.py \
--dataset_dir [/path/to/train_data] \
--logdir [/path/to/logdir] \
--mean [MEAN] \
--scaling_factor [SCALING_FACTOR]|
Jinwoo Lee*1 |
Jiwoo Kim*1 |
Woojae Shin1 |
Giseop Kim2 |
Hyondong Oh1 |
1 Field AI and Robotics Laboratory (FAIR)

Korea Advanced Institute of Science and Technology (KAIST), Daejeon, Republic of Korea
2 Autonomy and Perceptual Robotics Lab (APRL)

Daegu Gyeongbuk Institute of Science and Technology (DGIST), Daegu, Republic of Korea
This project is released under the MIT License. See LICENSE for details.




