GROR:A New Outlier Removal Strategy Based on Reliability of Correspondence Graph for Fast Point Cloud Registration

Related tags

Miscellaneous GROR
Overview

GROR

GROR:A New Outlier Removal Strategy Based on Reliability of Correspondence Graph for Fast Point Cloud Registration

About

image

(a): correspondences generated by correspondence matching strategy (green and red lines represent the inlier and outlier correspondences according to the ground truth respectively). (b) remaining correspondences after using our Outlier Removal Strategy (c) registration result by GROR.

GROR can solve the 6-dof registration problem between two point clouds in 3D. It performs well (fast and robust) even if the input correspondences have an extremely large number of outliers. For more information, please refer to our papers:

A New Outlier Removal Strategy Based on Reliability of Correspondence Graph for Fast Point Cloud Registration image

Getting Started

Environment:

Our program is lightweight and can be included in any project that adds the PCL library. We've tested it on Windows (VS2015) and Ubuntu (vscode)

Dependencies:

Building GROR requires the following libraries installed

  1. A compiler that supports OpenMP.
  2. CMake >= 3.5
  3. PCL >= 1.8.1

Compilation

On Windows:

You can easily compile it using CMake.

On Ubuntu:

mkdir build
cd build
cmake ..
make
./ GrorReg "source path" "target path" resolution K(Such as "arch/s1.ply" "arch/s2.ply" 0.1 800)

Parameter configuration

  1. GROR needs to get the correspondences before running, we adopt the strategy of (downsampling) + (key point extraction) + (FPFH descriptor) + (correspondences matching). All parameters can be kept as default except for the key point extraction stage for Data Office and Railway where iss_non_max_radius_is set to 2 and 9 to get a better registration result.
  2. There are two parameters of GROR:downsampling resolution and K. Usually K is kept around 800. The resolution is generally set to 0.1m, but some adjustments need to be made according to the size of the scene and the larger the resolution setting, the faster the algorithm efficiency.

Data preparation

You can test on the online available point cloud data and registration dataset such as WHU TLS Registration Dataset, ETH PRS TLS Registration Dataset, ETH ASL Robotics Registration Dataset, 3D Match, Robotic 3D Scan Repository, etc.

You may apply the format transform tool to get the data ready for registration.

You might also like...
Point Cloud Library (PCL)
Point Cloud Library (PCL)

Point Cloud Library Website The new website is now online at https://pointclouds.org and is open to contributions 🛠️ . If you really need access to t

A kata to practice refactoring to the strategy pattern.

style commit{ color:orange; } heading{ color:firebrick; font-weight: bold; } /style Instructions Introduction This kata is designed to help you le

Login & Registration system using leveldb in C++
Login & Registration system using leveldb in C++

LoginAndRegistration 📚 Clone repo git clone https://github.com/dev-cetus/LoginAndRegistration.git cd LoginAndRegistration 💻 Install leveldb via vcp

REGISTRATION / LOGIN SYSTEM USING C++

REGISTRATION / LOGIN SYSTEM USING C++ Used File Handling / Manipulations / Storing extensively.

RemixDB: A read- and write-optimized concurrent KV store. Fast point and range queries. Extremely low write-amplification.

REMIX and RemixDB The REMIX data structure was introduced in paper "REMIX: Efficient Range Query for LSM-trees", FAST'21. This repository maintains a

Direct LiDAR Odometry: Fast Localization with Dense Point Clouds
Direct LiDAR Odometry: Fast Localization with Dense Point Clouds

Direct LiDAR Odometry: Fast Localization with Dense Point Clouds DLO is a lightweight and computationally-efficient frontend LiDAR odometry solution w

Blazingly fast multi-object tracker. Works on 1 (x, y) point per object.
Blazingly fast multi-object tracker. Works on 1 (x, y) point per object.

Norfair++ This is a C++ implementation of Techainer's Norfair, which originates from Norfair, a library for real-time 2D object tracking. Its function

The ultimate battery tester with ESR measurement and discharge graph. Based on an Arduino Nano and a 1602 LCD.
The ultimate battery tester with ESR measurement and discharge graph. Based on an Arduino Nano and a 1602 LCD.

Ultimate-Battery-Tester Version 1.0.0 Features Measures the ESR (equivalent series resistance) of the battery. This is an idicator of the health of th

C++ graph based event system

Breadboard {#breadboard_readme} Overview The Breadboard scripting library is a graph based scripting system designed with games in mind. Complex behva

Comments
  • some questions about calEdgeReliabilityInTCFS()

    some questions about calEdgeReliabilityInTCFS()

    Hello author, First of all, please forgive my nagging. I hope i won't make you feel bored.

    • IdM_1's rotation is identity, its translation is - rotation_element.rot_origin, calculated in rot_element.rot_origin = vec_first_t;, namely -P_j. IdM_2 is R_z. In paper, p_zk = Rz * p_k, q_k' = transform * q_k; q_zk = Rz * q_k'. There is no IdM_1 variable in the paper. Q1: What's the meaning of IdM_1?
    IdM_1.block<3, 1>(0, 3) = -1.0 * origin;
    IdM_2.block<3, 3>(0, 0) = twoVectorsAlign(axis, z_axis);
    
    
    Eigen::Matrix4f local_tm_t = IdM_2*IdM_1;
    Eigen::Matrix4f local_tm_s = local_tm_t*transform.matrix();
    
    
    pcl::transformPointCloud(*key_source_, *source_local, local_tm_s);
    pcl::transformPointCloud(*key_target_, *target_local, local_tm_t);
    
    • Q2: I do not totally understand the func vl_fast_atan2_f(), why not directly use atan2() to calculate the coordinate azimuth, is there something we need to consider?
    • Q3: The relationship of R(theta, epsilon_PQ_ij), R(theta, Z) and Rz is R(theta, epsilon_PQ_ij) = R(theta, Z) * Rz ?
    • Q4: Related to Q1, the final translation t's calculation seems is different from eq(18) of paper, also confused this.
    Eigen::Matrix4f IdM_1 = Eigen::Matrix4f::Identity();
    Eigen::Matrix4f IdM_2 = Eigen::Matrix4f::Identity();
    Eigen::Matrix4f IdM_3 = Eigen::Matrix4f::Identity();
    Eigen::Matrix3f rot = Eigen::AngleAxisf(best_angle, two_point_rot_ele.rot_axis).toRotationMatrix();
    IdM_1.block<3, 1>(0, 3) = -1.0*two_point_rot_ele.rot_origin;
    IdM_2.block<3, 3>(0, 0) = rot;
    IdM_3.block<3, 1>(0, 3) = two_point_rot_ele.rot_origin;
    Eigen::Matrix4f gr_tran_mat = IdM_3*IdM_2*IdM_1*two_point_tran_mat;
    
    • BTW, in code best_count_ = der_in_tcfs;, in paper pseudo code line20 of "Algorithm 1" is best_count_ = der_in_tcfs + 2; I don't understand why plus 2?

    Thanks for author's patience and time in advance sincerely!

    opened by narutojxl 0
  • pseudo code of calEdgeReliabilityInRCFS() not match code?

    pseudo code of calEdgeReliabilityInRCFS() not match code?

    Hello author, Firstly, thank you for sharing your excellent work to the community to let us study. There are many symbols in the paper, thank you for your meticulous and rigorous.

    • Q1: When calculating calEdgeReliabilityInRCFS(), we use V_Pk and V_Qk in code and the same with paper eq(11). But in the pseudo code line5 of "Algorithm 1: Maximum consensus set based on edge reliability", using transformed V_Qk, is it a typo in paper?
    	for (int j = 0; j < correspondences.size(); ++j)5 months ago • WeiPengCheng [outlier removal for point cloud registration]
    	{
    		auto& t_p = (*key_target_)[correspondences[j].index_match];
    		auto& s_p = (*key_source_)[correspondences[j].index_query];
    
    
    		diff_to_t[j] = t_p.getVector3fMap() - first_corr_t.getVector3fMap();
    		diff_to_s[j] = s_p.getVector3fMap() - first_corr_s.getVector3fMap();
    	}
    
    • Q2: in twoPairPointsAlign(), it seems the first pair is point j, the second pair is point i. epsilon_p_ij = pj - pi; When in calEdgeReliabilityInRCFS() we calculate epsilon_p_ik = pk - pi, epsilon_q_ik = qk - qi. Maybe use diff_to_t[j] = t_p.getVector3fMap() - second_corr_t.getVector3fMap(); and diff_to_s[j] = s_p.getVector3fMap() - second_corr_s.getVector3fMap(); more consitent with paper, although its work is the same with minus the first pair.
    Eigen::Vector3f vec_sour = (vec_first_s - vec_second_s).normalized();
    Eigen::Vector3f vec_tart = (vec_first_t - vec_second_t).normalized();
    
    opened by narutojxl 0
  • 3DOF case?

    3DOF case?

    Hi Pengcheng Wei, Thanks for your paper. I was wondering if your method could be adapted for a 3DOF version that only requires translation estimation? If not, can you recommend any of the other techniques you have tried that might be more accurate / efficient under the 3DOF case? ( I could not find your email address so I made an issue, feel free to close )

    opened by cclaan 0
  • registration failed

    registration failed

    Thanks for your sharing, I got uncorrect result when I test it with the following command. ./GrorReg "arch/s1.ply" "arch/s5.ply" 0.1 800

    the two clouds are not aligned as in your paper.

    could be related to parameter settings?

    opened by deliangye 2
Owner
Pengcheng Wei
Pengcheng Wei
Read contamination removal

read-it-and-keep Read contamination removal. Install Install either from source or build a singularity container. Compile from source Make the executa

GPAS 18 Oct 9, 2022
My version of psxfunkin with new changes like new story mode, new options,etc

PSXFunkin Friday Night Funkin' on the PSX LOL Compilation Refer to COMPILE.md here Characters Igor Ver added new characters Like XmasGF,Monster and mu

IgorSou3000 4 Jun 8, 2022
2D/3D Registration and system integration for image-based navigation of orthopedic robotic applications, inculding femoroplasty, osteonecrosis, etc.

Registration and System Integration Software for Orthopedic Surgical Robotic System This repository contains software programs for image-based registr

Cong Gao 15 Sep 3, 2022
By putting in a lot of speed, the speed sequence is sorted and divided, three types of speed interval distribution maps are generated.(including broken line graph,histogram and curve graph)

Auto-drawing-speed-range-map By putting in a lot of speed, the speed sequence is sorted and divided, three types of speed interval distribution maps a

wellwellAllwen 4 May 14, 2022
Cloud Native Data Plane (CNDP) is a collection of user space libraries to accelerate packet processing for cloud applications.

CNDP - Cloud Native Data Plane Overview Cloud Native Data Plane (CNDP) is a collection of userspace libraries for accelerating packet processing for c

Cloud Native Data Plane 35 Dec 28, 2022
This code converts a point cloud obtained by a Velodyne VLP16 3D-Lidar sensor into a depth image mono16.

pc2image This code converts a point cloud obtained by a Velodyne VLP16 3D-Lidar sensor into a depth image mono16. Requisites ROS Kinetic or Melodic Ve

Edison Velasco Sánchez 6 May 18, 2022
This repository uses a ROS node to subscribe to camera (hikvision) and lidar (livox) data. After the node merges the data, it publishes the colored point cloud and displays it in rviz.

fusion-lidar-camera-ROS 一、介绍 本仓库是一个ROS工作空间,其中ws_fusion_camera/src有一个工具包color_pc ws_fusion_camera │ README.md │ └───src │ └───package: c

hongyu wang 23 Dec 7, 2022
This project is used for lidar point cloud undistortion.

livox_cloud_undistortion This project is used for lidar point cloud undistortion. During the recording process, the lidar point cloud has naturally th

livox 74 Dec 20, 2022
BAAF-Net - Semantic Segmentation for Real Point Cloud Scenes via Bilateral Augmentation and Adaptive Fusion (CVPR 2021)

Semantic Segmentation for Real Point Cloud Scenes via Bilateral Augmentation and Adaptive Fusion (CVPR 2021) This repository is for BAAF-Net introduce

null 90 Dec 29, 2022
A simple localization framework that can re-localize in one point-cloud map.

Livox-Localization This repository implements a point-cloud map based localization framework. The odometry information is published with FAST-LIO. And

Siyuan Huang 94 Jan 2, 2023