This repository provides a basic implementation of the non-rigid point cloud registration method described in [1]. For a detailed explanation of the method and its motivation, please refer to the original paper. In a nutshell, the method is able to find the set of rigid transformations that need to be applied to each line in the scan in order to match an existing model:
You can also watch the video that summarizes this work:
Thank you for citing the original publication [1] if you use our method in academic work:
@ARTICLE{9788023,
author={Castillón, Miguel and Ridao, Pere and Siegwart, Roland and Cadena, César},
journal={IEEE Robotics and Automation Letters},
title={Linewise Non-Rigid Point Cloud Registration},
year={2022},
volume={7},
number={3},
pages={7044-7051},
doi={10.1109/LRA.2022.3180038}}
If you want to know more about our underwater 3D scanner, check out the paper [2] and this blog post.
[1] M. Castillón, P. Ridao, R. Siegwart and C. Cadena, "Linewise Non-Rigid Point Cloud Registration," in IEEE Robotics and Automation Letters, doi: 10.1109/LRA.2022.3180038. [pdf]
[2] M. Castillón, J. Forest and P. Ridao, "Underwater 3D Scanner to Counteract Refraction: Calibration and Experimental Results," in IEEE/ASME Transactions on Mechatronics, doi: 10.1109/TMECH.2022.3170504. [pdf]
Our methods depends on CMake, Eigen, and Ceres. Please note that so far, it has only been tested on Ubuntu 20.04 + Eigen 3.3.7 + Ceres 2.0.
Moreover, our method uses Fast Gauss Transforms to compute the correspondence probability between each pair of points. Therefore, our method depends on fgt, which is a fork of this repository.
As usual, just download and unzip this repository in your preferred location and cd
into it.
Then:
mkdir build
cd build
cmake ..
make
sudo make install
If you want Debug messages to be printed for each iteration, compile using
cmake -DCMAKE_BUILD_TYPE=Debug ..
#include <lnrr/scan_to_model.h>
int main(int argc, char** argv) {
lnrr::Matrix fixed = loadModel();
lnrr::Matrix moving = loadScan();
lnrr::Vector line_sizes; // Vector containing the number of points in each line
double beta = ...;
double lambda = ...;
lnrr::ScanToModel lnrr(fixed, moving, beta, lambda, line_sizes);
lnrr::Result result = lnrr.run();
return 0;
}
And your CMakeLists.txt
should include:
find_package(OpenMP REQUIRED)
find_package(Ceres REQUIRED)
find_package(Fgt REQUIRED)
find_package(Lnrr REQUIRED)
add_library(my-new-library
my_program.cpp
)
target_link_libraries(my-new-library
PUBLIC
Lnrr::Library-C++
${CERES_LIBRARIES}
)
To run the code with the example model and scan in the folder data
, you can just run the test:
./test_lnrr data/stanford-bunny_dense_occluded.txt data/scan.txt data/scan_linesizes.txt data/scan_registered.txt 15 100 0.005
Converting between .pcd
and .txt
files is easy using PCL, but the code is not added here to limit the number of dependencies.
Please feel free to create issues and pull requests, they will be much appreciated.
Please be aware that this repository is only a simple implementation of the method and may therefore unfortunately not always show a robust behaviour. There is no documentation yet but we hope the code is self-explanatory.
This library is GPL2, copyright 2022 Miguel Castillón. See LICENSE.txt for the full license text.
In the creation of this library we have drawn inspiration from this cpd implementation by Gadomski.