Giter VIP home page Giter VIP logo

teaser-plusplus's Introduction

TEASER++: fast & certifiable 3D registration

License: MIT Documentation Status

TEASER++ 3DSmooth

TEASER++ is a fast and certifiably-robust point cloud registration library written in C++, with Python and MATLAB bindings.

About

Left: correspondences generated by 3DSmoothNet (green and red lines represent the inlier and outlier correspondences according to the ground truth respectively). Right: alignment estimated by TEASER++ (green dots represent inliers found by TEASER++).

TEASER++ can solve the rigid body transformation problem between two point clouds in 3D. It performs well even if the input correspondences have an extremely large number of outliers. For a short conceptual introduction, check out our video. For more information, please refer to our papers:

If you find this library helpful or use it in your projects, please cite:

@article{Yang20tro-teaser,
  title={{TEASER: Fast and Certifiable Point Cloud Registration}},
  author={H. Yang and J. Shi and L. Carlone},
  journal={{IEEE} Trans. Robotics},
  pdf={https://arxiv.org/pdf/2001.07715.pdf},
  Year = {2020} 
}

If you are interested in more works from us, please visit our lab page here.

TL;DR

Minimal C++ example

Run the following script to show a minimal C++ example:

sudo apt install cmake libeigen3-dev libboost-all-dev
git clone https://github.com/MIT-SPARK/TEASER-plusplus.git
cd TEASER-plusplus && mkdir build && cd build
cmake .. && make
sudo make install
sudo ldconfig
cd .. && cd examples/teaser_cpp_ply && mkdir build && cd build
cmake .. && make
./teaser_cpp_ply

You should see terminal output like this:

	Read 1889 total vertices 
*** [pmc heuristic: thread 1]   current max clique = 577,  time = 0.00163579 sec
...
*** [pmc: thread 2]   current max clique = 602,  time = 0.44515 sec
-----------------------------------------------------------------------
=====================================
          TEASER++ Results           
=====================================
Expected rotation: 
  0.996927  0.0668736 -0.0406664
 -0.066129   0.997618  0.0194009
 0.0418676 -0.0166518   0.998978
Estimated rotation: 
  0.996658  0.0729647  0.0367288
-0.0740469   0.996832  0.0290182
-0.0344951 -0.0316408   0.998904
Error (deg): 0.0783556

Expected translation: 
 -0.115577
-0.0387705
  0.114875
Estimated translation: 
 -0.116132
-0.0390858
   0.11729
Error (m): 0.00249818

Number of correspondences: 1889
Number of outliers: 1700
Time taken (s): 0.786677

Minimal C++ example for MacOS with brew:

Run the following script to show a minimal C++ example:

brew install cmake
brew install boost
brew install eigen
git clone https://github.com/MIT-SPARK/TEASER-plusplus.git
cd TEASER-plusplus && mkdir build && cd build
cmake .. && make
sudo make install
cd .. && cd examples/teaser_cpp_ply && mkdir build && cd build
cmake .. && make
./teaser_cpp_ply

Minimal Python 3 example

Run the following script to show a minimal Python 3 example (needs Anaconda installed):

sudo apt install cmake libeigen3-dev libboost-all-dev
conda create -n teaser_test python=3.6 numpy
conda activate teaser_test
conda install -c open3d-admin open3d=0.9.0.0
git clone https://github.com/MIT-SPARK/TEASER-plusplus.git
cd TEASER-plusplus && mkdir build && cd build
cmake -DTEASERPP_PYTHON_VERSION=3.6 .. && make teaserpp_python
cd python && pip install .
cd ../.. && cd examples/teaser_python_ply 
python teaser_python_ply.py

You should see output similar to this:

==================================================
        TEASER++ Python registration example      
==================================================
*** [pmc heuristic: thread 1]   current max clique = 563,  time = 0.00185895 sec
...
*** [pmc: thread 2]   current max clique = 605,  time = 0.618481 sec
-----------------------------------------------------------------------
=====================================
          TEASER++ Results           
=====================================
Expected rotation: 
[[ 0.99692656  0.06687358 -0.04066644]
 [-0.06612899  0.99761788  0.01940087]
 [ 0.04186755 -0.01665178  0.99897777]]
Estimated rotation: 
[[ 9.96883589e-01  7.88648224e-02 -1.85738207e-03]
 [-7.88858464e-02  9.96487579e-01 -2.80985536e-02]
 [-3.65129272e-04  2.81575081e-02  9.99603432e-01]]
Error (deg): 
0.06284342361637997
Expected translation: 
[-0.11557694 -0.03877054  0.11487489]
Estimated translation: 
[-0.11652176 -0.0373522   0.111885  ]
Error (m): 
0.0034414811018018978
Number of correspondences:  1889
Number of outliers:  1700
Time taken (s):  0.9492652416229248

Reproduce the GIF Above

Run the following script:

sudo apt install cmake libeigen3-dev libboost-all-dev
conda create -n teaser_3dsmooth python=3.6 numpy
conda activate teaser_3dsmooth
conda install -c open3d-admin open3d=0.9.0.0
conda install scikit-learn 
git clone https://github.com/MIT-SPARK/TEASER-plusplus.git
cd TEASER-plusplus && mkdir build && cd build
cmake -DTEASERPP_PYTHON_VERSION=3.6 .. && make teaserpp_python
cd python && pip install .
cd ../.. && cd examples/teaser_python_3dsmooth
python teaser_python_3dsmooth.py

You should be able to see Open3D windows showing registration results:

TEASER++ 3DSmooth

Getting Started

Other Publications

Other publications related to TEASER include:

  • H. Yang and L. Carlone, “A quaternion-based certifiably optimal solution to the Wahba problem with outliers,” in Proceedings of the IEEE International Conference on Computer Vision (ICCV), 2019, pp. 1665–1674. (pdf)
  • H. Yang, P. Antonante, V. Tzoumas, and L. Carlone, “Graduated Non-Convexity for Robust Spatial Perception: From Non-Minimal Solvers to Global Outlier Rejection,” IEEE Robotics and Automation Letters (RA-L), 2020. (pdf)

Acknowledgements

This work was partially funded by ARL DCIST CRA W911NF-17-2-0181, ONR RAIDER N00014-18-1-2828, Lincoln Laboratory “Resilient Perception in Degraded Environments”, and the Google Daydream Research Program.

teaser-plusplus's People

Contributors

aman190202 avatar clemgaut avatar fdila avatar jingnanshi avatar limhyungtae avatar nathanhhughes avatar plusk01 avatar stephlin avatar thitchcox avatar victor-amblard avatar williamkrobert avatar zyuanbing avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

teaser-plusplus's Issues

Error teaser_cpp_fpfh

Have you read the documentation?

  • [x ] Yes
  • [] No - then this issue will be closed.

Good morning,
I have the following problem when I try to start the example Teaser_cpp_fpfh example:
CMake Error at CMakeLists.txt:12 (add_executable):
Target "teaser_cpp_fpfh" links to target "teaserpp::teaser_features" but
the target was not found. Perhaps a find_package() call is missing for an
IMPORTED target, or an ALIAS target is missing?
so the make command fails and I see nothing.
What Could I do?
Thank you in advance

performance about velodyne sparse point cloud

Hi @jingnanshi, thanks for your sharing to the community!
I found the example data is dense point cloud something to scene reconstruction. Could this project suit for velodyne-16 sparse point cloud to registration, where collected from the outdoor unstructured environment?
Thanks for your help and time !

Feeding TEASER-plusplus correspondences

Hi, when I was reading your paper I found out that correspondences can be fed to TEASER. Is there a way to do it in python? I haven't found any parameters in RobustRegistrationSolver or RobustRegistrationSolver.Params that would indicate the way to do it and I haven't found it in examples.

Thank you.

Documentation

I can't find the docs on the cmake build folder. Someone could help me?
I used the steps from the README.md

Thanks.

CPP Example, using CMake Compilation

I've started with the code (using the snippet from README.md) but in the compilation, find an error.

CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
set (CMAKE_CXX_STANDARD 11)

project(teaserpp_cpp_example)

find_package(teaserpp REQUIRED)
find_package(Eigen3 REQUIRED)

include_directories(
${EIGEN3_INCLUDE_DIR}
${teaserpp_INCLUDE_DIR}
)

add_executable(cpp_example cpp_example.cpp)
target_link_libraries(cpp_example ${EIGEN3_LIBS} ${teaserpp_LIBS})

cpp_example.cpp
#include <iostream>
#include <cstring>
#include <Eigen/Core>
#include <teaser/registration.h>

int main(int argc, char ** argv) { if(argc < 3) { std::cout << "Incorrect Use." << std::endl; std::cout << "./cpp_example " << std::endl; return -1; }
// Total of points int N = std::stoi(argv[1]);
// Total of outliers int O = std::stoi(argv[2]);
Eigen::Matrix src(3, N); Eigen::Matrix dst(3, N + O);
// Configure your groundtruth transformation double scale = 1.5;
Eigen::Matrix3d rotation; rotation << 0.98370992, 0.17903344, -0.01618098, -0.04165862, 0.13947877, -0.98934839, -0.17486954, 0.9739059, 0.14466493;

Eigen::Vector3d translation(-1, 0, 1);


// Populate src & dst with your correspondences ...
for(int i = 0; i < N; i++) {
Eigen::Vector3d v = Eigen::Vector3d::Random();


src.col(i) = v;
dst.col(i) = scale * (rotation * v) + translation;
}


// Create your outliers
for(int i = 0; i < O; i++) {
dst.col(N + i) = Eigen::Vector3d::Random();
}


// Populate solver parameters
teaser::RobustRegistrationSolver::Params params;
params.cbar2 = 1;
params.noise_bound = 0.01;
params.estimate_scaling = false;
params.rotation_estimation_algorithm =
teaser::RobustRegistrationSolver::ROTATION_ESTIMATION_ALGORITHM::GNC_TLS;
params.rotation_gnc_factor = 1.4;
params.rotation_max_iterations = 100;
params.rotation_cost_threshold = 1e-6;


// Initialize solver
teaser::RobustRegistrationSolver solver(params);


// Solve
solver.solve(src, dst);


// Get solution
auto solution = solver.getSolution();


return 0;


}

Error:

Scanning dependencies of target cpp_example
[ 50%] Building CXX object CMakeFiles/cpp_example.dir/cpp_example.cpp.o
In file included from /tmp/TEASER-plusplus/cpp/cpp_example.cpp:4:0:
/usr/local/include/teaser/registration.h: In member function ‘void teaser::RobustRegistrationSolver::reset(const teaser::RobustRegistrationSolver::Params&)’:
/usr/local/include/teaser/registration.h:666:11: error: ‘make_unique’ is not a member of ‘std’
           std::make_unique<teaser::TLSScaleSolver>(params_.noise_bound, params_.cbar2));
           ^
/usr/local/include/teaser/registration.h:666:50: error: expected primary-expression before ‘>’ token
           std::make_unique<teaser::TLSScaleSolver>(params_.noise_bound, params_.cbar2));
                                                  ^
/usr/local/include/teaser/registration.h:669:11: error: ‘make_unique’ is not a member of ‘std’
           std::make_unique<teaser::ScaleInliersSelector>(params_.noise_bound, params_.cbar2));
           ^
/usr/local/include/teaser/registration.h:669:56: error: expected primary-expression before ‘>’ token
           std::make_unique<teaser::ScaleInliersSelector>(params_.noise_bound, params_.cbar2));
                                                        ^
/usr/local/include/teaser/registration.h:678:28: error: ‘make_unique’ is not a member of ‘std’
       setRotationEstimator(std::make_unique<teaser::GNCTLSRotationSolver>(rotation_params));
                            ^
/usr/local/include/teaser/registration.h:678:73: error: expected primary-expression before ‘>’ token
       setRotationEstimator(std::make_unique<teaser::GNCTLSRotationSolver>(rotation_params));
                                                                         ^
/usr/local/include/teaser/registration.h:682:28: error: ‘make_unique’ is not a member of ‘std’
       setRotationEstimator(std::make_unique<teaser::FastGlobalRegistrationSolver>(rotation_params));
                            ^
/usr/local/include/teaser/registration.h:682:81: error: expected primary-expression before ‘>’ token
       setRotationEstimator(std::make_unique<teaser::FastGlobalRegistrationSolver>(rotation_params));
                                                                                 ^
/usr/local/include/teaser/registration.h:689:9: error: ‘make_unique’ is not a member of ‘std’
         std::make_unique<teaser::TLSTranslationSolver>(params_.noise_bound, params_.cbar2));
         ^
/usr/local/include/teaser/registration.h:689:54: error: expected primary-expression before ‘>’ token
         std::make_unique<teaser::TLSTranslationSolver>(params_.noise_bound, params_.cbar2));
                                                      ^
CMakeFiles/cpp_example.dir/build.make:62: recipe for target 'CMakeFiles/cpp_example.dir/cpp_example.cpp.o' failed
make[3]: *** [CMakeFiles/cpp_example.dir/cpp_example.cpp.o] Error 1
CMakeFiles/Makefile2:75: recipe for target 'CMakeFiles/cpp_example.dir/all' failed
make[2]: *** [CMakeFiles/cpp_example.dir/all] Error 2
CMakeFiles/Makefile2:87: recipe for target 'CMakeFiles/cpp_example.dir/rule' failed
make[1]: *** [CMakeFiles/cpp_example.dir/rule] Error 2
Makefile:118: recipe for target 'cpp_example' failed
make: *** [cpp_example] Error 2

Cannot reproduce numbers on the 3DMatch test set.

Hi Hank,

I am trying to evaluate TEASER on 3DMatch, but I could not get numbers even close to 99% on 3DMatch test set. In fact, the numbers that I got is around 40%. For some challenging pairs, TEASER took almost 1000sec.

Could you post your 3DMatch pipeline?

[QUESTION] error: ‘eigen_assert_exception’ is not a member of ‘Eigen’

Have you read the documentation?

  • Yes
  • [] No - then this issue will be closed.

Post your theoretical questions / usage questions here.
I follow the install pipeline,

sudo apt install cmake libeigen3-dev libboost-all-dev
cd TEASER-plusplus && mkdir build && cd build
cmake -DTEASERPP_PYTHON_VERSION=3.6 .. && make teaserpp_python

but get following Error

[ 60%] Built target pmc
[ 66%] Building CXX object teaser/CMakeFiles/teaser_registration.dir/src/certification.cc.o
In file included from /usr/local/include/eigen3/Eigen/Core:88,

In file included from /usr/local/include/eigen3/Eigen/Core:88,
                 from /home/cybercore/Workspaces/chuong/TEASER-plusplus/build/spectra-src/include/Spectra/SymEigsSolver.h:10,
                 from /home/cybercore/Workspaces/chuong/TEASER-plusplus/teaser/src/certification.cc:15:
/usr/local/include/eigen3/Eigen/src/Core/products/Parallelizer.h: In function ‘void Eigen::internal::parallelize_gemm(const Functor&, Index, Index, Index, bool)’:
/usr/local/include/eigen3/Eigen/src/Core/products/Parallelizer.h:162:19: error: ‘eigen_assert_exception’ is not a member of ‘Eigen’
   if (errorCount) EIGEN_THROW_X(Eigen::eigen_assert_exception());
                   ^~~~~~~~~~~~~
make[3]: *** [teaser/CMakeFiles/teaser_registration.dir/build.make:63: teaser/CMakeFiles/teaser_registration.dir/src/certification.cc.o] Error 1
make[2]: *** [CMakeFiles/Makefile2:564: teaser/CMakeFiles/teaser_registration.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:713: python/CMakeFiles/teaserpp_python.dir/rule] Error 2
make: *** [Makefile:344: teaserpp_python] Error 2

My System config:

  • Ubuntu18.4
  • Cuda 10.2
    Thank you for your help.

teaser_cpp_ply core dumped

I'm trying to run ./teaser_cpp_ply on Ubuntu 16.04 and I got this output:

`eva-isr@evaisr-Z390-AORUS-ULTRA:~/TEASER-plusplus/examples/teaser_cpp_ply/build$ ./teaser_cpp_ply
	Read 1889 total vertices 
*** [pmc heuristic: thread 1]   current max clique = 505,  time = 0.00122905 sec
*** [pmc heuristic: thread 1]   current max clique = 517,  time = 0.00192809 sec
*** [pmc heuristic: thread 7]   current max clique = 519,  time = 0.0488579 sec
*** [pmc heuristic: thread 9]   current max clique = 520,  time = 0.0491951 sec
*** [pmc heuristic: thread 15]   current max clique = 523,  time = 0.05603 sec
[pmc heuristic]	 mc = 523
Created adjacency matrix in 0.00097394 seconds
[pmc: initial k-core pruning]  before pruning: |V| = 1889, |E| = 332188
[pmc: initial k-core pruning]  after pruning:  |V| = 1889, |E| = 284750
[pmc]  initial pruning took 0.00188708 sec
[pmc: sorting neighbors]  |E| = 569500, |E_sorted| = 569500
|V| = 760
*** [pmc: thread 16]   current max clique = 525,  time = 0.0975699 sec
>>> [pmc: thread 13]
[pmc: bounds updated - thread 13]  time = 0.102387 sec, |V| = 1885 (4 / 1889), |E| = 284750, w = 525, p = 0.159683, d_min = 0, d_avg = 351.708, d_max = 759, k_max = 694
*** [pmc: thread 2]   current max clique = 532,  time = 0.103024 sec
[pmc: bounds updated - thread 16]  time = 0.105693 sec, |V| = 1887 (2 / 1889), |E| = 284750, w = 532, p = 0.159683, d_min = 0, d_avg = 351.708, d_max = 759, k_max = 694
*** [pmc: thread 14]   current max clique = 539,  time = 0.106291 sec
*** [pmc: thread 1]   current max clique = 540,  time = 0.110872 sec
*** [pmc: thread 8]   current max clique = 542,  time = 0.111829 sec
*** [pmc: thread 10]   current max clique = 545,  time = 0.111934 sec
[pmc: bounds updated - thread 14]  time = 0.113517 sec, |V| = 1882 (7 / 1889), |E| = 284750, w = 545, p = 0.159683, d_min = 0, d_avg = 351.708, d_max = 759, k_max = 694
[pmc: bounds updated - thread 15]  time = 0.114689 sec, |V| = 1880 (9 / 1889), |E| = 284750, w = 545, p = 0.159683, d_min = 0, d_avg = 351.708, d_max = 759, k_max = 694
*** [pmc: thread 10]   current max clique = 546,  time = 0.195726 sec
*** [pmc: thread 4]   current max clique = 548,  time = 0.217088 sec
*** [pmc: thread 12]   current max clique = 549,  time = 0.217261 sec
*** [pmc: thread 6]   current max clique = 551,  time = 0.218583 sec
*** [pmc: thread 5]   current max clique = 552,  time = 0.302685 sec
-----------------------------------------------------------------------
*** Error in `./teaser_cpp_ply': free(): invalid next size (fast): 0x000000000187a220 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fa0af4147e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fa0af41d37a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fa0af42153c]
/usr/local/lib/libpmc.so(_ZN3pmc14pmcx_maxclique12search_denseERNS_9pmc_graphERSt6vectorIiSaIiEE+0xec1)[0x7fa0af182d61]
/usr/local/lib/libteaser_registration.so(_ZN6teaser15MaxCliqueSolver13findMaxCliqueENS_5GraphE+0xf11)[0x7fa0b02890d1]
/usr/local/lib/libteaser_registration.so(_ZN6teaser24RobustRegistrationSolver5solveERKN5Eigen6MatrixIdLi3ELin1ELi0ELi3ELin1EEES5_+0x59a)[0x7fa0b027f06a]
./teaser_cpp_ply[0x4026cf]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fa0af3bd830]
./teaser_cpp_ply[0x401b19]
======= Memory map: ========
00400000-00428000 r-xp 00000000 103:05 4465302                           /home/eva-isr/TEASER-plusplus/examples/teaser_cpp_ply/build/teaser_cpp_ply
00627000-00628000 r--p 00027000 103:05 4465302                           /home/eva-isr/TEASER-plusplus/examples/teaser_cpp_ply/build/teaser_cpp_ply
00628000-00629000 rw-p 00028000 103:05 4465302                           /home/eva-isr/TEASER-plusplus/examples/teaser_cpp_ply/build/teaser_cpp_ply
01215000-0287f000 rw-p 00000000 00:00 0                                  [heap]
7fa02c000000-7fa02c58e000 rw-p 00000000 00:00 0 
7fa02c58e000-7fa030000000 ---p 00000000 00:00 0 
7fa030000000-7fa030021000 rw-p 00000000 00:00 0 
7fa030021000-7fa034000000 ---p 00000000 00:00 0 
7fa034000000-7fa03431f000 rw-p 00000000 00:00 0 
7fa03431f000-7fa038000000 ---p 00000000 00:00 0 
7fa03c000000-7fa03c372000 rw-p 00000000 00:00 0 
7fa03c372000-7fa040000000 ---p 00000000 00:00 0 
7fa044000000-7fa04436a000 rw-p 00000000 00:00 0 
7fa04436a000-7fa048000000 ---p 00000000 00:00 0 
7fa04c000000-7fa04c36f000 rw-p 00000000 00:00 0 
7fa04c36f000-7fa050000000 ---p 00000000 00:00 0 
7fa054000000-7fa05447b000 rw-p 00000000 00:00 0 
7fa05447b000-7fa058000000 ---p 00000000 00:00 0 
7fa05c000000-7fa05c36a000 rw-p 00000000 00:00 0 
7fa05c36a000-7fa060000000 ---p 00000000 00:00 0 
7fa064000000-7fa06435e000 rw-p 00000000 00:00 0 
7fa06435e000-7fa068000000 ---p 00000000 00:00 0 
7fa06c000000-7fa06c35c000 rw-p 00000000 00:00 0 
7fa06c35c000-7fa070000000 ---p 00000000 00:00 0 
7fa074000000-7fa07435b000 rw-p 00000000 00:00 0 
7fa07435b000-7fa078000000 ---p 00000000 00:00 0 
7fa07c000000-7fa07c540000 rw-p 00000000 00:00 0 
7fa07c540000-7fa080000000 ---p 00000000 00:00 0 
7fa084000000-7fa08436e000 rw-p 00000000 00:00 0 
7fa08436e000-7fa088000000 ---p 00000000 00:00 0 
7fa08c000000-7fa08c372000 rw-p 00000000 00:00 0 
7fa08c372000-7fa090000000 ---p 00000000 00:00 0 
7fa094000000-7fa09434a000 rw-p 00000000 00:00 0 
7fa09434a000-7fa098000000 ---p 00000000 00:00 0 
7fa09c000000-7fa09c57e000 rw-p 00000000 00:00 0 
7fa09c57e000-7fa0a0000000 ---p 00000000 00:00 0 
7fa0a0418000-7fa0a3a84000 rw-p 00000000 00:00 0 
7fa0a3a84000-7fa0a3a85000 ---p 00000000 00:00 0 
7fa0a3a85000-7fa0a4285000 rw-p 00000000 00:00 0 
7fa0a4285000-7fa0a4286000 ---p 00000000 00:00 0 
7fa0a4286000-7fa0a4a86000 rw-p 00000000 00:00 0 
7fa0a4a86000-7fa0a4a87000 ---p 00000000 00:00 0 
7fa0a4a87000-7fa0a5287000 rw-p 00000000 00:00 0 
7fa0a5287000-7fa0a5288000 ---p 00000000 00:00 0 
7fa0a5288000-7fa0a5a88000 rw-p 00000000 00:00 0 
7fa0a5a88000-7fa0a5a89000 ---p 00000000 00:00 0 
7fa0a5a89000-7fa0a6289000 rw-p 00000000 00:00 0 
7fa0a6289000-7fa0a628a000 ---p 00000000 00:00 0 
7fa0a628a000-7fa0a6a8a000 rw-p 00000000 00:00 0 
7fa0a6a8a000-7fa0a6a8b000 ---p 00000000 00:00 0 
7fa0a6a8b000-7fa0a728b000 rw-p 00000000 00:00 0 
7fa0a728b000-7fa0a728c000 ---p 00000000 00:00 0 
7fa0a728c000-7fa0a7a8c000 rw-p 00000000 00:00 0 
7fa0a7a8c000-7fa0a7a8d000 ---p 00000000 00:00 0 
7fa0a7a8d000-7fa0a828d000 rw-p 00000000 00:00 0 
7fa0a828d000-7fa0a828e000 ---p 00000000 00:00 0 
7fa0a828e000-7fa0a8a8e000 rw-p 00000000 00:00 0 
7fa0a8a8e000-7fa0a8a8f000 ---p 00000000 00:00 0 
7fa0a8a8f000-7fa0a928f000 rw-p 00000000 00:00 0 
7fa0a928f000-7fa0a9290000 ---p 00000000 00:00 0 
7fa0a9290000-7fa0a9a90000 rw-p 00000000 00:00 0 
7fa0a9a90000-7fa0a9a91000 ---p 00000000 00:00 0 
7fa0a9a91000-7fa0aa291000 rw-p 00000000 00:00 0 
7fa0aa291000-7fa0aa292000 ---p 00000000 00:00 0 
7fa0aa292000-7fa0aaa92000 rw-p 00000000 00:00 0 
7fa0aaa92000-7fa0aaa93000 ---p 00000000 00:00 0 
7fa0aaa93000-7fa0ae8ff000 rw-p 00000000 00:00 0 
7fa0ae8ff000-7fa0ae902000 r-xp 00000000 103:04 1575103                   /lib/x86_64-linux-gnu/libdl-2.23.so
7fa0ae902000-7fa0aeb01000 ---p 00003000 103:04 1575103                   /lib/x86_64-linux-gnu/libdl-2.23.so
7fa0aeb01000-7fa0aeb02000 r--p 00002000 103:04 1575103                   /lib/x86_64-linux-gnu/libdl-2.23.so
7fa0aeb02000-7fa0aeb03000 rw-p 00003000 103:04 1575103                   /lib/x86_64-linux-gnu/libdl-2.23.so
7fa0aeb03000-7fa0aeb1b000 r-xp 00000000 103:04 1575225                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7fa0aeb1b000-7fa0aed1a000 ---p 00018000 103:04 1575225                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7fa0aed1a000-7fa0aed1b000 r--p 00017000 103:04 1575225                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7fa0aed1b000-7fa0aed1c000 rw-p 00018000 103:04 1575225                   /lib/x86_64-linux-gnu/libpthread-2.23.so
7fa0aed1c000-7fa0aed20000 rw-p 00000000 00:00 0 
7fa0aed20000-7fa0aed37000 r-xp 00000000 103:04 197590                    /usr/local/lib/libtinyply.so
7fa0aed37000-7fa0aef37000 ---p 00017000 103:04 197590                    /usr/local/lib/libtinyply.so
7fa0aef37000-7fa0aef38000 r--p 00017000 103:04 197590                    /usr/local/lib/libtinyply.so
7fa0aef38000-7fa0aef39000 rw-p 00018000 103:04 197590                    /usr/local/lib/libtinyply.so
7fa0aef39000-7fa0aef6f000 r-xp 00000000 103:04 131330                    /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0
7fa0aef6f000-7fa0af16e000 ---p 00036000 103:04 131330                    /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0
7fa0af16e000-7fa0af16f000 r--p 00035000 103:04 131330                    /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0
7fa0af16f000-7fa0af170000 rw-p 00036000 103:04 131330                    /usr/lib/x86_64-linux-gnu/libgomp.so.1.0.0
7fa0af170000-7fa0af19c000 r-xp 00000000 103:04 197589                    /usr/local/lib/libpmc.so
7fa0af19c000-7fa0af39b000 ---p 0002c000 103:04 197589                    /usr/local/lib/libpmc.so
7fa0af39b000-7fa0af39c000 r--p 0002b000 103:04 197589                    /usr/local/lib/libpmc.so
7fa0af39c000-7fa0af39d000 rw-p 0002c000 103:04 197589                    /usr/local/lib/libpmc.so
7fa0af39d000-7fa0af55d000 r-xp 00000000 103:04 1575079                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa0af55d000-7fa0af75d000 ---p 001c0000 103:04 1575079                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa0af75d000-7fa0af761000 r--p 001c0000 103:04 1575079                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa0af761000-7fa0af763000 rw-p 001c4000 103:04 1575079                   /lib/x86_64-linux-gnu/libc-2.23.so
7fa0af763000-7fa0af767000 rw-p 00000000 00:00 0 
7fa0af767000-7fa0af77e000 r-xp 00000000 103:04 1575076                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa0af77e000-7fa0af97d000 ---p 00017000 103:04 1575076                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa0af97d000-7fa0af97e000 r--p 00016000 103:04 1575076                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa0af97e000-7fa0af97f000 rw-p 00017000 103:04 1575076                   /lib/x86_64-linux-gnu/libgcc_s.so.1
7fa0af97f000-7fa0afa87000 r-xp 00000000 103:04 1575149                   /lib/x86_64-linux-gnu/libm-2.23.so
7fa0afa87000-7fa0afc86000 ---p 00108000 103:04 1575149                   /lib/x86_64-linux-gnu/libm-2.23.so
7fa0afc86000-7fa0afc87000 r--p 00107000 103:04 1575149                   /lib/x86_64-linux-gnu/libm-2.23.so
7fa0afc87000-7fa0afc88000 rw-p 00108000 103:04 1575149                   /lib/x86_64-linux-gnu/libm-2.23.so
7fa0afc88000-7fa0afe5b000 r-xp 00000000 103:04 130844                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
7fa0afe5b000-7fa0b005a000 ---p 001d3000 103:04 130844                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
7fa0b005a000-7fa0b0065000 r--p 001d2000 103:04 130844                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
7fa0b0065000-7fa0b0068000 rw-p 001dd000 103:04 130844                    /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28
7fa0b0068000-7fa0b006b000 rw-p 00000000 00:00 0 
7fa0b006b000-7fa0b0071000 r-xp 00000000 103:04 197592                    /usr/local/lib/libteaser_io.so
7fa0b0071000-7fa0b0270000 ---p 00006000 103:04 197592                    /usr/local/lib/libteaser_io.so
7fa0b0270000-7fa0b0271000 r--p 00005000 103:04 197592                    /usr/local/lib/libteaser_io.so
7fa0b0271000-7fa0b0272000 rw-p 00006000 103:04 197592                    /usr/local/lib/libteaser_io.so
7fa0b0272000-7fa0b028c000 r-xp 00000000 103:04 197593                    /usr/local/lib/libteaser_registration.so
7fa0b028c000-7fa0b048b000 ---p 0001a000 103:04 197593                    /usr/local/lib/libteaser_registration.so
7fa0b048b000-7fa0b048c000 r--p 00019000 103:04 197593                    /usr/local/lib/libteaser_registration.so
7fa0b048c000-7fa0b048d000 rw-p 0001a000 103:04 197593                    /usr/local/lib/libteaser_registration.so
7fa0b048d000-7fa0b04b3000 r-xp 00000000 103:04 1575051                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa0b04b5000-7fa0b0671000 rw-p 00000000 00:00 0 
7fa0b06b0000-7fa0b06b2000 rw-p 00000000 00:00 0 
7fa0b06b2000-7fa0b06b3000 r--p 00025000 103:04 1575051                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa0b06b3000-7fa0b06b4000 rw-p 00026000 103:04 1575051                   /lib/x86_64-linux-gnu/ld-2.23.so
7fa0b06b4000-7fa0b06b5000 rw-p 00000000 00:00 0 
7ffec6b39000-7ffec6b5f000 rw-p 00000000 00:00 0                          [stack]
7ffec6b65000-7ffec6b68000 r--p 00000000 00:00 0                          [vvar]
7ffec6b68000-7ffec6b6a000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
Aborted (core dumped)`

Incorrect rotation error calculation

The function bench_utils.get_angular_error(R_gt, R_est) in the teaser_python_3dsmooth example doesn't compute the rotation error correctly. For example, if R_gt and R_est equal to:

[[ 0.47754719 -0.031702 -0.14449853]
[ 0.144925 0.00224509 0.47846407]
[-0.02969151 -0.49892495 0.01133455]]

the function returns 97.18351924664557, when it should be 0, because it is an angle between a rotation matrix and the same rotation matrix. I don't understand why it happens, because the implementation seems to be correct.

Data maximum size

Hi,

First of all, many thanks for the work that was done on this, and the quality of code/documentation/example is impressive.

We are evaluating it to see if it fits our needs.
We are trying it to register two Kinect dataset.

Sadly, we did not have a single successful registration so far.

One problem we have is the size of the data that can be handled, it fails (i.e. bad alloc) if N above (around) 30K points.
Did you encounter this issue?
What is the maximum size you tried?
On theory, it seems like it could handle big N, in practice no, I could explore why if needed, I think it is related to one of eigen operations.

Also the amount of memory usage, on registering two dataset with N=30K, it uses around 50Gb of ram memory, is this normal?

Again many thanks for the work and sharing!
Etienne

Not going really well with the partial view Pointcloud

I am not sure if i got the whole concept wrong, but is this method supposed to work on partial-view pointclouds? The results were not very good when i tried to register a single-view cloud from kinect to it's original 360 degree scanned pointcloud.
Then instead of this kinect cloud, i also tried cropping the original cloud before transformation, to preserve different levels of the full cloud. I tried from 50-90%. After around 95%, the estimated pose starts getting considerably good and near perfect when i crop nothing out of the cloud.
This made me wonder if i am using the methods in a wrong way.

I also tried inverse-registering, swapping the src <-> destination clouds, so i could register full - partial instead of partial - full cloud, but that always ends up in segmentation fault. I guess, the code needs the no. of points in src cloud to be either equal to or more than the destination cloud, but fails if there's less.

It's probably a really amateur question. But it would be really helpful if you could give an insight as to what i might be doing wrong.

SIGABRT During rotation solver

I'd like to report an issue I am having on user-supplied pointclouds.
While estimating the rotation TEASER randomly stops after a failed internal check for Eigen.
The issue usually happens while trying to match non-matching clouds, therefore purely wrong keypoint correspondences.
Using Eigen 3.3.2

(might also be related to #54 ?)

Relevant code:

 teaser::RobustRegistrationSolver::Params params;
 params.noise_bound = 0.05;
 params.cbar2 = 1;
 params.estimate_scaling = false;
 params.rotation_max_iterations = 100;
 params.rotation_gnc_factor = 1.4;
 params.rotation_estimation_algorithm =
	 teaser::RobustRegistrationSolver::ROTATION_ESTIMATION_ALGORITHM::GNC_TLS;

 // Solve with TEASER++
 teaser::RobustRegistrationSolver solver(params);
 solver.solve(cloud1, cloud0, correspondences);

Terminal output:

Starting scale solver.
Scale estimation complete.
Max core number: 7
Num vertices: 138
*** [pmc heuristic: thread 7]   current max clique = 5,  time = 0.00120902 sec
[pmc heuristic]	 mc = 5
Created adjacency matrix in 0.000298023 seconds
[pmc: initial k-core pruning]  before pruning: |V| = 137, |E| = 424
[pmc: initial k-core pruning]  after pruning:  |V| = 79, |E| = 233
[pmc]  initial pruning took 9.67979e-05 sec
[pmc: sorting neighbors]  |E| = 466, |E_sorted| = 466
|V| = 51
-----------------------------------------------------------------------
Max Clique of scale estimation inliers: 
101 103 106 111 133 
Using chain graph for GNC rotation.
Starting rotation solver.
GNC rotation estimation noise bound:0.1
GNC rotation estimation noise bound squared:0.01
matcher_node: /home/libs/Eigen/3.3.2/include/Eigen/src/SVD/SVDBase.h:85: const MatrixUType& Eigen::SVDBase<Derived>::matrixU() const [with Derived = Eigen::JacobiSVD<Eigen::Matrix<double, 3, 3>, 2>; Eigen::SVDBase<Derived>::MatrixUType = Eigen::Matrix<double, 3, 3>; typename Eigen::internal::traits<T>::MatrixType::Scalar = double]: Assertion `m_isInitialized && "SVD is not initialized."' failed.

process with pid 9654 terminated by signal SIGABRT with status: 134 (core dumped!)

segmentation fault

Hi, I tried to use teaser++ to process a series of point cloud (frames).
namely, register the point cloud in frame k with that in frame k+1, and so on.

It works whe I only run on one pair of point clouds, but when I implement it in loop, it prompt the error ”zsh: segmentation fault”

My laptop os is MacOS Catalina and I run the executable file with command “OMP_NUM_THREADS=12 ./teaser_cpp_ply”

Is it caused by thread conflict? How can I deal with this?

Thank you.

int main() {

  int i,datalen=0;
  std::string num[1770];
  std::ifstream file("/Users/manmi/Documents/data/square_data/mm_data/timestamp.txt");
  while (!file.eof()) 
  file>>num[datalen++];

  
  for (int i = 0; i < 10; ++i) {
    
      // Load the .ply file
      teaser::PLYReader reader;
      teaser::PointCloud src_cloud;
      std::string src_path = "/Users/manmi/Documents/data/square_data/mm_data/mm_ply/" + num[i+3] + ".ply";
      auto status = reader.read(src_path, src_cloud);
      int N = src_cloud.size();


      teaser::PointCloud tgt_cloud;
      std::string tgt_path = "/Users/manmi/Documents/data/square_data/mm_data/mm_ply/" + num[i] + ".ply";
      reader.read(tgt_path, tgt_cloud);
      int M = tgt_cloud.size();


      // Convert the point cloud to Eigen
      Eigen::Matrix<double, 3, Eigen::Dynamic> src(3, N);
      for (size_t i = 0; i < N; ++i) {
        src.col(i) << src_cloud[i].x, src_cloud[i].y, src_cloud[i].z;
      }

      Eigen::Matrix<double, 3, Eigen::Dynamic> tgt(3, M);
      for (size_t i = 0; i < M; ++i) {
        tgt.col(i) << tgt_cloud[i].x, tgt_cloud[i].y, tgt_cloud[i].z;
      }
      
      // Run TEASER++ registration
      // Prepare solver parameters
      teaser::RobustRegistrationSolver::Params params;
      params.noise_bound = NOISE_BOUND;
      params.cbar2 = 1;
      params.estimate_scaling = false;
      params.rotation_max_iterations = 100;
      params.rotation_gnc_factor = 1.4;
      params.rotation_estimation_algorithm =
          teaser::RobustRegistrationSolver::ROTATION_ESTIMATION_ALGORITHM::GNC_TLS;
      params.rotation_cost_threshold = 0.000005;

      // Solve with TEASER++
      teaser::RobustRegistrationSolver solver(params);
      std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
      solver.solve(src, tgt);
      std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();

      auto solution = solver.getSolution();

      // Compare results
      // std::cout << "=====================================" << std::endl;
      // std::cout << "          TEASER++ Results           " << std::endl;
      // std::cout << "=====================================" << std::endl;
 
      std::ofstream outfile;
      outfile.open("/Users/manmi/Documents/data/square_data/mm_data/mm_T_teaser.txt", std::ios::app);
      outfile << num[i] << " " << solution.translation(0) << " " << solution.translation(1) << " " << solution.translation(2) << std::endl;
      outfile.close();


          
      outfile.open("/Users/manmi/Documents/data/square_data/mm_data/mm_R_matrix_teaser.txt", std::ios::app);
      outfile << num[i] << " "  \
              << solution.rotation(0) << " " << solution.rotation(1) << " " << solution.rotation(2) << " "  \
              << solution.rotation(3) << " " << solution.rotation(4) << " " << solution.rotation(5) << " "  \
              << solution.rotation(6) << " " << solution.rotation(7) << " " << solution.rotation(8) << std::endl;
      outfile.close();
  }

}

Output :

image

Information about finding multiple solutions

First, thanks for providing such well organized source code that's been pretty straightforward to install and get working with my own data.

I was wondering if it is possible to get multiple transform solutions out using Teaser. In particular, I was investigating using Teaser for 6D pose estimation of objects in depth data. I have very noisy scene data and very clean (CAD) model info. I have something working in a commercial software package, and pretty quickly got a similar result from Teaser to find the correct object pose in a cluttered scene.

However, most of the time, there are going to be multiple instances of the same object type in the scene, so I'd like to find all matches. I supposed one way I could do this is to take the first solution, find all points in the scene that are closest points to hte object at the solution, and remove those points from the scene (presumably, I'd need to remove the appropriate FPFH features and their correspondences too -- or recompute them assuming that's not to expensive), then re-run the Teaser solver; however, this seems like a lot of work if there's already a simpler solution. This also assumes that the FPFH correspondence matcher that you wrote returns global correspondences for the source and target, and hasn't culled them down to some base set used for the solver.

Any help you might provide would be appreciated. Thanks in advance.

teaser_cpp_fpfh core dumped

Hi,

I'm trying to run ./teaser_cpp_fpfh.cc on Ubuntu 16.04 and I got this output:

OMP_NUM_THREADS=12  ./teaser_cpp_fpfh
	Read 94 total vertices 
CROSS CHECK
Skipping Tuple Constraint.
Segmentation fault (core dumped)

I'm using the bun_zipper_res3.ply pointcloud (after downsampling it).

What does it mean when solution scale is -nan?

Hi, I'm running Teaser-plus-plus in Python and the solution I got for one of my datasets has a scale equal to -nan. What does it mean? Does it mean that the scale could not be calculated or that there's no scale needed?

Thank you.

Ability to use custom correspondences (Eg. Point to Line, Point to Plane associations)

Hello,

I was wondering if it is possible to extend TEASER-plusplus to have user-defined correspondences instead of just point-to-point associations?

For instance, CERES requires the user to define a custom CostFunction class which just overloads () operator to get current residues:
http://ceres-solver.org/nnls_modeling.html

Can TEASER++'s api be extended so that its solve() function can take direct residues and optimization parameters?

Teaser and 3D smooth together

I finally got the new C examples running and I tried to run them with my own point clouds. But they were too big and caused a Malloc error. Now I understand from reading that what I should do is feed the correspondences in, instead. So I spent some time and now I have 3Dsmoothnet running. It seems to take in ply files and generate .csv files that I assume are the correspondances? I'm confused on how to go from pointcloud -> 3Dsmoothnet -> teaser. Do you have any advice for me?

Edit: I'm learning to use the 3Dsmoothnet example you gave in python directory

Thanks!

run error

Thank you for you wonderful work!
I ran into a problem when I ran Mini C + + example according to your steps. I hope you can answer it.

laichao@laichao-PC:~/TEASER-plusplus/examples/teaser_cpp_ply/build$ ./teaser_cpp_ply
./teaser_cpp_ply: error while loading shared libraries: libpmc.so: cannot open shared object file: No such file or directory

I run in Ubuntu 18.04, Thank you for your response~

Issues Installing the TEASER++ Python binding

Hello jingnan,

I am working on point cloud registration for reverse engineering and additive repair, for which your TEASER++ code looks very promising and capable. I am trying to run it in python. I do not have much experience with C++ or Cmake, therefore I'm hoping that you can help me with the final step to install TEASER++ to my Anaconda environment.
I downloaded the TEASER++ repository and ran it through Cmake. For that I had to manually download pmc, pybind11 and tinyply and place them into the '...-src' folders inside the build folder, because Cmake was not able to install them by itself. After doing that I now have the 'build/python' folder which you can see here.
TEASER++ python

When I run 'pip install .' in this folder I get the following error. 

Processing c:\users\habib\desktop\teaser-plusplus-master\build\python
    ERROR: Command errored out with exit status 1:
     command: 'c:\users\habib\anaconda3\envs\ipk\python.exe' -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'C:\\Users\\habib\\AppData\\Local\\Temp\\pip-req-build-y6hagk_w\\setup.py'"'"'; __file__='"'"'C:\\Users\\habib\\AppData\\Local\\Temp\\pip-req-build-y6hagk_w\\setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(__file__);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, __file__, '"'"'exec'"'"'))' egg_info --egg-base 'C:\Users\habib\AppData\Local\Temp\pip-req-build-y6hagk_w\pip-egg-info'
         cwd: C:\Users\habib\AppData\Local\Temp\pip-req-build-y6hagk_w\
    Complete output (7 lines):
    running egg_info
    creating C:\Users\habib\AppData\Local\Temp\pip-req-build-y6hagk_w\pip-egg-info\teaserpp_python.egg-info
    writing C:\Users\habib\AppData\Local\Temp\pip-req-build-y6hagk_w\pip-egg-info\teaserpp_python.egg-info\PKG-INFO
    writing dependency_links to C:\Users\habib\AppData\Local\Temp\pip-req-build-y6hagk_w\pip-egg-info\teaserpp_python.egg-info\dependency_links.txt
    writing top-level names to C:\Users\habib\AppData\Local\Temp\pip-req-build-y6hagk_w\pip-egg-info\teaserpp_python.egg-info\top_level.txt
    writing manifest file 'C:\Users\habib\AppData\Local\Temp\pip-req-build-y6hagk_w\pip-egg-info\teaserpp_python.egg-info\SOURCES.txt'
    error: package directory 'C:Users\habib\Desktop\TEASER-plusplus-master\build\python\teaserpp_python' does not exist
    ----------------------------------------
ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.

Does someone know what I'm doing wrong?
I'd be thankful for any hints.

[QUESTION] Segmentation fault (core dumped)

Have you read the documentation?

  • Yes

Post your theoretical questions / usage questions here.
I have run the example, but I use my point cloud, but I have get the result blew:

==================================================
TEASER++ Python registration example

Starting scale solver.
Segmentation fault (core dumped)

So I don't know what wrong with my code ?

solver_params = teaserpp_python.RobustRegistrationSolver.Params()
solver_params.cbar2 = 1
solver_params.noise_bound = NOISE_BOUND
solver_params.estimate_scaling = False
solver_params.inlier_selection_mode = teaserpp_python.RobustRegistrationSolver.INLIER_SELECTION_MODE.PMC_HEU
solver_params.rotation_estimation_algorithm = teaserpp_python.RobustRegistrationSolver.ROTATION_ESTIMATION_ALGORITHM.GNC_TLS
solver_params.rotation_gnc_factor = 1.4
solver_params.rotation_max_iterations = 100
solver_params.rotation_cost_threshold = 1e-12
solver_params.kcore_heuristic_threshold = 0.3

above is my solver params

Calculation error

Hello
Thank you again, When I use example "teaser_cpp_fpfh" to with stanford bunny data, I meet a problem: The error may be too big. Here is my output.

    Read 35947 total vertices

CROSS CHECK
Skipping Tuple Constraint.
*** [pmc heuristic: thread 1] current max clique = 2, time = 0 sec
[pmc heuristic] mc = 2

      TEASER++ Results

=====================================
Expected rotation:
0.996927 0.0668736 -0.0406664
-0.066129 0.997618 0.0194009
0.0418676 -0.0166518 0.998978
Estimated rotation:
0.977325 -0.196892 0.0779098
-0.161481 -0.931042 -0.327237
0.136968 0.307236 -0.941725
Error (deg): 2.83486

Expected translation:
-0.115577
-0.0387705
0.114875
Estimated translation:
-179.815
57.6956
41.1567
Error (m): 193.157

Number of correspondences: 35947
Number of outliers: 1700
Time taken (s): 0.007342

Segmentation fault on python2.7

Using the solver parameters given by the tutorial example on my own data, meeting the following error:

[pmc heuristic] mc = 0 Created adjacency matrix in 1.88351e-05 seconds [pmc: initial k-core pruning] before pruning: |V| = 142, |E| = 0 [pmc: initial k-core pruning] after pruning: |V| = 142, |E| = 0 [pmc] initial pruning took 1.28746e-05 sec [pmc: sorting neighbors] |E| = 0, |E_sorted| = 0 |V| = 142 *** [pmc: thread 37] current max clique = 1, time = >>> [pmc: thread [pmc: bounds updated - thread [pmc: bounds updated - thread [pmc: bounds updated - thread 0.0017879 sec 46[pmc: upper bound reached] omega = 1 [pmc: bounds updated - thread 18] time = 0.00187087 sec, |V| = 139 (3 / 142), |E| = 0, w = 1, p = 0, d_min = 0, d_avg = 0, d_max = 0, k_max = 0
Segmentation fault (core dumped)

Any hints on what happened :(

Thx!

Could NOT find Matlab

Hi, I have Mex but in Windows, when I build, I got this error:
Could NOT find Matlab (missing: Matlab_MEX_LIBRARY MX_LIBRARY) (found version "9.5")

Example for using with point clouds

Could you share an example of how to run this against a pair of point clouds? Like from a ply or obj file or something? The examples just show making a random array and using that as the source.

Thanks!

Noise bound choosing

Hi,

First, thanks for your insightful work 👍🏼
Well while reading the paper, I have several questions related to the noise bound and hope to get some help here.

  • Can I say that the noise bound (which is $\Beta_{i}$ in the paper) in TLS is something like the bound in Trimmed ICP? As both of them try to resist outliers by a 'hard rejection' manner.
  • How to properly choose the noise bound in different applications (different scales of the scenarios(int- outdoor), different overlap ratio)?
  • As in the experiment section (XI, E) stated, we can pass the result of Teaser++ to Algorithm 3 (Optimality Certification) and get the answer whether the result is optimal or not (Teaser++(CERT)). Is there a way for the algorithm Teaser++ itself to provide an answer to the optimality (or confidence) of its result? And also for the code of Teaser++(CERT), is there any plan to make it open-sourced 😉 ?

Sorry for these messy questions and thanks in advance!

Pamphlett

Uncompitble with PCL-1.11.1 [BUG]

Describe the bug
The example "teaser_cpp_ply.cc" works fine.
However, if I add PCL_LIBRARIES:

target_link_libraries(${targetname}
Eigen3::Eigen
/usr/local/lib/libteaser_io.so
/usr/local/lib/libteaser_registration.so
${PCL_LIBRARIES}
)

The compile works, but Signal: SIGSEGV (Segmentation fault) comes out at the solve.solve() . It traces back to Eigen's memory.h

double free or corruption (out)

/** \internal Frees memory allocated with handmade_aligned_malloc /
inline void handmade_aligned_free(void ptr)
{
if (ptr) std::free(
(reinterpret_cast<void
*>(ptr) - 1));
}

I use the latest PCL 1.11.1. It works with my project. So could you update your code for the latest PCL 1.11.1?
Thanks for your great work.

Have you run the unit tests?

  • [x ] Yes
  • [] No --- then this issue will be closed.

Installed Dependencies
ubuntu 18.04
PCL1.11.1

To Reproduce
Please post the exact steps you executed to reproduce the bug.

Additional context
I think since PCL 1.10 all the BOOST:: pointer is removed from PCL, and use std:: pointer instead.
Maybe this causes the problem.

Size limit

Is there a limitation to the size of the ply file? And do you have any methods for reading in .pcd files instead of ply? Below is the output of teaser_cpp_ply when I attempted with my own ply data.

Read 194507 total vertices
Read 164016 total vertices
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Aborted (core dumped)

When I run teaser_cpp_fpfh example,I run into this problem

When I run teaser_cpp_fpfh example,I run into this problem:
Read 1889 total vertices
CROSS CHECK
Skipping Tuple Constraint.
Starting scale solver.
Scale estimation complete.
Max core number: 4
Num vertices: 7
*** [pmc heuristic: thread 1] current max clique = 5, time = 1.90735e-05 sec
[pmc heuristic] mc = 5
Max Clique of scale estimation inliers:
Using chain graph for GNC rotation.
Starting rotation solver.
GNC rotation estimation noise bound:0.1
GNC rotation estimation noise bound squared:0.01
GNC-TLS terminated because maximum residual at initialization is very small.
Rotation estimation complete.
Starting translation solver.
Translation estimation complete.
double free or corruption (out)
Aborted (core dumped)

Running Teaser++ with PCL fpfh

Hi

I am trying to build Teaser++ with PCL fpfh. I am building the library using:
cmake .. -DBUILD_TEASER_FPFH=ON && make
I am getting the following error:
image

Please let me know how can this be fixed?

I am using:
Ubuntu 18.04.4 LTS
ROS Melodic

Thanks

how to make the python demo to do registration on more points

I run the demo code:

import numpy as np
import teaserpp_python

src = np.random.rand(3, 10000)

scale = 1.2
translation = np.array([[1], [0], [-1]])
rotation = np.array([[0.98370992, 0.17903344, -0.01618098],
                     [-0.04165862, 0.13947877, -0.98934839],
                     [-0.17486954, 0.9739059, 0.14466493]])
dst = scale * np.matmul(rotation, src) + translation

dst[:, 1] += 10
dst[:, 9] += 15

solver_params = teaserpp_python.RobustRegistrationSolver.Params()
solver_params.cbar2 = 1
solver_params.noise_bound = 0.01
solver_params.estimate_scaling = True 
solver_params.rotation_estimation_algorithm = (
    teaserpp_python.RobustRegistrationSolver.ROTATION_ESTIMATION_ALGORITHM.GNC_TLS
)
solver_params.rotation_gnc_factor = 1.4
solver_params.rotation_max_iterations = 100
solver_params.rotation_cost_threshold = 1e-12
print("TEASER++ Parameters are:", solver_params)
teaserpp_solver = teaserpp_python.RobustRegistrationSolver(solver_params)

solver = teaserpp_python.RobustRegistrationSolver(solver_params)
solver.solve(src, dst)

solution = solver.getSolution()
print("Solution is:", solution)

The maximum of number of points in the point cloud I can run successfully is 10000. If the number is greater than 10000, the program will be killed automatically. Is it possible to run the code on more points, since I'm doing face point cloud registration? Thanks!

Any attempts to compile on Windows yet?

Hello and thank you for uploading your code so we all have access to that!
It is very much appreciated.

Has anyone tried to compile the library in Win10 yet and VS2019?

Many thanks,

Giorgis

teaser_cpp_fpfh

when run teaser_cpp_fgfh, i got error,wish you give some advise
*** Error in `./teaser_cpp_fpfh': double free or corruption (out): 0x0000000001e86f00 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7fa07a8727e5]
/lib/x86_64-linux-gnu/libc.so.6(+0x8037a)[0x7fa07a87b37a]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x4c)[0x7fa07a87f53c]
./teaser_cpp_fpfh[0x40814c]
./teaser_cpp_fpfh[0x408a49]
./teaser_cpp_fpfh[0x40a54c]
./teaser_cpp_fpfh[0x408cd3]
./teaser_cpp_fpfh[0x4086ba]
./teaser_cpp_fpfh[0x4086d6]
./teaser_cpp_fpfh(_ZN3pcl14FPFHEstimationINS_8PointXYZENS_6NormalENS_15FPFHSignature33EED1Ev+0x30)[0x40d730]
./teaser_cpp_fpfh(_ZN3pcl14FPFHEstimationINS_8PointXYZENS_6NormalENS_15FPFHSignature33EED0Ev+0x18)[0x40d7a2]
./teaser_cpp_fpfh[0x40d7da]
./teaser_cpp_fpfh[0x413902]
./teaser_cpp_fpfh[0x408522]
./teaser_cpp_fpfh[0x4085b5]
./teaser_cpp_fpfh[0x4086f6]
./teaser_cpp_fpfh[0x4087d6]
./teaser_cpp_fpfh[0x407a67]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7fa07a81b830]
./teaser_cpp_fpfh[0x406f29]
======= Memory map: ========
00400000-00429000 r-xp 00000000 103:02 11173194 /home/jack33/TEASER-plusplus/examples/teaser_cpp_fpfh/build/teaser_cpp_fpfh
00629000-0062b000 rw-p 00029000 103:02 11173194 /home/jack33/TEASER-plusplus/examples/teaser_cpp_fpfh/build/teaser_cpp_fpfh
01de6000-01f68000 rw-p 00000000 00:00 0 [heap]
7fa058000000-7fa058021000 rw-p 00000000 00:00 0
7fa058021000-7fa05c000000 ---p 00000000 00:00 0
7fa05c520000-7fa05c55d000 rw-p 00000000 00:00 0
7fa05c55d000-7fa05c5a3000 r-xp 00000000 103:02 6291659 /usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0
7fa05c5a3000-7fa05c7a2000 ---p 00046000 103:02 6291659 /usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0
7fa05c7a2000-7fa05c7a3000 r--p 00045000 103:02 6291659 /usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0
7fa05c7a3000-7fa05c7a4000 rw-p 00046000 103:02 6291659 /usr/lib/x86_64-linux-gnu/libquadmath.so.0.0.0
7fa05c7a4000-7fa05c7a5000 rw-p 00000000 00:00 0
7fa05c7a5000-7fa05c7ae000 r-xp 00000000 103:02 1311098 /lib/x86_64-linux-gnu/libcrypt-2.23.so
7fa05c7ae000-7fa05c9ad000 ---p 00009000 103:02 1311098 /lib/x86_64-linux-gnu/libcrypt-2.23.so
7fa05c9ad000-7fa05c9ae000 r--p 00008000 103:02 1311098 /lib/x86_64-linux-gnu/libcrypt-2.23.so
7fa05c9ae000-7fa05c9af000 rw-p 00009000 103:02 1311098 /lib/x86_64-linux-gnu/libcrypt-2.23.so
7fa05c9af000-7fa05c9dd000 rw-p 00000000 00:00 0
7fa05c9dd000-7fa05ca24000 r-xp 00000000 103:02 6300138 /usr/lib/x86_64-linux-gnu/libhx509.so.5.0.0
7fa05ca24000-7fa05cc23000 ---p 00047000 103:02 6300138 /usr/lib/x86_64-linux-gnu/libhx509.so.5.0.0
7fa05cc23000-7fa05cc25000 r--p 00046000 103:02 6300138 /usr/lib/x86_64-linux-gnu/libhx509.so.5.0.0
7fa05cc25000-7fa05cc27000 rw-p 00048000 103:02 6300138 /usr/lib/x86_64-linux-gnu/libhx509.so.5.0.0
7fa05cc27000-7fa05cc28000 rw-p 00000000 00:00 0
7fa05cc28000-7fa05cc36000 r-xp 00000000 103:02 6300120 /usr/lib/x86_64-linux-gnu/libheimbase.so.1.0.0
7fa05cc36000-7fa05ce35000 ---p 0000e000 103:02 6300120 /usr/lib/x86_64-linux-gnu/libheimbase.so.1.0.0
7fa05ce35000-7fa05ce36000 r--p 0000d000 103:02 6300120 /usr/lib/x86_64-linux-gnu/libheimbase.so.1.0.0
7fa05ce36000-7fa05ce37000 rw-p 0000e000 103:02 6300120 /usr/lib/x86_64-linux-gnu/libheimbase.so.1.0.0
7fa05ce37000-7fa05ce38000 rw-p 00000000 00:00 0
7fa05ce38000-7fa05ce5f000 r-xp 00000000 103:02 6300797 /usr/lib/x86_64-linux-gnu/libwind.so.0.0.0
7fa05ce5f000-7fa05d05f000 ---p 00027000 103:02 6300797 /usr/lib/x86_64-linux-gnu/libwind.so.0.0.0
7fa05d05f000-7fa05d060000 r--p 00027000 103:02 6300797 /usr/lib/x86_64-linux-gnu/libwind.so.0.0.0
7fa05d060000-7fa05d061000 rw-p 00028000 103:02 6300797 /usr/lib/x86_64-linux-gnu/libwind.so.0.0.0
7fa05d061000-7fa05d18f000 r-xp 00000000 103:02 6292511 /usr/lib/x86_64-linux-gnu/libgfortran.so.3.0.0
7fa05d18f000-7fa05d38f000 ---p 0012e000 103:02 6292511 /usr/lib/x86_64-linux-gnu/libgfortran.so.3.0.0
7fa05d38f000-7fa05d390000 r--p 0012e000 103:02 6292511 /usr/lib/x86_64-linux-gnu/libgfortran.so.3.0.0
7fa05d390000-7fa05d392000 rw-p 0012f000 103:02 6292511 /usr/lib/x86_64-linux-gnu/libgfortran.so.3.0.0
7fa05d392000-7fa05d393000 rw-p 00000000 00:00 0
7fa05d393000-7fa05d3a5000 r-xp 00000000 103:02 1315320 /lib/x86_64-linux-gnu/libgpg-error.so.0.17.0
7fa05d3a5000-7fa05d5a5000 ---p 00012000 103:02 1315320 /lib/x86_64-linux-gnu/libgpg-error.so.0.17.0
7fa05d5a5000-7fa05d5a6000 r--p 00012000 103:02 1315320 /lib/x86_64-linux-gnu/libgpg-error.so.0.17.0
7fa05d5a6000-7fa05d5a7000 rw-p 00013000 103:02 1315320 /lib/x86_64-linux-gnu/libgpg-error.so.0.17.0
7fa05d5a7000-7fa05d5bc000 r-xp 00000000 103:02 6300538 /usr/lib/x86_64-linux-gnu/libroken.so.18.1.0
7fa05d5bc000-7fa05d7bb000 ---p 00015000 103:02 6300538 /usr/lib/x86_64-linux-gnu/libroken.so.18.1.0
7fa05d7bb000-7fa05d7bc000 r--p 00014000 103:02 6300538 /usr/lib/x86_64-linux-gnu/libroken.so.18.1.0
7fa05d7bc000-7fa05d7bd000 rw-p 00015000 103:02 6300538 /usr/lib/x86_64-linux-gnu/libroken.so.18.1.0
7fa05d7bd000-7fa05d7be000 rw-p 00000000 00:00 0
7fa05d7be000-7fa05d7ee000 r-xp 00000000 103:02 6300118 /usr/lib/x86_64-linux-gnu/libhcrypto.so.4.1.0
7fa05d7ee000-7fa05d9ee000 ---p 00030000 103:02 6300118 /usr/lib/x86_64-linux-gnu/libhcrypto.so.4.1.0
7fa05d9ee000-7fa05d9ef000 r--p 00030000 103:02 6300118 /usr/lib/x86_64-linux-gnu/libhcrypto.so.4.1.0
7fa05d9ef000-7fa05d9f0000 rw-p 00031000 103:02 6300118 /usr/lib/x86_64-linux-gnu/libhcrypto.so.4.1.0
7fa05d9f0000-7fa05d9f1000 rw-p 00000000 00:00 0
7fa05d9f1000-7fa05da90000 r-xp 00000000 103:02 6299555 /usr/lib/x86_64-linux-gnu/libasn1.so.8.0.0
7fa05da90000-7fa05dc8f000 ---p 0009f000 103:02 6299555 /usr/lib/x86_64-linux-gnu/libasn1.so.8.0.0
7fa05dc8f000-7fa05dc90000 r--p 0009e000 103:02 6299555 /usr/lib/x86_64-linux-gnu/libasn1.so.8.0.0
7fa05dc90000-7fa05dc93000 rw-p 0009f000 103:02 6299555 /usr/lib/x86_64-linux-gnu/libasn1.so.8.0.0
7fa05dc93000-7fa05dd17000 r-xp 00000000 103:02 6300225 /usr/lib/x86_64-linux-gnu/libkrb5.so.26.0.0
7fa05dd17000-7fa05df16000 ---p 00084000 103:02 6300225 /usr/lib/x86_64-linux-gnu/libkrb5.so.26.0.0
7fa05df16000-7fa05df19000 r--p 00083000 103:02 6300225 /usr/lib/x86_64-linux-gnu/libkrb5.so.26.0.0
7fa05df19000-7fa05df1c000 rw-p 00086000 103:02 6300225 /usr/lib/x86_64-linux-gnu/libkrb5.so.26.0.0
7fa05df1c000-7fa05df1e000 rw-p 00000000 00:00 0
7fa05df1e000-7fa05df26000 r-xp 00000000 103:02 6300122 /usr/lib/x86_64-linux-gnu/libheimntlm.so.0.1.0
7fa05df26000-7fa05e125000 ---p 00008000 103:02 6300122 /usr/lib/x86_64-linux-gnu/libheimntlm.so.0.1.0
7fa05e125000-7fa05e126000 r--p 00007000 103:02 6300122 /usr/lib/x86_64-linux-gnu/libheimntlm.so.0.1.0
7fa05e126000-7fa05e127000 rw-p 00008000 103:02 6300122 /usr/lib/x86_64-linux-gnu/libheimntlm.so.0.1.0
7fa05e127000-7fa05e12a000 r-xp 00000000 103:02 1315337 /lib/x86_64-linux-gnu/libkeyutils.so.1.5
7fa05e12a000-7fa05e329000 ---p 00003000 103:02 1315337 /lib/x86_64-linux-gnu/libkeyutils.so.1.5
7fa05e329000-7fa05e32a000 r--p 00002000 103:02 1315337 /lib/x86_64-linux-gnu/libkeyutils.so.1.5
7fa05e32a000-7fa05e32b000 rw-p 00003000 103:02 1315337 /lib/x86_64-linux-gnu/libkeyutils.so.1.5
7fa05e32b000-7fa05e32c000 rw-p 00000000 00:00 0
7fa05e32c000-7fa05e346000 r-xp 00000000 103:02 6300777 /usr/lib/x86_64-linux-gnu/liburiparser.so.1.0.20
7fa05e346000-7fa05e545000 ---p 0001a000 103:02 6300777 /usr/lib/x86_64-linux-gnu/liburiparser.so.1.0.20
7fa05e545000-7fa05e546000 r--p 00019000 103:02 6300777 /usr/lib/x86_64-linux-gnu/liburiparser.so.1.0.20
7fa05e546000-7fa05e547000 rw-p 0001a000 103:02 6300777 /usr/lib/x86_64-linux-gnu/liburiparser.so.1.0.20
7fa05e547000-7fa05e551000 r-xp 00000000 103:02 6300742 /usr/lib/x86_64-linux-gnu/libminizip.so.1.0.0
7fa05e551000-7fa05e750000 ---p 0000a000 103:02 6300742 /usr/lib/x86_64-linux-gnu/libminizip.so.1.0.0
7fa05e750000-7fa05e751000 r--p 00009000 103:02 6300742 /usr/lib/x86_64-linux-gnu/libminizip.so.1.0.0
7fa05e751000-7fa05e752000 rw-p 0000a000 103:02 6300742 /usr/lib/x86_64-linux-gnu/libminizip.so.1.0.0
7fa05e752000-7fa05e753000 rw-p 00000000 00:00 0
7fa05e753000-7fa05e8e1000 r-xp 00000000 103:02 6300508 /usr/lib/x86_64-linux-gnu/libgeos-3.5.0.so
7fa05e8e1000-7fa05eae1000 ---p 0018e000 103:02 6300508 /usr/lib/x86_64-linux-gnu/libgeos-3.5.0.so
7fa05eae1000-7fa05eaec000 r--p 0018e000 103:02 6300508 /usr/lib/x86_64-linux-gnu/libgeos-3.5.0.so
7fa05eaec000-7fa05eaed000 rw-p 00199000 103:02 6300508 /usr/lib/x86_64-linux-gnu/libgeos-3.5.0.so
7fa05eaed000-7fa05eb3f000 r-xp 00000000 103:02 6293967 /usr/lib/x86_64-linux-gnu/liblcms2.so.2.0.6
7fa05eb3f000-7fa05ed3e000 ---p 00052000 103:02 6293967 /usr/lib/x86_64-linux-gnu/liblcms2.so.2.0.6
7fa05ed3e000-7fa05ed3f000 r--p 00051000 103:02 6293967 /usr/lib/x86_64-linux-gnu/liblcms2.so.2.0.6
7fa05ed3f000-7fa05ed43000 rw-p 00052000 103:02 6293967 /usr/lib/x86_64-linux-gnu/liblcms2.so.2.0.6
7fa05ed43000-7fa05ed45000 rw-p 00000000 00:00 0
7fa05ed45000-7fa05edb0000 r-xp 00000000 103:02 6297995 /usr/lib/x86_64-linux-gnu/libsuperlu.so.4.0.0
7fa05edb0000-7fa05efaf000 ---p 0006b000 103:02 6297995 /usr/lib/x86_64-linux-gnu/libsuperlu.so.4.0.0
7fa05efaf000-7fa05efb0000 r--p 0006a000 103:02 6297995 /usr/lib/x86_64-linux-gnu/libsuperlu.so.4.0.0
7fa05efb0000-7fa05efb1000 rw-p 0006b000 103:02 6297995 /usr/lib/x86_64-linux-gnu/libsuperlu.so.4.0.0
7fa05efb1000-7fa05effb000 r-xp 00000000 103:02 6300379 /usr/lib/libarpack.so.2.0.0
7fa05effb000-7fa05f1fa000 ---p 0004a000 103:02 6300379 /usr/lib/libarpack.so.2.0.0
7fa05f1fa000-7fa05f1fb000 r--p 00049000 103:02 6300379 /usr/lib/libarpack.so.2.0.0
7fa05f1fb000-7fa05f1fc000 rw-p 0004a000 103:02 6300379 /usr/lib/libarpack.so.2.0.0
7fa05f1fc000-7fa05f7f0000 r-xp 00000000 103:02 6424514 /usr/lib/lapack/liblapack.so.3.6.0
7fa05f7f0000-7fa05f9ef000 ---p 005f4000 103:02 6424514 /usr/lib/lapack/liblapack.so.3.6.0
7fa05f9ef000-7fa05f9f0000 r--p 005f3000 103:02 6424514 /usr/lib/lapack/liblapack.so.3.6.0
7fa05f9f0000-7fa05f9f4000 rw-p 005f4000 103:02 6424514 /usr/lib/lapack/liblapack.so.3.6.0
7fa05f9f4000-7fa05f9f5000 rw-p 00000000 00:00 0
7fa05f9f5000-7fa05fa63000 r-xp 00000000 103:02 6301026 /usr/lib/libblas/libblas.so.3.6.0
7fa05fa63000-7fa05fc62000 ---p 0006e000 103:02 6301026 /usr/lib/libblas/libblas.so.3.6.0
7fa05fc62000-7fa05fc63000 r--p 0006d000 103:02 6301026 /usr/lib/libblas/libblas.so.3.6.0
7fa05fc63000-7fa05fc64000 rw-p 0006e000 103:02 6301026 /usr/lib/libblas/libblas.so.3.6.0
7fa05fc64000-7fa05fc92000 r-xp 00000000 103:02 6291971 /usr/lib/x86_64-linux-gnu/libsoxr.so.0.1.1
7fa05fc92000-7fa05fe91000 ---p 0002e000 103:02 6291971 /usr/lib/x86_64-linux-gnu/libsoxr.so.0.1.1
7fa05fe91000-7fa05fe93000 r--p 0002d000 103:02 6291971 /usr/lib/x86_64-linux-gnu/libsoxr.so.0.1.1
7fa05fe93000-7fa05fe94000 rw-p 0002f000 103:02 6291971 /usr/lib/x86_64-linux-gnu/libsoxr.so.0.1.1
7fa05fe94000-7fa05feca000 rw-p 00000000 00:00 0
7fa05feca000-7fa05ffa1000 r-xp 00000000 103:02 1310936 /lib/x86_64-linux-gnu/libgcrypt.so.20.0.5
7fa05ffa1000-7fa0601a1000 ---p 000d7000 103:02 1310936 /lib/x86_64-linux-gnu/libgcrypt.so.20.0.5
7fa0601a1000-7fa0601a2000 r--p 000d7000 103:02 1310936 /lib/x86_64-linux-gnu/libgcrypt.so.20.0.5
7fa0601a2000-7fa0601aa000 rw-p 000d8000 103:02 1310936 /lib/x86_64-linux-gnu/libgcrypt.so.20.0.5
7fa0601aa000-7fa0601ab000 rw-p 00000000 00:00 0
7fa0601ab000-7fa0601bb000 r-xp 00000000 103:02 6299773 /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1.0
7fa0601bb000-7fa0603ba000 ---p 00010000 103:02 6299773 /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1.0
7fa0603ba000-7fa0603bb000 r--p 0000f000 103:02 6299773 /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1.0
7fa0603bb000-7fa0603bc000 rw-p 00010000 103:02 6299773 /usr/lib/x86_64-linux-gnu/libdouble-conversion.so.1.0
7fa0603bc000-7fa0603bd000 rw-p 00000000 00:00 0
7fa0603bd000-7fa060438000 r-xp 00000000 103:02 6300402 /usr/lib/x86_64-linux-gnu/liborc-0.4.so.0.25.0
7fa060438000-7fa060637000 ---p 0007b000 103:02 6300402 /usr/lib/x86_64-linux-gnu/liborc-0.4.so.0.25.0
7fa060637000-7fa060639000 r--p 0007a000 103:02 6300402 /usr/lib/x86_64-linux-gnu/liborc-0.4.so.0.25.0
7fa060639000-7fa06063d000 rw-p 0007c000 103:02 6300402 /usr/lib/x86_64-linux-gnu/liborc-0.4.so.0.25.0
7fa06063d000-7fa060676000 r-xp 00000000 103:02 6315009 /usr/lib/x86_64-linux-gnu/libgsttag-1.0.so.0.803.0
7fa060676000-7fa060875000 ---p 00039000 103:02 6315009 /usr/lib/x86_64-linux-gnu/libgsttag-1.0.so.0.803.0
7fa060875000-7fa060877000 r--p 00038000 103:02 6315009 /usr/lib/x86_64-linux-gnu/libgsttag-1.0.so.0.803.0
7fa060877000-7fa060878000 rw-p 0003a000 103:02 6315009 /usr/lib/x86_64-linux-gnu/libgsttag-1.0.so.0.803.0
7fa060878000-7fa060879000 rw-p 00000000 00:00 0
7fa060879000-7fa06087c000 r-xp 00000000 103:02 6301004 /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0.4800.2
7fa06087c000-7fa060a7b000 ---p 00003000 103:02 6301004 /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0.4800.2
7fa060a7b000-7fa060a7c000 r--p 00002000 103:02 6301004 /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0.4800.2
7fa060a7c000-7fa060a7d000 rw-p 00003000 103:02 6301004 /usr/lib/x86_64-linux-gnu/libgmodule-2.0.so.0.4800.2
7fa060a7d000-7fa060aba000 r-xp 00000000 103:02 6300041 /usr/lib/x86_64-linux-gnu/libgssapi.so.3.0.0
7fa060aba000-7fa060cba000 ---p 0003d000 103:02 6300041 /usr/lib/x86_64-linux-gnu/libgssapi.so.3.0.0
7fa060cba000-7fa060cbb000 r--p 0003d000 103:02 6300041 /usr/lib/x86_64-linux-gnu/libgssapi.so.3.0.0
7fa060cbb000-7fa060cbd000 rw-p 0003e000 103:02 6300041 /usr/lib/x86_64-linux-gnu/libgssapi.so.3.0.0
7fa060cbd000-7fa060cbf000 rw-p 00000000 00:00 0
7fa060cbf000-7fa060cd8000 r-xp 00000000 103:02 6303698 /usr/lib/x86_64-linux-gnu/libsasl2.so.2.0.25
7fa060cd8000-7fa060ed8000 ---p 00019000 103:02 6303698 /usr/lib/x86_64-linux-gnu/libsasl2.so.2.0.25
7fa060ed8000-7fa060ed9000 r--p 00019000 103:02 6303698 /usr/lib/x86_64-linux-gnu/libsasl2.so.2.0.25
7fa060ed9000-7fa060eda000 rw-p 0001a000 103:02 6303698 /usr/lib/x86_64-linux-gnu/libsasl2.so.2.0.25
7fa060eda000-7fa060ef1000 r-xp 00000000 103:02 1311097 /lib/x86_64-linux-gnu/libresolv-2.23.so
7fa060ef1000-7fa0610f1000 ---p 00017000 103:02 1311097 /lib/x86_64-linux-gnu/libresolv-2.23.so
7fa0610f1000-7fa0610f2000 r--p 00017000 103:02 1311097 /lib/x86_64-linux-gnu/libresolv-2.23.so
7fa0610f2000-7fa0610f3000 rw-p 00018000 103:02 1311097 /lib/x86_64-linux-gnu/libresolv-2.23.so
7fa0610f3000-7fa0610f5000 rw-p 00000000 00:00 0
7fa0610f5000-7fa0610ff000 r-xp 00000000 103:02 6292584 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1
7fa0610ff000-7fa0612fe000 ---p 0000a000 103:02 6292584 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1
7fa0612fe000-7fa0612ff000 r--p 00009000 103:02 6292584 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1
7fa0612ff000-7fa061300000 rw-p 0000a000 103:02 6292584 /usr/lib/x86_64-linux-gnu/libkrb5support.so.0.1
7fa061300000-7fa061303000 r-xp 00000000 103:02 1310951 /lib/x86_64-linux-gnu/libcom_err.so.2.1
7fa061303000-7fa061502000 ---p 00003000 103:02 1310951 /lib/x86_64-linux-gnu/libcom_err.so.2.1
7fa061502000-7fa061503000 r--p 00002000 103:02 1310951 /lib/x86_64-linux-gnu/libcom_err.so.2.1
7fa061503000-7fa061504000 rw-p 00003000 103:02 1310951 /lib/x86_64-linux-gnu/libcom_err.so.2.1
7fa061504000-7fa061530000 r-xp 00000000 103:02 6294092 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
7fa061530000-7fa06172f000 ---p 0002c000 103:02 6294092 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
7fa06172f000-7fa061731000 r--p 0002b000 103:02 6294092 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
7fa061731000-7fa061732000 rw-p 0002d000 103:02 6294092 /usr/lib/x86_64-linux-gnu/libk5crypto.so.3.1
7fa061732000-7fa061733000 rw-p 00000000 00:00 0
7fa061733000-7fa0617f6000 r-xp 00000000 103:02 6292582 /usr/lib/x86_64-linux-gnu/libkrb5.so.3.3
7fa0617f6000-7fa0619f6000 ---p 000c3000 103:02 6292582 /usr/lib/x86_64-linux-gnu/libkrb5.so.3.3
7fa0619f6000-7fa061a03000 r--p 000c3000 103:02 6292582 /usr/lib/x86_64-linux-gnu/libkrb5.so.3.3
7fa061a03000-7fa061a05000 rw-p 000d0000 103:02 6292582 /usr/lib/x86_64-linux-gnu/libkrb5.so.3.3
7fa061a05000-7fa061a16000 r-xp 00000000 103:02 6300643 /usr/lib/x86_64-linux-gnu/libtasn1.so.6.5.1
7fa061a16000-7fa061c16000 ---p 00011000 103:02 6300643 /usr/lib/x86_64-linux-gnu/libtasn1.so.6.5.1
7fa061c16000-7fa061c17000 r--p 00011000 103:02 6300643 /usr/lib/x86_64-linux-gnu/libtasn1.so.6.5.1
7fa061c17000-7fa061c18000 rw-p 00012000 103:02 6300643 /usr/lib/x86_64-linux-gnu/libtasn1.so.6.5.1
7fa061c18000-7fa061c71000 r-xp 00000000 103:02 6300412 /usr/lib/x86_64-linux-gnu/libp11-kit.so.0.1.0
7fa061c71000-7fa061e70000 ---p 00059000 103:02 6300412 /usr/lib/x86_64-linux-gnu/libp11-kit.so.0.1.0
7fa061e70000-7fa061e7a000 r--p 00058000 103:02 6300412 /usr/lib/x86_64-linux-gnu/libp11-kit.so.0.1.0
7fa061e7a000-7fa061e7c000 rw-p 00062000 103:02 6300412 /usr/lib/x86_64-linux-gnu/libp11-kit.so.0.1.0
7fa061e7c000-7fa061efb000 r-xp 00000000 103:02 6299986 /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0
7fa061efb000-7fa0620fa000 ---p 0007f000 103:02 6299986 /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0
7fa0620fa000-7fa0620fb000 r--p 0007e000 103:02 6299986 /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0
7fa0620fb000-7fa0620fc000 rw-p 0007f000 103:02 6299986 /usr/lib/x86_64-linux-gnu/libgmp.so.10.3.0
7fa0620fc000-7fa06212e000 r-xp 00000000 103:02 6300124 /usr/lib/x86_64-linux-gnu/libhogweed.so.4.2
7fa06212e000-7fa06232d000 ---p 00032000 103:02 6300124 /usr/lib/x86_64-linux-gnu/libhogweed.so.4.2
7fa06232d000-7fa06232e000 r--p 00031000 103:02 6300124 /usr/lib/x86_64-linux-gnu/libhogweed.so.4.2
7fa06232e000-7fa06232f000 rw-p 00032000 103:02 6300124 /usr/lib/x86_64-linux-gnu/libhogweed.so.4.2
7fa06232f000-7fa062339000 r-xp 00000000 103:02 6300384 /usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0
7fa062339000-7fa062538000 ---p 0000a000 103:02 6300384 /usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0
7fa062538000-7fa062539000 r--p 00009000 103:02 6300384 /usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0
7fa062539000-7fa06253a000 rw-p 0000a000 103:02 6300384 /usr/lib/x86_64-linux-gnu/libnuma.so.1.0.0
7fa06253a000-7fa06253f000 r-xp 00000000 103:02 6299474 /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
7fa06253f000-7fa06273e000 ---p 00005000 103:02 6299474 /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
7fa06273e000-7fa06273f000 r--p 00004000 103:02 6299474 /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
7fa06273f000-7fa062740000 rw-p 00005000 103:02 6299474 /usr/lib/x86_64-linux-gnu/libXdmcp.so.6.0.0
7fa062740000-7fa062742000 r-xp 00000000 103:02 6299463 /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
7fa062742000-7fa062942000 ---p 00002000 103:02 6299463 /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
7fa062942000-7fa062943000 r--p 00002000 103:02 6299463 /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
7fa062943000-7fa062944000 rw-p 00003000 103:02 6299463 /usr/lib/x86_64-linux-gnu/libXau.so.6.0.0
7fa062944000-7fa062968000 r-xp 00000000 103:02 6300028 /usr/lib/x86_64-linux-gnu/libgraphite2.so.3.0.1
7fa062968000-7fa062b67000 ---p 00024000 103:02 6300028 /usr/lib/x86_64-linux-gnu/libgraphite2.so.3.0.1
7fa062b67000-7fa062b69000 r--p 00023000 103:02 6300028 /usr/lib/x86_64-linux-gnu/libgraphite2.so.3.0.1
7fa062b69000-7fa062b6a000 rw-p 00025000 103:02 6300028 /usr/lib/x86_64-linux-gnu/libgraphite2.so.3.0.1
7fa062b6a000-7fa062b71000 r-xp 00000000 103:02 6299853 /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4
7fa062b71000-7fa062d70000 ---p 00007000 103:02 6299853 /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4
7fa062d70000-7fa062d71000 r--p 00006000 103:02 6299853 /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4
7fa062d71000-7fa062d72000 rw-p 00007000 103:02 6299853 /usr/lib/x86_64-linux-gnu/libffi.so.6.0.4
7fa062d72000-7fa062d7b000 r-xp 00000000 103:02 6300257 /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1
7fa062d7b000-7fa062f7a000 ---p 00009000 103:02 6300257 /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1
7fa062f7a000-7fa062f7b000 r--p 00008000 103:02 6300257 /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1
7fa062f7b000-7fa062f7c000 rw-p 00009000 103:02 6300257 /usr/lib/x86_64-linux-gnu/libltdl.so.7.3.1
7fa062f7c000-7fa063197000 r-xp 00000000 103:02 1310982 /lib/x86_64-linux-gnu/libcrypto.so.1.0.0Aborted (core dumped)

open3d fpfh

Is it possible that we can use open3d fpfh to use solver.solve() like teaser_cpp_fpfh example?

How to get matching results with RGBD information

I read excellent papers “TEASER: Fast and Certifiable Point Cloud Registration”, I have configured your code https://github.com/MIT-SPARK/TEASER-plusplus.
However, how can I get the matching results (as shown in Fig. 8 and Fig. 18 of the above paper), which with RGB-D images? With the teaser_python_fpfh_icp, I can only get point cloud registration results without RGB information. Can you tell me the matching steps for the RGBD results (Fig. 8 and Fig. 18 in TEASER: Fast and Certifiable Point Cloud Registration) with you code in https://github.com/MIT-SPARK/TEASER-plusplus.

Looking forward to your reply. Thank you very much.

munmap_chunk(): invalid pointer

Hi, I'm running the minimum python example. When compiling the code everything works fine but when I run the teaser_python_ply.py, I got the following error messages:

==================================================
        TEASER++ Python registration example      
==================================================
*** [pmc heuristic: thread 1]   current max clique = 576,  time = 0.00177217 sec
*** [pmc heuristic: thread 16]   current max clique = 577,  time = 0.0418272 sec
*** [pmc heuristic: thread 4]   current max clique = 578,  time = 0.0511582 sec
*** [pmc heuristic: thread 11]   current max clique = 584,  time = 0.052629 sec
[pmc heuristic]	 mc = 584
Created adjacency matrix in 0.00107789 seconds
[pmc: initial k-core pruning]  before pruning: |V| = 1889, |E| = 324759
[pmc: initial k-core pruning]  after pruning:  |V| = 1889, |E| = 324708
[pmc]  initial pruning took 0.00183296 sec
[pmc: sorting neighbors]  |E| = 649416, |E_sorted| = 649416
|V| = 811
>>> [pmc: thread 16]
[pmc: bounds updated - thread 14]  time = 0.015239 sec, |V| = 1879 (10 / 1889), |E| = 324708, w = 584, p = 0.182091, d_min = 0, d_avg = 343.842, d_max = 810, k_max = 742
[pmc: bounds updated - thread 16]  time = 0.0158432 sec, |V| = 1881 (8 / 1889), |E| = 324708, w = 584, p = 0.182091, d_min = 0, d_avg = 343.842, d_max = 810, k_max = 742
[pmc: bounds updated - thread 15]  time = 0.0159872 sec, |V| = 1877 (12 / 1889), |E| = 324708, w = 584, p = 0.182091, d_min = 0, d_avg = 343.842, d_max = 810, k_max = 742
[pmc: bounds updated - thread 13]  time = 0.016629 sec, |V| = 1874 (15 / 1889), |E| = 324708, w = 584, p = 0.182091, d_min = 0, d_avg = 343.842, d_max = 810, k_max = 742
*** [pmc: thread 8]   current max clique = 585,  time = 0.108998 sec
*** [pmc: thread 10]   current max clique = 586,  time = 0.110153 sec
*** [pmc: thread 4]   current max clique = 589,  time = 0.111155 sec
*** [pmc: thread 6]   current max clique = 591,  time = 0.112657 sec
*** [pmc: thread 2]   current max clique = 595,  time = 0.183097 sec
*** [pmc: thread 13]   current max clique = 596,  time = 0.28271 sec
-----------------------------------------------------------------------
munmap_chunk(): invalid pointer
Aborted (core dumped)
==================================================
        TEASER++ Python registration example      
==================================================
*** [pmc heuristic: thread 1]   current max clique = 573,  time = 0.00123096 sec
*** [pmc heuristic: thread 16]   current max clique = 574,  time = 0.00665092 sec
*** [pmc heuristic: thread 8]   current max clique = 575,  time = 0.016984 sec
*** [pmc heuristic: thread 13]   current max clique = 576,  time = 0.0184 sec
*** [pmc heuristic: thread 9]   current max clique = 578,  time = 0.0382779 sec
*** [pmc heuristic: thread 3]   current max clique = 581,  time = 0.045095 sec
*** [pmc heuristic: thread 12]   current max clique = 582,  time = 0.0607719 sec
*** [pmc heuristic: thread 14]   current max clique = 588,  time = 0.0703318 sec
[pmc heuristic]	 mc = 588
Created adjacency matrix in 0.00113678 seconds
[pmc: initial k-core pruning]  before pruning: |V| = 1889, |E| = 345183
[pmc: initial k-core pruning]  after pruning:  |V| = 1889, |E| = 345140
[pmc]  initial pruning took 0.0019989 sec
[pmc: sorting neighbors]  |E| = 690280, |E_sorted| = 690280
|V| = 837
>>> [pmc: thread 16]
[pmc: bounds updated - thread 15]  time = 0.014457 sec, |V| = 1885 (4 / 1889), |E| = 345140, w = 588, p = 0.193549, d_min = 0, d_avg = 365.466, d_max = 836, k_max = 759
[pmc: bounds updated - thread 16]  time = 0.0153308 sec, |V| = 1887 (2 / 1889), |E| = 345140, w = 588, p = 0.193549, d_min = 0, d_avg = 365.466, d_max = 836, k_max = 759
*** [pmc: thread 13]   current max clique = 593,  time = 0.108145 sec
[pmc: bounds updated - thread 14]  time = 0.110574 sec, |V| = 1875 (14 / 1889), |E| = 345140, w = 593, p = 0.193549, d_min = 0, d_avg = 365.466, d_max = 836, k_max = 759
*** [pmc: thread 1]   current max clique = 596,  time = 0.116564 sec
*** [pmc: thread 15]   current max clique = 598,  time = 0.116638 sec
[pmc: bounds updated - thread 13]  time = 0.119217 sec, |V| = 1881 (8 / 1889), |E| = 345140, w = 598, p = 0.193549, d_min = 0, d_avg = *** [pmc: thread 3]   current max clique = 365.466, d_max = 836600,  time = , k_max = 759
0.119228 sec
*** [pmc: thread 1]   current max clique = 601,  time = 0.210808 sec
*** [pmc: thread 4]   current max clique = 604,  time = 0.222111 sec
*** [pmc: thread 11]   current max clique = 606,  time = 0.226121 sec
*** [pmc: thread 7]   current max clique = 607,  time = 0.229329 sec
*** [pmc: thread 12]   current max clique = 608,  time = 0.33406 sec
-----------------------------------------------------------------------
double free or corruption (out)
Aborted (core dumped)
==================================================
        TEASER++ Python registration example      
==================================================
*** [pmc heuristic: thread 1]   current max clique = 593,  time = 0.00276303 sec
*** [pmc heuristic: thread 11]   current max clique = 599,  time = 0.00730991 sec
*** [pmc heuristic: thread 8]   current max clique = 601,  time = 0.0106959 sec
*** [pmc heuristic: thread 2]   current max clique = 603,  time = 0.0154741 sec
*** [pmc heuristic: thread 16]   current max clique = 606,  time = 0.0502949 sec
[pmc heuristic]	 mc = 606
Created adjacency matrix in 0.001091 seconds
[pmc: initial k-core pruning]  before pruning: |V| = 1889, |E| = 328637
[pmc: initial k-core pruning]  after pruning:  |V| = 1889, |E| = 328595
[pmc]  initial pruning took 0.00184584 sec
[pmc: sorting neighbors]  |E| = 657190, |E_sorted| = 657190
|V| = 815
>>> [pmc: thread 14]
[pmc: bounds updated - thread 13]  time = 0.0140929 sec, |V| = 1884 (5 / 1889), |E| = 328595, w = 606, p = 0.184271, d_min = 0, d_avg = 347.948, d_max = 814, k_max = 754
[pmc: bounds updated - thread 15]  time = 0.014163 sec, |V| = 1877 (12 / 1889), |E| = 328595, w = 606, p = 0.184271, d_min = 0, d_avg = 347.948, d_max = 814, k_max = 754
[pmc: bounds updated - thread 14]  time = 0.0149 sec, |V| = 1883 (6 / 1889), |E| = 328595, w = 606, p = 0.184271, d_min = 0, d_avg = 347.948, d_max = 814, k_max = 754
*** [pmc: thread 9]   current max clique = 607,  time = 0.114317 sec
*** [pmc: thread 12]   current max clique = 610,  time = 0.117402 sec
*** [pmc: thread 8]   current max clique = 614,  time = 0.11796 sec
*** [pmc: thread 6]   current max clique = 615,  time = 0.118366 sec
*** [pmc: thread 7]   current max clique = 617,  time = 0.119499 sec
[pmc: bounds updated - thread 16]  time = 0.121588 sec, |V| = 1878 (11 / 1889), |E| = 328595, w = 617, p = 0.184271, d_min = 0, d_avg = 347.948, d_max = 814, k_max = 754
*** [pmc: thread 2]   current max clique = 619,  time = 0.123672 sec
*** [pmc: thread 5]   current max clique = 624,  time = 0.125752 sec
*** [pmc: thread 6]   current max clique = 625,  time = 0.233777 sec
*** [pmc: thread 4]   current max clique = 627,  time = 0.239735 sec
*** [pmc: thread 12]   current max clique = 628,  time = 0.243452 sec
*** [pmc: thread 1]   current max clique = 630,  time = 0.354936 sec
*** [pmc: thread 15]   current max clique = 631,  time = 0.357835 sec
-----------------------------------------------------------------------
Segmentation fault (core dumped)
==================================================
        TEASER++ Python registration example      
==================================================
*** [pmc heuristic: thread 1]   current max clique = 596,  time = 0.00164294 sec
*** [pmc heuristic: thread 6]   current max clique = 599,  time = 0.0452828 sec
[pmc heuristic]	 mc = 599
Created adjacency matrix in 0.00110602 seconds
[pmc: initial k-core pruning]  before pruning: |V| = 1889, |E| = 337461
[pmc: initial k-core pruning]  after pruning:  |V| = 1889, |E| = 337403
[pmc]  initial pruning took 0.00185394 sec
[pmc: sorting neighbors]  |E| = 674806, |E_sorted| = 674806
|V| = 826
>>> [pmc: thread 14]
[pmc: bounds updated - thread 13]  time = 0.0144331 sec, |V| = 1888 (1 / 1889), |E| = 337403, w = 599, p = 0.18921, d_min = 0, d_avg = 357.291, d_max = 825, k_max = 765
[pmc: bounds updated - thread 14]  time = 0.015239 sec, |V| = 1884 (5 / 1889), |E| = 337403, w = 599, p = 0.18921, d_min = 0, d_avg = 357.291, d_max = 825, k_max = 765
[pmc: bounds updated - thread 15]  time = 0.015605 sec, |V| = 1877 (12 / 1889), |E| = 337403, w = 599, p = 0.18921, d_min = 0, d_avg = 357.291, d_max = 825, k_max = 765
*** [pmc: thread 7]   current max clique = 600,  time = 0.112562 sec
*** [pmc: thread 8]   current max clique = 602,  time = 0.113235 sec
*** [pmc: thread 2]   current max clique = 604,  time = 0.114301 sec
*** [pmc: thread 11]   current max clique = 605,  time = 0.11463 sec
*** [pmc: thread 12]   current max clique = 606,  time = 0.115501 sec
*** [pmc: thread 16]   current max clique = 609,  time = 0.116792 sec
*** [pmc: thread 13]   current max clique = 612,  time = 0.122737 sec
*** [pmc: thread 2]   current max clique = 613,  time = 0.225753 sec
*** [pmc: thread 8]   current max clique = 617,  time = 0.225827 sec
[pmc: bounds updated - thread 16]  time = 0.228664 sec, |V| = 1875 (14 / 1889), |E| = 337403, w = 617, p = 0.18921, d_min = 0, d_avg = 357.291, d_max = 825, k_max = 765
*** [pmc: thread 12]   current max clique = 618,  time = 0.336066 sec
*** [pmc: thread 16]   current max clique = 619,  time = 0.436527 sec
-----------------------------------------------------------------------
free(): invalid size
Aborted (core dumped)

Could anyone help me to find what is wrong? Thank you so much!

Random Segmentation Fault when solver_params.estimate_scaling = False

HI, thanks for the amazing paper and software.

I am using the python binding of teaserpp_python.RobustRegistrationSolver, but get Segmentation fault (core dumped) sometimes when I set solver_params.estimate_scaling = False and the shape of src and dst mismatches. The following code can produce the error and it may or may not throw the error at different runs.

import numpy as np
import teaserpp_python

# Generate random data points
src = np.random.rand(3, 20)

# Apply arbitrary scale, translation and rotation
scale = 1.0
translation = np.array([[1], [0], [-1]])
rotation = np.array([[0.98370992, 0.17903344, -0.01618098],
                     [-0.04165862, 0.13947877, -0.98934839],
                     [-0.17486954, 0.9739059, 0.14466493]])
dst = scale * np.matmul(rotation, src) + translation
dst = np.concatenate([dst, 2.0*np.random.rand(3, 20)], axis=1)

# Add two outliers
dst[:, 1] += 10
dst[:, 9] += 15

print(src.shape, src.dtype)
print(dst.shape, dst.dtype)

# Populate the parameters
solver_params = teaserpp_python.RobustRegistrationSolver.Params()
solver_params.cbar2 = 1
solver_params.noise_bound = 0.01
solver_params.estimate_scaling = False
solver_params.rotation_estimation_algorithm = (
    teaserpp_python.RobustRegistrationSolver.ROTATION_ESTIMATION_ALGORITHM.GNC_TLS
)
solver_params.rotation_gnc_factor = 1.4
solver_params.rotation_max_iterations = 100
solver_params.rotation_cost_threshold = 1e-12
print("TEASER++ Parameters are:", solver_params)
teaserpp_solver = teaserpp_python.RobustRegistrationSolver(solver_params)

solver = teaserpp_python.RobustRegistrationSolver(solver_params)
solver.solve(src, dst)

solution = solver.getSolution()

# Print the solution
print("Solution is:", solution)

This issue disappears if solver_params.estimate_scaling = True but in rare cases it throws MemoryError: std::bad_alloc. I am already using OMP_NUM_THREADS=12.

Could you please look into this case and see why this happens? I am using Ubuntu 18.04 with Python 3.6.10.

Input and output in different sizes

Hi.
When I use TEASER for unmatched src and dst with shapes (3, 7850) and (3, 14571) respectively, I get no out put from the solver.getSolution() just this :
< Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)>
Also, in the paper you present experiments where you tell the algorithm to match everything with everything and show it can still give good results because it is very robust to wrong correspondences. So, how is that ? What is my problem ??

python/README.md bugs

  1. Small typo in target name:
make teaserpp-python -j4

Should be

make teaserpp_python -j4
  1. Segfault when running the example in python/README.md
TEASER++ Parameters are: <Params with noise_bound=0.01
cbar2=1
estimate_sccaling=0
rotation_estimation_algorithm=GNC-TLS
>
[pmc heuristic]	 mc = 0
Created adjacency matrix in 3.8147e-06 seconds
[pmc: initial k-core pruning]  before pruning: |V| = 20, |E| = 0
[pmc: initial k-core pruning]  after pruning:  |V| = 20, |E| = 0
[pmc]  initial pruning took 1.69277e-05 sec
[pmc: sorting neighbors]  |E| = 0, |E_sorted| = 0
|V| = 20
*** [pmc: thread 1]   current max clique = 1,  time = 0.00155807 sec>>> [pmc: thread 
[pmc: upper bound reached]  omega = 1
[pmc: bounds updated - thread 15]  time = 0.00159502 sec, |V| = 10 (10 / 20), |E| = 0, w = 1, p = 0, d_min = 0, d_avg = 0, d_max = 0, k_max = 0
[pmc: bounds updated - thread 13]  time = 0.00281596 sec, |V| = 9 (11 / 20), |E| = 0, w = 1, p = 0, d_min = 0, d_avg = 0, d_max = 0, k_max = 0
16]
[pmc: bounds updated - thread 16]  time = 0.0031271 sec, |V| = 16 (4 / 20), |E| = 0, w = 1, p = 0, d_min = 0, d_avg = 0, d_max = 0, k_max = 0
[pmc: bounds updated - thread 14]  time = 0.00323701 sec, |V| = 12 (8 / 20), |E| = 0, w = 1, p = 0, d_min = 0, d_avg = 0, d_max = 0, k_max = 0
-----------------------------------------------------------------------
[1]    32144 segmentation fault (core dumped)  python teaserpp_example2.py

  1. Small bug when running teaserpp_example.py:
Scale outliers (TIM pairs) are:
Note: they should include the outlier points.
Traceback (most recent call last):
  File "teaserpp_example.py", line 51, in <module>
    for i in range(scale_inliers.shape[0]):
AttributeError: 'list' object has no attribute 'shape'

question for RGBD

Hi,
so from some time I have been trying to run your Teaser++. I put RGBD dataset obained by Kinect2 into Teaser++, unfortunately with teaser_python_fpfh_icp, i cannot get the registration results as shown in your paper.
first, how to use color informaiton, as can be seen. In your paper, the registration results of RGBD dataset is very perfect.
second, can you give me the code or tell me the detailed steps to use teaser_python_fpfh_icp to do pefect registration with RGBD dataset.

I am using:
Ubuntu 18.04
Kinect 2 camera

thank you very much

How to not print "Starting scale solver..."

Have you read the documentation?

  • Yes
  • No - then this issue will be closed.

Hello, I tried the python sample code in "Quick start". How can it not display the prompt message in the figure below? I haven't found the set parameters. Thanks in advance.

2345截图20201002215130

Question about lidar odometry application and bad alloc.

Hey,

so from some time I have been trying to run your Teaser as a Lidar Odometry module for comparison for my research. One Teaser Lidar Odometry approach is in a point-to-point manner - I have 3D correspondences and then I put it into Teaser; the other is feature-based approach - I calculate FPFH features and then I put this into Teaser.
I use Kitti dataset and I noticed that when I try to find the transformation from frame to frame if I don't downsample the point cloud I always get bad alloc error (one point cloud has ~120k points), If I do voxel downsampling then either I get the result but I have to wait a very long time - more than 2-3 seconds (in feature-based even more) or I could downsample even more then I have processing frame around 1 second but the results are very not correct. So I am curious about the following things:

  1. is it possible to integrate somehow Teaser in Lidar Odometry manner, have you tried that one?
  2. this bad alloc is due to Eigen, is it possible that the problem is so big/large that my pc doesn't have enough memory to solve the frame to frame transformation problem?

terminate called after throwing an instance of 'std::bad_alloc'

Hi:
when use the PCL example data, I get the error terminate called after throwing an instance of 'std::bad_alloc, what(): std::bad_alloc.
But everything is OK for registration_test/1000point_model.ply。
my code is

  std::string file_one = "../data/pcd/room_scan1.pcd";
  std::string file_two = "../data/pcd/room_scan2.pcd";

  pcl::PointCloud<pcl::PointXYZ>::Ptr target_cloud(new pcl::PointCloud<pcl::PointXYZ>);
  if (pcl::io::loadPCDFile<pcl::PointXYZ>(file_one, *target_cloud) == -1) {
    PCL_ERROR ("Couldn't read file 1.pcd \n");
    return (-1);
  }
  Eigen::Matrix<double, 3, Eigen::Dynamic> src(3, target_cloud->size());
  for (size_t i = 0; i < target_cloud->size(); ++i) {
    src.col(i) << target_cloud->points[i].x, target_cloud->points[i].y, target_cloud->points[i].z;
  }
  // Loading second scan of room from new perspective.
  pcl::PointCloud<pcl::PointXYZ>::Ptr input_cloud(new pcl::PointCloud<pcl::PointXYZ>);
  if (pcl::io::loadPCDFile<pcl::PointXYZ>(file_two, *input_cloud) == -1) {
    PCL_ERROR ("Couldn't read 2.pcd \n");
    return (-1);
  }
  Eigen::Matrix<double, 3, Eigen::Dynamic> dst(3, input_cloud->size());
  for (size_t i = 0; i < input_cloud->size(); ++i) {
    dst.col(i) << input_cloud->points[i].x, input_cloud->points[i].y, input_cloud->points[i].z;
  }

  // Start the timer
  auto start = std::chrono::high_resolution_clock::now();
  teaser::RobustRegistrationSolver::Params params;
  params.cbar2 = 1;
  params.noise_bound = 0.01;
  params.estimate_scaling = false;
  params.rotation_estimation_algorithm = teaser::RobustRegistrationSolver::ROTATION_ESTIMATION_ALGORITHM::GNC_TLS;
  params.rotation_gnc_factor = 1.4;
  params.rotation_max_iterations = 100;
  params.rotation_cost_threshold = 1e-6;
  // Prepare the solver object
  teaser::RobustRegistrationSolver solver(params);
  // Solve
  solver.solve(src, dst);
  // Get solution
  auto solution = solver.getSolution();

  // Stop the timer
  auto stop = std::chrono::high_resolution_clock::now();
  auto duration = std::chrono::duration_cast<std::chrono::microseconds>(stop - start);
  std::cout << "Time spent: " << duration.count() << std::endl;

Correspondence Establishing

Hi,

Thanks for sharing your code!
I'm wondering about the role (or significance) of the putative correspondence that fed to the whole algorithm.
Why do we need to use a set of more reliable correspondences (e.g. computed by FPFH) instead of some heuristic (or naive) methods (e.g. nearest neighbor)?

I'm interested in the correspondence-free case you presented in Fig.1.(g). As the computation of FPFH consumes a considerable amount of computational resources which will probably hinder the real-time performance of the whole system.

Thx

Minimum Eigen version

Thank you very much for this terrific open-source project. It works quite well in my LiDAR SLAM project even with a 2% correspondence inlier rate.

I found that there are some operator overloading error when building with Eigen 3.2. However, the building passed with Eigen version >= 3.3. So maybe the min required Eigen version should be 3.3 instead of 3.2 in CMakeList.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.