Giter VIP home page Giter VIP logo

libpointmatcher's Introduction

banner

libpointmatcher is a modular library implementing the Iterative Closest Point (ICP) algorithm
for aligning point clouds. It has applications in robotics and computer vision.

The library is written in C++ for efficiency with bindings in Python.

GitHub Repo stars GitHub forks GitHub License GitHub release (with filter) Docker Image Version (latest semver)

Mentioned in Awesome LIDAR       Mentioned in Awesome Robotics Libraries       Mentioned in Awesome Robotics
            LIDAR                             Robotics                 Robotics Libraries


Supported OS And Architecture

libpointmatcher is tested on our build system under the following architecture and OS:

  • Ubuntu bionic (18.04), focal (20.04) and jammy (22.04)
  • x86 and arm64/v8

Note:

  • libpointmatcher reportedly works on MacOs OsX (latest) and Windows (latest)

★ Version >= 1.4.0 Release Note

This release of libpointmatcher introduces the integration of norlab-build-system (NBS) as a git submodule for codebase development and testing.

Execute the following to clone the repository with its submodule:

git clone --recurse-submodules https://github.com/norlab-ulaval/libpointmatcher.git

If libpointmatcher was previously cloned, execute the following to fetch its new submodule

git submodule update --remote --recursive --init

★ Contributing Instructions

See contributing_instructions.md for instructions related to bug reporting, code contribution and for setting up the libpointmatcher-build-system on your workstation to speed up your local development workflow.

Documentation and Tutorials

Quick link for the tutorial pages: Tutorials (also available on readthedocs.org but might not be up-to-date).

Those tutorials are written using Markdown syntax and stored in the project's /doc folder. Their scope ranges from introductory material on performing point cloud registration to instructions for the more experienced developer on how to extend the library's codebase.

Libpointmatcher's source code is fully documented based on doxygen to provide an easy API to developers. An example of this API can be found here, but it is suggested to use the one build for your version in doc/html.

libpointmatcher was orginaly developed by François Pomerleau and Stéphane Magnenat as part of our work at ASL-ETH. It is now maintained by the Northern Robotics Laboratory (Norlab), led by François Pomerleau.

You can read the latest changes in the release notes.

Quick Start

Although we suggest to use the tutorials, here is a quick version of it:

The library has a light dependency list:

  • Eigen version 3, a modern C++ matrix and linear-algebra library,
  • boost version 1.48 and up, portable C++ source libraries,
  • libnabo version 1.0.7, a fast K Nearest Neighbour library for low-dimensional spaces,

and was compiled on:

Docker images

Run the following commands to pull and run libpointmatcher in a docker container

docker pull norlabulaval/libpointmatcher:latest-ubuntu-focal

docker run -it --rm norlabulaval/libpointmatcher:latest-ubuntu-focal

See available libpointmatcher image tags on dockerhub.

To install docker related dependencies on ubuntu, execute the following

cd ./build_system/lpm_utility_script

# Execute docker tools install script i.e. docker daemon, docker compose, docker buildx
bash lpm_install_docker_tools.bash

Compilation & Installation

For beginner users unfamiliar with compiling and installing a library in Linux, go here for detailed instructions on compiling libpointmatcher from the source code.

For conveniences, you can use the provided installer script for ubuntu

bash libpointmatcher_dependencies_installer.bash

# Use the --help flag to see the list of optional flag
bash libpointmatcher_installer.bash [<optional flag>]

If you are comfortable with Linux and CMake and have already installed the prerequisites above, the following commands should install libpointmatcher on your system.

mkdir build && cd build
cmake ..
make
sudo make install

Testing

Libpointmatcher ships with a version of the Google testing framework GTest. Unit tests are located in the utest/ directory and are compiled with libpointmatcher (CMake variable BUILD_TESTS must be set to TRUE before compiling). To run the tests and make sure that your compiled version is working correctly, run the test executable in your build directory:

cd build
utest/utest --path ../examples/data/

Linking to external projects.

We mainly develop for cmake projects and we provide example files under examples/demo_cmake/ to help you in your own project. We also provide a QT Creator example in examples/demo_QT/, which manually lists all the dependencies in the file demo.pro. You would need to ajust those paths to point at the appropriate locations on your system. For a more detailed procedure, check the Linking Projects to libpointmatcher section.

File formats

The library support different file formats for importing or exporting data:

  • csv (Comma Separated Values)
  • vtk (Visualization Toolkit Files)
  • ply (Polygon File Format)
  • pcd (Point Cloud Library Format)

Those functionnalities are available without increasing the list of dependencies at the expense of limited functionality support. For more details, see the tutorial Importing and Exporting Point Clouds. Example executables using those file formats from the command line can be found in the /examples directory and are described here in more detail.


Citing

If you use libpointmatcher in an academic context, please cite the following publication:

@article{Pomerleau12comp,
	author = {Pomerleau, Fran{\c c}ois and Colas, Francis and Siegwart, Roland and Magnenat, St{\'e}phane},
	title = {{Comparing ICP Variants on Real-World Data Sets}},
	journal = {Autonomous Robots},
	year = {2013},
	volume = {34},
	number = {3},
	pages = {133--148},
	month = feb
}

and/or

@INPROCEEDINGS{pomerleau11tracking,
	author = {Fran{\c c}ois Pomerleau and St{\'e}phane Magnenat and Francis Colas and Ming Liu and Roland Siegwart},
	title = {Tracking a Depth Camera: Parameter Exploration for Fast ICP},
	booktitle = {Proc. of the IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
	publisher = {IEEE Press},
	pages = {3824--3829},
	year = {2011}
}

Extra Reading

If you are interested in learning more about different registration algorithms, we recently put together a literature review surveying multiple solutions. The review is organized in the same way as the library and many examples are provided based on real deployments.

F. Pomerleau, F. Colas and R. Siegwart (2015), "A Review of Point Cloud Registration Algorithms for Mobile Robotics", Foundations and Trends® in Robotics: Vol. 4: No. 1, pp 1-104. https://doi.org/10.1561/2300000035

If you don't have access to the journal, you can download it from here.

More Point Clouds

We also produced those freely available data sets to test different registration solutions:

Challenging data sets for point cloud registration algorithms

alt tag

You can download the files in CSV or VTK formats, which are directly supported by the library I/O module.

Projects and Partners

If you are using libpointmatcher in your project and you would like to have it listed here, please contact François Pomerleau.

For a larger list of work realized with libpointmatcher, please see the page Applications And Publications.

License

libpointmatcher is released under a permissive BSD license. Enjoy!


alt tag

libpointmatcher's People

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  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

libpointmatcher's Issues

Compile Error

Hi François and Stéphane,
I would like to try libpointmatcher but fail to compile it.
I use Ubuntu 11.10 and gcc version 4.6.1.
Thanks for your help!
Here's the error:

cforster@CFoW520:~/workspace/libpointmatcher/build$ cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo ${SRC_DIR}
-- The C compiler identification is GNU

-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found Doxygen: /usr/bin/doxygen
-- Found DOXYFILE_IN: /home/cforster/workspace/libpointmatcher/Doxyfile.in
-- Boost version: 1.46.1
-- Found the following Boost libraries:
-- thread
-- filesystem
-- system
-- program_options
-- date_time
-- Looking for _POSIX_TIMERS
-- Looking for _POSIX_TIMERS - found
-- Configuring done
-- Generating done
-- Build files have been written to: /home/cforster/workspace/libpointmatcher/build
cforster@CFoW520:~/workspace/libpointmatcher/build$ make
Scanning dependencies of target doxygen
[ 0%] Writing documentation to /home/cforster/workspace/libpointmatcher/build/doc...
/home/cforster/workspace/libpointmatcher/pointmatcher/PointMatcher.h:521: warning: Member compute(const DataPoints &filteredReading, const DataPoints &filteredReference, const Matches &input) (function) of class PointMatcher::OutlierFilters is not documented.
[ 2%] Built target doxygen
Scanning dependencies of target doc
[ 2%] Built target doc
Scanning dependencies of target pointmatcher
[ 5%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Logger.cpp.o
[ 8%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/DataPoints.cpp.o
[ 10%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Matches.cpp.o
[ 13%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/ICP.cpp.o
[ 16%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Registry.cpp.o
[ 18%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/DataPointsFilter.cpp.o
[ 21%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Matcher.cpp.o
[ 24%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/OutlierFilter.cpp.o
[ 27%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/ErrorMinimizer.cpp.o
[ 29%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Transformation.cpp.o
[ 32%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/TransformationChecker.cpp.o
[ 35%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Inspector.cpp.o
[ 37%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/IO.cpp.o
[ 40%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Bibliography.cpp.o
[ 43%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Timer.cpp.o
[ 45%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Histogram.cpp.o
[ 48%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Parametrizable.cpp.o
[ 51%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/LoggerImpl.cpp.o
[ 54%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/DataPointsFiltersImpl.cpp.o
[ 56%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/MatchersImpl.cpp.o
/home/cforster/workspace/libpointmatcher/pointmatcher/MatchersImpl.cpp: In member function ‘typename PointMatcher::Matches MatchersImpl::KDTreeVarDistMatcher::findClosests(const DataPoints&) [with T = float, typename PointMatcher::Matches = PointMatcher::Matches, MatchersImpl::DataPoints = PointMatcher::DataPoints]’:
/home/cforster/workspace/libpointmatcher/pointmatcher/MatchersImpl.cpp:148:38: instantiated from here
/home/cforster/workspace/libpointmatcher/pointmatcher/MatchersImpl.cpp:143:2: error: no matching function for call to ‘Nabo::NearestNeighbourSearch::knn(const Matrix&, PointMatcher::Matches::Ids&, PointMatcher::Matches::Dists&, Eigen::DenseBase<Eigen::Block<const Eigen::Matrix<float, -0x00000000000000001, -0x00000000000000001>, -0x00000000000000001, -0x00000000000000001, false, true> >::ConstTransposeReturnType, const int&, const float&, Nabo::NearestNeighbourSearch::SearchOptionFlags)’
/home/cforster/workspace/libpointmatcher/pointmatcher/MatchersImpl.cpp:143:2: note: candidates are:
/usr/local/include/nabo/nabo.h:291:17: note: long unsigned int Nabo::NearestNeighbourSearch::knn(const Vector&, Nabo::NearestNeighbourSearch::IndexVector&, Nabo::NearestNeighbourSearch::Vector&, Nabo::NearestNeighbourSearch::Index, T, unsigned int, T) const [with T = float, Nabo::NearestNeighbourSearch::Vector = Eigen::Matrix<float, -0x00000000000000001, 1>, Nabo::NearestNeighbourSearch::IndexVector = Eigen::Matrix<int, -0x00000000000000001, 1>, Nabo::NearestNeighbourSearch::Index = int]
/usr/local/include/nabo/nabo.h:291:17: note: no known conversion for argument 2 from ‘PointMatcher::Matches::Ids {aka Eigen::Matrix<int, -0x00000000000000001, -0x00000000000000001>}’ to ‘Nabo::NearestNeighbourSearch::IndexVector& {aka Eigen::Matrix<int, -0x00000000000000001, 1>&}’
/usr/local/include/nabo/nabo.h:304:25: note: long unsigned int Nabo::NearestNeighbourSearch::knn(const Matrix&, Nabo::NearestNeighbourSearch::IndexMatrix&, Nabo::NearestNeighbourSearch::Matrix&, Nabo::NearestNeighbourSearch::Index, T, unsigned int, T) const [with T = float, Nabo::NearestNeighbourSearch::Matrix = Eigen::Matrix<float, -0x00000000000000001, -0x00000000000000001>, Nabo::NearestNeighbourSearch::IndexMatrix = Eigen::Matrix<int, -0x00000000000000001, -0x00000000000000001>, Nabo::NearestNeighbourSearch::Index = int]
/usr/local/include/nabo/nabo.h:304:25: note: no known conversion for argument 4 from ‘Eigen::DenseBase<Eigen::Block<const Eigen::Matrix<float, -0x00000000000000001, -0x00000000000000001>, -0x00000000000000001, -0x00000000000000001, false, true> >::ConstTransposeReturnType {aka const Eigen::Transpose<const Eigen::Block<const Eigen::Matrix<float, -0x00000000000000001, -0x00000000000000001>, -0x00000000000000001, -0x00000000000000001, false, true> >}’ to ‘int’
/home/cforster/workspace/libpointmatcher/pointmatcher/MatchersImpl.cpp: In member function ‘typename PointMatcher::Matches MatchersImpl::KDTreeVarDistMatcher::findClosests(const DataPoints&) [with T = double, typename PointMatcher::Matches = PointMatcher::Matches, MatchersImpl::DataPoints = PointMatcher::DataPoints]’:
/home/cforster/workspace/libpointmatcher/pointmatcher/MatchersImpl.cpp:149:39: instantiated from here
/home/cforster/workspace/libpointmatcher/pointmatcher/MatchersImpl.cpp:143:2: error: no matching function for call to ‘Nabo::NearestNeighbourSearch::knn(const Matrix&, PointMatcher::Matches::Ids&, PointMatcher::Matches::Dists&, Eigen::DenseBase<Eigen::Block<const Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001>, -0x00000000000000001, -0x00000000000000001, false, true> >::ConstTransposeReturnType, const int&, const double&, Nabo::NearestNeighbourSearch::SearchOptionFlags)’
/home/cforster/workspace/libpointmatcher/pointmatcher/MatchersImpl.cpp:143:2: note: candidates are:
/usr/local/include/nabo/nabo.h:291:17: note: long unsigned int Nabo::NearestNeighbourSearch::knn(const Vector&, Nabo::NearestNeighbourSearch::IndexVector&, Nabo::NearestNeighbourSearch::Vector&, Nabo::NearestNeighbourSearch::Index, T, unsigned int, T) const [with T = double, Nabo::NearestNeighbourSearch::Vector = Eigen::Matrix<double, -0x00000000000000001, 1>, Nabo::NearestNeighbourSearch::IndexVector = Eigen::Matrix<int, -0x00000000000000001, 1>, Nabo::NearestNeighbourSearch::Index = int]
/usr/local/include/nabo/nabo.h:291:17: note: no known conversion for argument 2 from ‘PointMatcher::Matches::Ids {aka Eigen::Matrix<int, -0x00000000000000001, -0x00000000000000001>}’ to ‘Nabo::NearestNeighbourSearch::IndexVector& {aka Eigen::Matrix<int, -0x00000000000000001, 1>&}’
/usr/local/include/nabo/nabo.h:304:25: note: long unsigned int Nabo::NearestNeighbourSearch::knn(const Matrix&, Nabo::NearestNeighbourSearch::IndexMatrix&, Nabo::NearestNeighbourSearch::Matrix&, Nabo::NearestNeighbourSearch::Index, T, unsigned int, T) const [with T = double, Nabo::NearestNeighbourSearch::Matrix = Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001>, Nabo::NearestNeighbourSearch::IndexMatrix = Eigen::Matrix<int, -0x00000000000000001, -0x00000000000000001>, Nabo::NearestNeighbourSearch::Index = int]
/usr/local/include/nabo/nabo.h:304:25: note: no known conversion for argument 4 from ‘Eigen::DenseBase<Eigen::Block<const Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001>, -0x00000000000000001, -0x00000000000000001, false, true> >::ConstTransposeReturnType {aka const Eigen::Transpose<const Eigen::Block<const Eigen::Matrix<double, -0x00000000000000001, -0x00000000000000001>, -0x00000000000000001, -0x00000000000000001, false, true> >}’ to ‘int’
make[2]: *** [CMakeFiles/pointmatcher.dir/pointmatcher/MatchersImpl.cpp.o] Error 1
make[1]: *** [CMakeFiles/pointmatcher.dir/all] Error 2
make: *** [all] Error 2

RigidTransformation: Error, rotation matrix is not orthogonal.

Hey so I keep getting this error randomly showing up, in my icp runs.
"RigidTransformation: Error, rotation matrix is not orthogonal."
I don't really understand why it would be throwing this error, or how to solve it.

For example, here is two point clouds that have caused this error.

screen shot 2014-07-01 at 3 20 35 am
a gist of it can be found here: https://gist.github.com/jahead/cb5b3add89fc1815452a
and my icp setup is this.

    icp.transformations.clear();
    icp.readingDataPointsFilters.clear();
    icp.readingStepDataPointsFilters.clear();
    icp.referenceDataPointsFilters.clear();
    icp.matcher.reset();
    icp.outlierFilters.clear();
    icp.errorMinimizer.reset();
    icp.transformationCheckers.clear();
    icp.inspector.reset();

    icp.transformations.push_back(new typename TransformationsImpl<float>::RigidTransformation());    

icp.readingDataPointsFilters.push_back(new typename DataPointsFiltersImpl<float>::RemoveNaNDataPointsFilter());
    icp.readingDataPointsFilters.push_back(pointMatcher::get().DataPointsFilterRegistrar.create(
                                                                                                "MaxPointCountDataPointsFilter",
                                                                                                PointMatcherSupport::map_list_of
                                                                                                ("prob",PointMatcherSupport::toParam(1))
                                                                                                ("maxCount", PointMatcherSupport::toParam(100))
                                                                                                )
                                           );
    icp.referenceDataPointsFilters.push_back(new typename DataPointsFiltersImpl<float>::RemoveNaNDataPointsFilter());
    icp.referenceDataPointsFilters.push_back(pointMatcher::get().DataPointsFilterRegistrar.create(
                                                                                                  "MaxPointCountDataPointsFilter",
                                                                                                  PointMatcherSupport::map_list_of
                                                                                                  ("prob",PointMatcherSupport::toParam(1))
                                                                                                  ("maxCount", PointMatcherSupport::toParam(100))
                                                                                                  )
                                             );

    icp.outlierFilters.push_back(pointMatcher::get().OutlierFilterRegistrar.create("MedianDistOutlierFilter",
                                                                                   PointMatcherSupport::map_list_of
                                                                                   ("factor",PointMatcherSupport::toParam(1.1))
                                                                                   ));
    icp.matcher.reset(new typename MatchersImpl<float>::KDTreeMatcher());
    icp.errorMinimizer.reset(new typename ErrorMinimizersImpl<float>::PointToPointErrorMinimizer());
    icp.transformationCheckers.push_back(pointMatcher::get().TransformationCheckerRegistrar.create(
                                                                                                   "CounterTransformationChecker",
                                                                                                   PointMatcherSupport::map_list_of
                                                                                                   ("maxIterationCount", PointMatcherSupport::toParam(100))
                                                                                                   )
                                         );

    icp.transformationCheckers.push_back(new typename TransformationCheckersImpl<float>::DifferentialTransformationChecker());

I also realise that there is a correctParameters function. But your ICP isn't using it once it detects the transformation error being thrown; it's just throwing an exception. It seems odd that the ICP can't do this correction on the fly. By just calling the correctParameters function when checkParameters returns false. Or maybe I'm looking at the problem wrong.

Oh and ps.
I don't load from yaml. Could this be a problem?
And I'm running the icp at high frequency as i'm trying converge two datasets from two different leap motions.

Oh and btw. I'm loving your library

Reserved descriptor size is not set properly when loading PLY files

Bug reported by ziparo:

#5  operator() (col=<optimized out>, row=<optimized out>, this=<optimized out>) at /home/algo/Libraries/libpointmatcher/pointmatcher/IO.cpp:1185
#6  PointMatcherIO<float>::loadPLY (is=...) at /home/algo/Libraries/libpointmatcher/pointmatcher/IO.cpp:1471
#7  0x00000000005463dc in PointMatcherIO<float>::loadPLY (fileName=...) at /home/algo/Libraries/libpointmatcher/pointmatcher/IO.cpp:1174
#8  0x000000000054662b in PointMatcher<float>::DataPoints::load (fileName=...) at /home/algo/Libraries/libpointmatcher/pointmatcher/IO.cpp:376
#9  0x00000000004af77f in main (argc=2, argv=0x7fffffffd898) at /home/algo/icp_test/src/main.cpp:131

The failing line:

descriptors(next_d_r+desc_offset,l-offset) = prop_val;

ld: duplicate symbol

received an error during compiling:

ld: duplicate symbol PointMatcher::TransformFeatures::description() in libpointmatcher.a(Transformations.cpp.o) and libpointmatcher.a(Core.cpp.o) for architecture x86_64
collect2: ld returned 1 exit status
make[2]: *** [align_sequence] Error 1
make[1]: *** [CMakeFiles/align_sequence.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
ld: duplicate symbol PointMatcher::IdentityDataPointsFilter::description() in libpointmatcher.a(DataPointsFilters.cpp.o) and libpointmatcher.a(Core.cpp.o) for architecture x86_64
collect2: ld returned 1 exit status
make[2]: *** [convertCSVtoVTK] Error 1
make[1]: *** [CMakeFiles/convertCSVtoVTK.dir/all] Error 2
make: *** [all] Error 2

Compilation problem

When compiling, I get the error:

libpointmatcher/pointmatcher/IO.cpp:347:53: error: 'filesystem3' is not a member of 'boost'

I am using boost 1.53 and gcc 4.7.0 on SuSE11 64 bit. Replacing filesystem3 with filesystem fixes the problem.

RemoveNaNDataPointsFilter crashes on Mac OS X...

I finally have libpointmatcher up and running and am able to do absolutely awesome alignments if I manually remove NANs, but when I allow NANs in my point clouds and enable the RemoveNaN filter, the software consistently crashes. Here is the exception message from the application log:

libc++abi.dylib: terminating with uncaught exception of type PointMatcher::ConvergenceError: no outlier to filter

libpointmatcherConfig.cmake has wrong paths

When installing libpointmatcher, the paths generated in this file, are the ones used during installation explicitly. This means that package managers, when creating the ros-indigo-libpointmatcher package will have hard-coded paths to temporary build paths instead of final installation paths.

Example:

# - Config file for the libpointmatcher package
# It defines the following variables
#  libpointmatcher_INCLUDE_DIRS - include directories for pointmatcher
#  libpointmatcher_LIBRARIES    - libraries to link against

# Compute paths
get_filename_component(POINTMATCHER_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
set(libpointmatcher_INCLUDE_DIRS "/home/v01d/pkgs/ros/arch-ros-stacks/indigo/libpointmatcher/src/libpointmatcher/contrib/yaml-cpp-pm/include;/home/v01d/pkgs/ros/arch-ros-stacks/indigo/libpointmatcher/src/libpointmatcher;/usr/include/eigen3;/opt/ros/indigo/include;/usr/include")

set(libpointmatcher_LIBRARIES "/home/v01d/pkgs/ros/arch-ros-stacks/indigo/libpointmatcher/src/build//libpointmatcher.so;/opt/ros/indigo/lib/libnabo.a;/usr/lib64/libboost_thread.so;/usr/lib64/libboost_filesystem.so;/usr/lib64/libboost_system.so;/usr/lib64/libboost_program_options.so;/usr/lib64/libboost_date_time.so;/usr/lib64/libboost_chrono.so;rt")

# This causes catkin simple to link against these libraries
set(libpointmatcher_FOUND_CATKIN_PROJECT true)

Update to newer yaml-cpp API

Yaml-cpp has a new API since version 0.5. Newer versions of Ubuntu now use yaml-cpp0.5 by default so libpointmatcher should be updated to use the new API.

Reference data points filter application

Hey François!

While browsing the code, I noticed that the reference data points are never filtered when the ICPSequence member functions are used. Is this by intention or have I overseen something?

Thank you.
Regards, Remo

Linking libpointmatcher.a to a Qt project...

This is related to issue #61, but I created a new issue because I wanted to include a specific Qt project that I'm trying to link to the static library. For those not familiar with Qt, you need two files to create a project. The first is the project file which ends in .pro. Think of this as an alternative to a CMAKE file:

QT       += core gui widgets
TARGET    = LAUPointMatcher
TEMPLATE  = app
SOURCES  += main.cpp
INCLUDEPATH += /Users/dllau/Libraries/libpointmatcher/pointmatcher \
               /usr/local/include/eigen3/ \
               /usr/local/include/
LIBS     += -L/usr/local/lib/ -lboost_thread-mt -lboost_filesystem-mt \
               -lboost_system-mt -lboost_program_options-mt \
               -lboost_date_time-mt -lboost_chrono-mt \
            /Users/dllau/Libraries/libpointmatcher/build/libpointmatcher.a

Now we need a main.cpp file to hold our code. So here is what I have for that:

#include <QApplication>
#include <QWidget>
#include "PointMatcher.h"

class LAUPointMatcherWidget : public QWidget
{
    Q_OBJECT

public:
    LAUPointMatcherWidget(QWidget *parent = 0) : QWidget(parent) { ; }
    ~LAUPointMatcherWidget() { ; }

private:
    PointMatcher<float>::DataPoints::Label label;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    LAUPointMatcherWidget w;
    w.show();

    return a.exec();
}

I'd be forever indebted to anyone can get this to compile and link and run on a Mac OS X system running OS 10.10 Yosemite.

Review text on SamplingSurfaceNormal

Talk about density of points instead of surface complexity.

"Because the ceiling is essentially a large plane, the sampling is low and the normal vector arrows are dispersed relatively equally as shown in the first figure. On the other hand, the ground section has a more complex structure with adjacent normal vectors pointing in different direction. This results in a dense sampling of points which is seen in the second figure."

Fine-grained control of inspector module

ICP being an iterative algorithm, I think it can be very important for the user (and developer) to see how it performs on given data set. For example, to fine-tune the stopping criteria, the user may want to know the iteration info, that is, how the error is decreasing (does the error decrease only for 10 iterations, and for the next 90 just some wiggles happen, so 10 iterations are enough?).

libpointmatcher provides for that the Inspector module. However, this module dumps everything, including all point clouds at every single iteration, which can be huge. That is good for debugging, but the user may want to control what info to dump, for performance reasons.

I implemented this fine-level control of Inspector in my own copy of libpointmatcher, in a way that should be easy to merge should you desire that. I needed this for my alignment tool which uses libpointmatcher.

And by the way, I fixed a bug with the name of the columns in the iteration info file, the translation and rotation column names were reversed, here's the fix: oleg-alexandrov@54c9da8

And here's the entire set of fixes: #22

Adding time to libpointmatcher

I intend to add time support in libpointmatcher very soon. Here is the current plan:

  1. Add a third matrix hosting all time related information (the 2 other matrices being features and descriptors). It would be independent of the templated version forcing a 64-bits integer:

    #include <cstdint>
    Eigen::Matrix< std::uint64_t, Eigen::Dynamic, Eigen::Dynamic> times;
    
  2. Add Labels to tag different rows of the time matrix.

  3. Add all current methods for features or descriptors:

    void allocateTime(const std::string& name, const unsigned dim);
    void allocateTimes(const Labels& newLabels);
    void addTime(const std::string& name, const Matrix& newDescriptor);
    void removeTime(const std::string& name);
    Matrix getTimeCopyByName(const std::string& name) const;
    ConstView getTimeViewByName(const std::string& name) const;
    View getTimeViewByName(const std::string& name);
    ConstView getTimeRowViewByName(const std::string& name, const unsigned row) const;
    View getTimeRowViewByName(const std::string& name, const unsigned row);
    bool timeExists(const std::string& name) const;
    bool timeExists(const std::string& name, const unsigned dim) const;
    unsigned getTimeDimension(const std::string& name) const;
    unsigned getTimeStartingRow(const std::string& name) const;
    void assertTimeConsistency() const;

Doing so doesn't change the current API. This allows also more flexibility to store different time sources, time priorities, time corrections, etc.

CMake config files are installed incorrectly

CMake config files are now valid (ad #27), but they need to be installed into the cmake (lowercase) directory instead of CMake, i. e.

/usr/local/lib/cmake/pointmatcher

in order to be recognized by CMake.

cmake error when building libpointmatcher

[ 40%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/InspectorsImpl.cpp.o
make[2]: *** No rule to make target contrib/yaml-cpp-pm/libyaml-cpp-pm.a', needed bylibpointmatcher.so.1.2.1'. Stop.
make[1]: *** [CMakeFiles/pointmatcher.dir/all] Error 2
make: *** [all] Error 2

Use of C++-11 in libpointmatcher

This is not a real issue in fact, as I guess it was a development choice. I really got to love libpointmatcher, it does what I need and does it well. Much better than PCL, and the license is permissive.

However I can't use it in our project, NASA Ames Stereo Pipeline, as libpointmatcher is using bleeding edge C++-11 features and our tool is expected to support platforms/compilers which are 5 years old or so.

I've seen in particular you folks rely very heavily on auto iterators, so probably rewriting your code to support older compilers would be a major undertaking. I wish it were so however.

Usage of libpointmatcher at NASA Ames and notes on large memory datasets

Hi Francois and Stephane,

I've mentioned earlier that in my group at NASA Ames we use libpointmatcher for aligning 3D terrains on Earth, Moon, and in the future Mars. Since this is not an application you probably had in mind when you wrote the software, I thought I'd describe a bit how we use it and also mention how it scales for large data, and how I tweaked it to scale better.

First, a bit of background. The larger project I work on is Ames Stereo Pipeline (http://ti.arc.nasa.gov/tech/asr/intelligent-robotics/ngt/stereo/, https://github.com/NeoGeographyToolkit/StereoPipeline; the alignment tool using libpointmatcher is at https://github.com/NeoGeographyToolkit/StereoPipeline/blob/master/src/asp/Tools/pc_align.cc).

This stereo software is used to do 3D terrain reconstruction from two views obtained by a satellite. Historically it was used for Mars and Moon, but recently it is being used also for Earth (although in full honesty it could work better on Earth, it handles well dead stuff, like rock and ice, but not so well vegetation, urban environments, clouds, and water).

Such 3D terrains are usually pretty accurate, but not always perfectly aligned, for example due to errors in camera position and orientation in space. Luckily one can use ground control points, which are a sparse accurate dataset of measurements, to align the 3D terrain obtained from stereo to ground truth. This even works on the Moon, where a spacecraft named LRO (https://en.wikipedia.org/wiki/Lunar_Reconnaissance_Orbiter) has an instrument named LOLA shooting laser pulses at the moon and getting accurate but sparse 3D measurements. libpointmatcher is being used for such dense from stereo to sparse and accurate 3D alignment.

libpointmatcher works awesomely well, with both translations and rotations (point-to-plane beats point-to-point ICP for rotations, but for small translations they work about the same).

Two applications we already use libpointmatcher for is studying the flow of ice in Greenland (the work is done at the University of Washington), and alignment of 3D terrain on Moon to LRO data mentioned above.

I made some tweaks to libpointmatcher to handle better large datasets. The alignment tool now uses 8 GB of RAM for a terrain with 100 million points (we'd wish we could handle terrains say 25 times as large). I'd like to describe the (rather simple optimizations I did.

  • Resampling is happening on the fly as data is being loaded form disk, a given point is either kept or tossed.
  • The libpointmatcher input.features datastructure is pre-allocated in advance, rather than using push-back into vectors and then copy.
  • All intermediate copies of data are removed.
  • Shift to the centroid of the reference data points is done in-place.
  • Normals are computed only for point-to-plane and the identity filter is used for point-to-point (I don't use the yaml file and the user does not get to choose the filter type, the software makes the choices).
  • Filtering is done in-place. For example, for SamplingSurfaceDataPointsFilter, the normals are just attached to existing datastructure rather than creating a new point cloud with normals. I implemented this only when resampling ratio is 1 (so no resampling) but it is easy to do even resampling in-place if necessary. Here's the diff of this change: oleg-alexandrov@747f8da

More work would need to be done to bring this code in-line with your style conventions and other filters would have to be modified likewise for consistency, but I hope this diff is enough to give an idea of what could be done if you'd ever decide to support larger datasets.

There's only one more optization which could be done, but it would be tricky and I won't do it. libpointmatcher could be templated by two data types, say PointMatcher<T, S>. T would be the working variables type, say double, and S would be the input data type, say float. This because having the input data in float format is enough most of the time (by doing a careful initial shift), while float is not enough for doing accurate calculations.

This was a long post. Thanks for reading. And thanks again for the great library.

Error in outlier rejection algorithm

I tried to align a point cloud to itself. The obvious solution should be the identity transformation. I am getting instead the error:

terminate called after throwing an instance of 'PointMatcher::ConvergenceError'
what(): no outlier to filter

It looks to me that a subroutine failed when it was told to remove outliers from an array of zeros. That is normal. However, the calling program should be able to handle this better, perhaps by catching the exception.

Here's how to reproduce this:

./examples/pmicp --config ./default.yaml ../examples/data/car_cloud400.csv ../examples/data/car_cloud400.csv

default.yaml:

readingDataPointsFilters:

  • RandomSamplingDataPointsFilter:
    prob: 0.5

referenceDataPointsFilters:

  • IdentityDataPointsFilter:

matcher:
KDTreeMatcher:
knn: 1
epsilon: 0

outlierFilters:

  • TrimmedDistOutlierFilter:
    ratio: 0.75

errorMinimizer:
PointToPointErrorMinimizer

transformationCheckers:

  • CounterTransformationChecker:
    maxIterationCount: 400
  • DifferentialTransformationChecker:
    minDiffRotErr: 0.0001
    minDiffTransErr: 0.001
    smoothLength: 4

inspector:
NullInspector

logger:
FileLogger

Covariance estimation not working for 2D point cloud

Hi,

I have tried that both PointToPointWithCovErrorMinimizer and PointToPlaneWithCovErrorMinimizer cannot return correct Covariance Matrix, PointToPlaneWithCovErrorMinimizer simply return all zero matrix (also 6x6 matrix means the dimension not right), PointToPointWithCovErrorMinimizer will give below error

pmicp: /usr/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h:114: Eigen::DenseCoeffsBase<Derived, 0>::CoeffReturnType Eigen::DenseCoeffsBase<Derived, 0>::operator()(Eigen::DenseCoeffsBase<Derived, 0>::Index, Eigen::DenseCoeffsBase<Derived, 0>::Index) const [with Derived = Eigen::Matrix<float, -1, -1>; Eigen::DenseCoeffsBase<Derived, 0>::CoeffReturnType = const float&; Eigen::DenseCoeffsBase<Derived, 0>::Index = long int]: Assertion `row >= 0 && row < rows() && col >= 0 && col < cols()' failed.

Thanks :)

CMake install cannot find pointmatcherConfig.cmake

The make install fails with the following error:

file INSTALL cannot find
"${SOURCE_DIR}/build/CMakeFiles/pointmatcherConfig.cmake".

Problem solved by copying file and then rerunning make install

cp ${SOURCE_DIR}/build/pointmatcherConfig.cmake ${SOURCE_DIR}/build/CMakeFiles/pointmatcherConfig.cmake

Installing using CMake generates invalid CMake config files

After installing libpointmatcher, pointmatcherConfig.cmake and pointmatcherConfigVersion.cmake are placed in

/usr/local/lib/CMake/FooBar

In order to be found by CMake's find_package(pointmatcher), they should be located in

/usr/local/lib/cmake/pointmatcher

Furthermore, in pointmatcherConfig.cmake, some of the paths point to the build location, for example:

/home/tufak/libpointmatcher/build/libpointmatcher.a

These should point to the install location instead:

/usr/local/lib/libpointmatcher.a

Only then the find_package command works after removing the build files.

The binary package should install examples as well

I've just installed libpointmatcher (both from Precise PPA and as a part of ethzasl_icp_mapping ROS stack). I'd want to make the tests from readme.md, but I've got no idea where the 'examples' folder is.

I've found one in /opt/ros/fuerte/stacks/ethzasl_icp_mapping/libpointmatcher/upstream_src/examples , but there's no file named 'pmicp'.

Compile the Source to install but might failed related to YAML

According the issue "installing via PPA crashed apt-get", I planned to compile from the sources. My system is Ubuntu 12.04 with ROS groovy.

  1. So I used git, "git clone git://github.com/ethz-asl/libpointmatcher.git" to get the recent sources.
  2. Did "cmake.."
    Shoudl I install "GTest" ? or just ignore it?

cmake ..
-- The C compiler identification is GNU
-- The CXX compiler identification is GNU
-- Check for working C compiler: /usr/bin/gcc
-- Check for working C compiler: /usr/bin/gcc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++
-- Check for working CXX compiler: /usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Found Doxygen: /usr/local/bin/doxygen
-- Found DOXYFILE_IN: /home/weiweikong/Downloads/libpointmatcher/Doxyfile.in
-- Boost version: 1.46.1
-- Found the following Boost libraries:
-- thread
-- filesystem
-- system
-- program_options
-- date_time
-- yaml-cpp found, text-based configuration enabled
-- Looking for _POSIX_TIMERS
-- Looking for _POSIX_TIMERS - found
-- Could NOT find GTest (missing: GTEST_LIBRARY GTEST_MAIN_LIBRARY)
Google test (gtest) not found - Skipping unit tests
-- Configuring done
-- Generating done
-- Build files have been written to:

  1. Did "make"
    There are some errors might related to " YAML". I am not quite sure of it. And what should I do with this errors?

Scanning dependencies of target doxygen
[ 2%] Writing documentation to /home/weiweikong/Downloads/libpointmatcher/build/doc...
Warning: Tag SYMBOL_CACHE_SIZE' at line 289 of file /home/weiweikong/Downloads/libpointmatcher/build/Doxyfile has become obsolete. To avoid this warning please remove this line from your configuration file or upgrade it using "doxygen -u" Warning: TagSHOW_DIRECTORIES' at line 473 of file /home/weiweikong/Downloads/libpointmatcher/build/Doxyfile has become obsolete.
To avoid this warning please remove this line from your configuration file or upgrade it using "doxygen -u"
Warning: Tag `HTML_ALIGN_MEMBERS' at line 799 of file /home/weiweikong/Downloads/libpointmatcher/build/Doxyfile has become obsolete.
To avoid this warning please remove this line from your configuration file or upgrade it using "doxygen -u"
Warning: doxygen no longer ships with the FreeSans font.
You may want to clear or change DOT_FONTNAME.
Otherwise you run the risk that the wrong font is being used for dot generated graphs.
This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian)
entering extended mode
(./_formulas.tex
LaTeX2e <2009/09/24>
Babel <v3.8l> and hyphenation patterns for english, usenglishmax, dumylang, noh
yphenation, loaded.

[ 2%] Built target doxygen
Scanning dependencies of target doc
[ 2%] Built target doc
Scanning dependencies of target pointmatcher
[ 5%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/Logger.cpp.o
In file included from /home/weiweikong/Downloads/libpointmatcher/pointmatcher/PointMatcher.h:58:0,
from /home/weiweikong/Downloads/libpointmatcher/pointmatcher/Logger.cpp:36:
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h: In member function ‘Interface* PointMatcherSupport::Registrar::createFromYAML(const YAML::Node&) const’:
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:176:19: error: ‘const class YAML::Node’ has no member named ‘to’
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:176:33: error: expected primary-expression before ‘>’ token
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:176:35: error: expected primary-expression before ‘)’ token
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:181:5: error: ‘Iterator’ is not a member of ‘YAML’
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:181:20: error: expected ‘;’ before ‘mapIt’
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:182:5: error: ‘mapIt’ was not declared in this scope
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:183:9: error: ‘Iterator’ is not a member of ‘YAML’
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:183:24: error: expected ‘;’ before ‘paramIt’
/home/weiweikong/Downloads/libpointmatcher/pointmatcher/Registrar.h:183:58: error: ‘paramIt’ was not declared in this scope
make[2]: *** [CMakeFiles/pointmatcher.dir/pointmatcher/Logger.cpp.o] Error 1
make[1]: *** [CMakeFiles/pointmatcher.dir/all] Error 2
make: *** [all] Error 2

  1. However, I download the libpointmatcher from http://freecode.com/projects/libpointmatcher.

I could successfully build it.

I will took part in the SSRR 2013 Rescue Camp, so I would like to test libpointmatcher before. However, I am not quite familiar with it, and tried different ways but still get the above erorrs.

Thanks!

Linking issue

I'am trying to compile my own software that uses libpointmatcher. However, when linking, I get the following error I couldn't solve in any way:

Linking CXX executable /home/simone/catkin_ws/devel/lib/dem_simulator/dem_simulator_test
/home/simone/libpointmatcher/build/libpointmatcher.so: undefined reference to `boost::filesystem::detail::initial_path(boost::system::error_code*)'
/home/simone/libpointmatcher/build/libpointmatcher.so: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)'
/home/simone/libpointmatcher/build/libpointmatcher.so: undefined reference to `boost::filesystem::path::extension() const'
/home/simone/libpointmatcher/build/libpointmatcher.so: undefined reference to `boost::filesystem::absolute(boost::filesystem::path const&, boost::filesystem::path const&)'
/home/simone/libpointmatcher/build/libpointmatcher.so: undefined reference to `boost::filesystem::path::parent_path() const'
/home/simone/libpointmatcher/build/libpointmatcher.so: undefined reference to `boost::filesystem::path::operator/=(boost::filesystem::path const&)'
collect2: error: ld returned 1 exit status

I am using the following CMakeLists.txt:

cmake_minimum_required (VERSION 2.8)
project(dem_simulator)

find_package(catkin_simple REQUIRED)
find_package(Boost COMPONENTS system filesystem REQUIRED)
find_package(libpointmatcher REQUIRED)

catkin_simple(ALL_DEPS_REQUIRED)

add_definitions(--std=c++11)

include_directories(${CMAKE_CURRENT_BINARY_DIR} ${Boost_INCLUDE_DIRS} ${libpointmatcher_INCLUDE_DIRS})

cs_add_library(${PROJECT_NAME} src/dem_simulator.cc)
cs_add_executable(dem_simulator_test src/main.cc)

target_link_libraries(dem_simulator_test ${PROJECT_NAME} ${catkin_LIBRARIES} ${libpointmatcher_LIBRARIES} ${Boost_LIBRARIES})

cs_install()
cs_export()

Could not compile in Xcode 6

Dear all,

I have compiled and intalled the libpointmatcher in my mac os machine successfully. However, I want to link to my current xcode projects and trying to compile the libpointmatcher project in xcode. I followed the instruction in advanced section but failed to compile the code in xcode. The errors are as follows:

image

May I know how to solve this issue?

Thank you very much.

Regards,
Jayden

yaml-cpp-pm isn't compiled anymore under some build conditions

I strongly suspect that this line

 get_property(yaml-cpp-pm_LIB TARGET yaml-cpp-pm PROPERTY LOCATION)

(a9b72eb323#diff-af3b638bc2a3e6c650974192a53c7291R190)

Isn't exactly what we want, because it resolves to a path and not to a target name. It seems not implicitly create a target dependency for pointmatcher anymore:

[ 37%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/TransformationCheckersImpl.cpp.o
[ 39%] Building CXX object CMakeFiles/pointmatcher.dir/pointmatcher/InspectorsImpl.cpp.o
make[2]: *** No rule to make target `contrib/yaml-cpp-pm/libyaml-cpp-pm.a', needed by `libpointmatcher.so.1.2.1'.  Stop.

(taken from http://jenkins.ros.org/job/prerelease-indigo-libpointmatcher/ARCH_PARAM=amd64,UBUNTU_PARAM=trusty,label=prerelease/1/console).

It can be reproduced with a make pointmatcher when yaml-cpp-pm has not been built or its output removed before. Apparently this is what is issued on jenkins.ros.org. (it works with make, because yaml-cpp-pm is within the default targets and before pointmatcher.

The simple solution before a9b72eb:

set (EXTERNAL_LIBS ${EXTERNAL_LIBS} yaml-cpp-pm )

would make cmake to let libpointmatcher depend on yaml-cpp-pm (in the sense of cmake's target dependencies), in combination with

target_link_libraries(pointmatcher ${EXTERNAL_LIBS})

(not changed with a9b72eb)

@pomerlef , what was the reason for this location property based solution?

One can fix it with adding an explicit dependency. E.g. :

add_dependencies(pointmatcher yaml-cpp-pm)

But this needs to come after the pointmatcher target's declaration. So maybe we should introduce another collecting variable for dependencies? E.g. POINTMATCHER_EXTRA_DEPS ?

cannot build from source on Ubuntu 12.04

I am unable to build libpointmatcher (master branch) from source.
I tried using the PPAs but for precise they conflict with the ROS version of yaml cpp.

I have Eigen and Boost installed.
Installed libNabo from source as well.(master branch)

There are linking errors:

Linking CXX executable align_sequence
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapBruteForceVector<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, float, unsigned int, float) const [clone ._omp_fn.5]':
kdtree_cpu.cpp:(.text+0xc93): undefined reference to `GOMP_loop_guided_start'
kdtree_cpu.cpp:(.text+0xd34): undefined reference to `GOMP_loop_guided_next'
kdtree_cpu.cpp:(.text+0xd4b): undefined reference to `GOMP_loop_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapBruteForceVector<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, int, float, unsigned int) const [clone ._omp_fn.4]':
kdtree_cpu.cpp:(.text+0x1013): undefined reference to `GOMP_loop_guided_start'
kdtree_cpu.cpp:(.text+0x10d4): undefined reference to `GOMP_loop_guided_next'
kdtree_cpu.cpp:(.text+0x10eb): undefined reference to `GOMP_loop_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapBruteForceVector<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, double, unsigned int, double) const [clone ._omp_fn.1]':
kdtree_cpu.cpp:(.text+0x13ac): undefined reference to `GOMP_loop_guided_start'
kdtree_cpu.cpp:(.text+0x144c): undefined reference to `GOMP_loop_guided_next'
kdtree_cpu.cpp:(.text+0x1463): undefined reference to `GOMP_loop_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapBruteForceVector<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, int, double, unsigned int) const [clone ._omp_fn.0]':
kdtree_cpu.cpp:(.text+0x172c): undefined reference to `GOMP_loop_guided_start'
kdtree_cpu.cpp:(.text+0x17ec): undefined reference to `GOMP_loop_guided_next'
kdtree_cpu.cpp:(.text+0x1803): undefined reference to `GOMP_loop_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapSTL<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, float, unsigned int, float) const [clone ._omp_fn.7]':
kdtree_cpu.cpp:(.text+0x1d1b): undefined reference to `GOMP_loop_guided_start'
kdtree_cpu.cpp:(.text+0x1dbc): undefined reference to `GOMP_loop_guided_next'
kdtree_cpu.cpp:(.text+0x1dd3): undefined reference to `GOMP_loop_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapSTL<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, int, float, unsigned int) const [clone ._omp_fn.6]':
kdtree_cpu.cpp:(.text+0x205b): undefined reference to `GOMP_loop_guided_start'
kdtree_cpu.cpp:(.text+0x211c): undefined reference to `GOMP_loop_guided_next'
kdtree_cpu.cpp:(.text+0x2133): undefined reference to `GOMP_loop_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapSTL<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, double, unsigned int, double) const [clone ._omp_fn.3]':
kdtree_cpu.cpp:(.text+0x23bc): undefined reference to `GOMP_loop_guided_start'
kdtree_cpu.cpp:(.text+0x245c): undefined reference to `GOMP_loop_guided_next'
kdtree_cpu.cpp:(.text+0x2473): undefined reference to `GOMP_loop_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapSTL<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, int, double, unsigned int) const [clone ._omp_fn.2]':
kdtree_cpu.cpp:(.text+0x26fc): undefined reference to `GOMP_loop_guided_start'
kdtree_cpu.cpp:(.text+0x27bc): undefined reference to `GOMP_loop_guided_next'
kdtree_cpu.cpp:(.text+0x27d3): undefined reference to `GOMP_loop_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapBruteForceVector<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, float, unsigned int, float) const':
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIfNS_25IndexHeapBruteForceVectorIifEEE3knnERKN5Eigen6MatrixIfLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_ifjf[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapBruteForceVector<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, float, unsigned int, float) const]+0x142): undefined reference to `GOMP_parallel_start'
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIfNS_25IndexHeapBruteForceVectorIifEEE3knnERKN5Eigen6MatrixIfLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_ifjf[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapBruteForceVector<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, float, unsigned int, float) const]+0x151): undefined reference to `GOMP_parallel_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapBruteForceVector<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, int, float, unsigned int) const':
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIfNS_25IndexHeapBruteForceVectorIifEEE3knnERKN5Eigen6MatrixIfLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_RKNS5_IfLin1ELi1ELi0ELin1ELi1EEEifj[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapBruteForceVector<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, int, float, unsigned int) const]+0x14a): undefined reference to `GOMP_parallel_start'
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIfNS_25IndexHeapBruteForceVectorIifEEE3knnERKN5Eigen6MatrixIfLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_RKNS5_IfLin1ELi1ELi0ELin1ELi1EEEifj[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapBruteForceVector<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, int, float, unsigned int) const]+0x159): undefined reference to `GOMP_parallel_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapBruteForceVector<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, double, unsigned int, double) const':
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIdNS_25IndexHeapBruteForceVectorIidEEE3knnERKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_idjd[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapBruteForceVector<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, double, unsigned int, double) const]+0x14e): undefined reference to `GOMP_parallel_start'
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIdNS_25IndexHeapBruteForceVectorIidEEE3knnERKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_idjd[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapBruteForceVector<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, double, unsigned int, double) const]+0x15d): undefined reference to `GOMP_parallel_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapBruteForceVector<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, int, double, unsigned int) const':
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIdNS_25IndexHeapBruteForceVectorIidEEE3knnERKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_RKNS5_IdLin1ELi1ELi0ELin1ELi1EEEidj[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapBruteForceVector<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, int, double, unsigned int) const]+0x14d): undefined reference to `GOMP_parallel_start'
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIdNS_25IndexHeapBruteForceVectorIidEEE3knnERKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_RKNS5_IdLin1ELi1ELi0ELin1ELi1EEEidj[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapBruteForceVector<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, int, double, unsigned int) const]+0x15c): undefined reference to `GOMP_parallel_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapSTL<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, float, unsigned int, float) const':
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIfNS_12IndexHeapSTLIifEEE3knnERKN5Eigen6MatrixIfLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_ifjf[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapSTL<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, float, unsigned int, float) const]+0x142): undefined reference to `GOMP_parallel_start'
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIfNS_12IndexHeapSTLIifEEE3knnERKN5Eigen6MatrixIfLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_ifjf[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapSTL<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, int, float, unsigned int, float) const]+0x151): undefined reference to `GOMP_parallel_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapSTL<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, int, float, unsigned int) const':
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIfNS_12IndexHeapSTLIifEEE3knnERKN5Eigen6MatrixIfLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_RKNS5_IfLin1ELi1ELi0ELin1ELi1EEEifj[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapSTL<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, int, float, unsigned int) const]+0x14a): undefined reference to `GOMP_parallel_start'
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIfNS_12IndexHeapSTLIifEEE3knnERKN5Eigen6MatrixIfLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_RKNS5_IfLin1ELi1ELi0ELin1ELi1EEEifj[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<float, Nabo::IndexHeapSTL<int, float> >::knn(Eigen::Matrix<float, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, -1, 0, -1, -1>&, Eigen::Matrix<float, -1, 1, 0, -1, 1> const&, int, float, unsigned int) const]+0x159): undefined reference to `GOMP_parallel_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapSTL<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, double, unsigned int, double) const':
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIdNS_12IndexHeapSTLIidEEE3knnERKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_idjd[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapSTL<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, double, unsigned int, double) const]+0x14e): undefined reference to `GOMP_parallel_start'
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIdNS_12IndexHeapSTLIidEEE3knnERKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_idjd[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapSTL<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, int, double, unsigned int, double) const]+0x15d): undefined reference to `GOMP_parallel_end'
/usr/local/lib/libnabo.a(kdtree_cpu.cpp.o): In function `Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapSTL<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, int, double, unsigned int) const':
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIdNS_12IndexHeapSTLIidEEE3knnERKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_RKNS5_IdLin1ELi1ELi0ELin1ELi1EEEidj[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapSTL<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, int, double, unsigned int) const]+0x14d): undefined reference to `GOMP_parallel_start'
kdtree_cpu.cpp:(.text._ZNK4Nabo48KDTreeUnbalancedPtInLeavesImplicitBoundsStackOptIdNS_12IndexHeapSTLIidEEE3knnERKN5Eigen6MatrixIdLin1ELin1ELi0ELin1ELin1EEERNS5_IiLin1ELin1ELi0ELin1ELin1EEERS6_RKNS5_IdLin1ELi1ELi0ELin1ELi1EEEidj[Nabo::KDTreeUnbalancedPtInLeavesImplicitBoundsStackOpt<double, Nabo::IndexHeapSTL<int, double> >::knn(Eigen::Matrix<double, -1, -1, 0, -1, -1> const&, Eigen::Matrix<int, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, -1, 0, -1, -1>&, Eigen::Matrix<double, -1, 1, 0, -1, 1> const&, int, double, unsigned int) const]+0x15c): undefined reference to `GOMP_parallel_end'
collect2: ld returned 1 exit status
make[2]: *** [examples/align_sequence] Error 1
make[1]: *** [examples/CMakeFiles/align_sequence.dir/all] Error 2
make: *** [all] Error 2

Please let me know if I am making a mistake.
Thank you for your time and help.

Split the unit test in multiple files

the file utest.cpp is getting too large. It should be broken in multiple functional files:
example:

  • ut_DataPoints.cpp
  • ut_IO.cpp
  • ut_Icp.cpp
  • ut_DataFilters.cpp
  • ut_Matchers.cpp
  • ut_Outliers.cpp
  • ut_ErrorMinimizers.cpp
  • ut_Transmations.cpp (checker and parameter)
  • ...

Problems with dynamic library on MacOS

When I compile the code inside of Xcode, which I created using CMake. Everything seems to work fine, but when I try to use the libpointmatcher.dylib in Qt using QMake, I get the following error:

Undefined symbols for architecture x86_64:
"PointMatcher::DataPoints::Label::Label(std::string const&, unsigned long)", referenced from:
LAUPointMatcherObject::LAUPointMatcherObject(LAUScan, LAUScan, QObject*) in laupointmatcherobject.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Is there something in the CMake set up that means I can't use libpointmatcher with any other build system?

Multithreading in libpointmatcher

This is again not an issue per se, but an opportunity to discuss something. Have you folks thought about making libpointmatcher multi-threaded? This could be something important perhaps, as serious machines nowadays have quite a bit of cores.

I tried some simple multi-threading using OpenMP with this commit, to speed up filtering: oleg-alexandrov@543cecc

It gave me about a 25% improvement in the overall ICP algorithm, but in my case the "reference" data is much denser than the "reading", otherwise the improvement should have been not as significant.

Overall ICP looks "parallelizable" to me, given that many of the computations done for each point are independent of each other. I did not check if the underlying libnabo would be thread-safe to be queried from multiple threads.

One thing which puzzled me was that I could not speed up the Eigen matrix operations in libpointmatcher after I turned on OpenMP, following the doc at http://eigen.tuxfamily.org/dox/TopicMultiThreading.html If you had any luck with multi-threaded Eigen I would be curious to know.

Compile failure in C++11 mode with g++-4.6

Hi guys,

Thanks for the great library. I've just started playing with it for point cloud matching of airborne lidar scans, and so far it's looking much more robust than I could reasonably have expected :-)

I've come across one small issue with the compile - we build all our stuff in C++11 mode using g++-4.6 or later, and I'm getting a compile error, which appears to relate to the boost initialization stuff. (The build works fine if I compile in C++98 mode.)

The error is a horrible mess of template badness which I'll paste in below. I'm not sure whether it's possible to fix directly, but I'd be happy to make a patch which changes all this to use C array initialization and a small amount of parsing code to create the bibliography.

Here's the error I get with g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

In file included from /usr/include/c++/4.6/bits/stl_algobase.h:65:0,
                from /usr/include/c++/4.6/bits/stl_tree.h:63,
                from /usr/include/c++/4.6/map:60,
                from /home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.h:39,
                from /home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:36:
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[23], _U2 = const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&, <template-parameter-2-3> = void, _T1 = std::basic_string<char>, _T2 = std::map<std::basic_string<char>, std::basic_string<char> >]’:
/home/cfoster/ROAMES_git/Components/ThirdParty/cmake/build/dist/boost-1.54.0/include/boost/preprocessor/iteration/detail/local.hpp:37:1:   instantiated from ‘boost::assign_detail::generic_list<T>& boost::assign_detail::generic_list<T>::operator()(const U&, const U0&) [with U = char [23], U0 = boost::assign_detail::generic_list<std::pair<const char*, const char*> >, T = std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > >, boost::assign_detail::generic_list<T> = boost::assign_detail::generic_list<std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > > >]’
/home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:92:4:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:132:64: error: call of overloaded ‘map(const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&)’ is ambiguous
/usr/include/c++/4.6/bits/stl_pair.h:132:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_map.h:197:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::initializer_list<std::pair<const _Key, _Tp> >, const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_map.h:183:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:172:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:161:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[20], _U2 = const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&, <template-parameter-2-3> = void, _T1 = std::basic_string<char>, _T2 = std::map<std::basic_string<char>, std::basic_string<char> >]’:
/home/cfoster/ROAMES_git/Components/ThirdParty/cmake/build/dist/boost-1.54.0/include/boost/preprocessor/iteration/detail/local.hpp:37:1:   instantiated from ‘boost::assign_detail::generic_list<T>& boost::assign_detail::generic_list<T>::operator()(const U&, const U0&) [with U = char [20], U0 = boost::assign_detail::generic_list<std::pair<const char*, const char*> >, T = std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > >, boost::assign_detail::generic_list<T> = boost::assign_detail::generic_list<std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > > >]’
/home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:103:4:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:132:64: error: call of overloaded ‘map(const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&)’ is ambiguous
/usr/include/c++/4.6/bits/stl_pair.h:132:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_map.h:197:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::initializer_list<std::pair<const _Key, _Tp> >, const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_map.h:183:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:172:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:161:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[17], _U2 = const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&, <template-parameter-2-3> = void, _T1 = std::basic_string<char>, _T2 = std::map<std::basic_string<char>, std::basic_string<char> >]’:
/home/cfoster/ROAMES_git/Components/ThirdParty/cmake/build/dist/boost-1.54.0/include/boost/preprocessor/iteration/detail/local.hpp:37:1:   instantiated from ‘boost::assign_detail::generic_list<T>& boost::assign_detail::generic_list<T>::operator()(const U&, const U0&) [with U = char [17], U0 = boost::assign_detail::generic_list<std::pair<const char*, const char*> >, T = std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > >, boost::assign_detail::generic_list<T> = boost::assign_detail::generic_list<std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > > >]’
/home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:125:4:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:132:64: error: call of overloaded ‘map(const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&)’ is ambiguous
/usr/include/c++/4.6/bits/stl_pair.h:132:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_map.h:197:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::initializer_list<std::pair<const _Key, _Tp> >, const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_map.h:183:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:172:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:161:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_pair.h: In constructor ‘std::pair<_T1, _T2>::pair(_U1&&, _U2&&) [with _U1 = const char (&)[19], _U2 = const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&, <template-parameter-2-3> = void, _T1 = std::basic_string<char>, _T2 = std::map<std::basic_string<char>, std::basic_string<char> >]’:
/home/cfoster/ROAMES_git/Components/ThirdParty/cmake/build/dist/boost-1.54.0/include/boost/preprocessor/iteration/detail/local.hpp:37:1:   instantiated from ‘boost::assign_detail::generic_list<T>& boost::assign_detail::generic_list<T>::operator()(const U&, const U0&) [with U = char [19], U0 = boost::assign_detail::generic_list<std::pair<const char*, const char*> >, T = std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > >, boost::assign_detail::generic_list<T> = boost::assign_detail::generic_list<std::pair<std::basic_string<char>, std::map<std::basic_string<char>, std::basic_string<char> > > >]’
/home/cfoster/src/libpointmatcher-dev/pointmatcher/Bibliography.cpp:147:4:   instantiated from here
/usr/include/c++/4.6/bits/stl_pair.h:132:64: error: call of overloaded ‘map(const boost::assign_detail::generic_list<std::pair<const char*, const char*> >&)’ is ambiguous
/usr/include/c++/4.6/bits/stl_pair.h:132:64: note: candidates are:
/usr/include/c++/4.6/bits/stl_map.h:197:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::initializer_list<std::pair<const _Key, _Tp> >, const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
/usr/include/c++/4.6/bits/stl_map.h:183:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(std::map<_Key, _Tp, _Compare, _Alloc>&&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:172:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const std::map<_Key, _Tp, _Compare, _Alloc>&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc> = std::map<std::basic_string<char>, std::basic_string<char> >]
/usr/include/c++/4.6/bits/stl_map.h:161:7: note: std::map<_Key, _Tp, _Compare, _Alloc>::map(const _Compare&, const allocator_type&) [with _Key = std::basic_string<char>, _Tp = std::basic_string<char>, _Compare = std::less<std::basic_string<char> >, _Alloc = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >, std::map<_Key, _Tp, _Compare, _Alloc>::allocator_type = std::allocator<std::pair<const std::basic_string<char>, std::basic_string<char> > >]
make[2]: *** [CMakeFiles/pointmatcher.dir/pointmatcher/Bibliography.cpp.o] Error 1
make[1]: *** [CMakeFiles/pointmatcher.dir/all] Error 2
make: *** [all] Error 2

libpointmatcher does not compile with gcc 4.4.4

libpointmatcher does not link with gcc 4.4.4 on SuSE Linux 11 with kernel 2.6.32.54.

The fix:

In file DataPointsFilter.cpp, line 79, replace

PointMatcher pm;
with
Const PointMatcher & pm = PointMatcher::get();

Same fix needs to go to ICP.ccp on line 127.

The resulting code compiles and runs without any problems wtih gcc 4.4.4 and gcc 4.7.0.

Installation problem

When libpointmatcher is installed, it fails to copy the file Bibliography.h. Solution: Add this to CMakeLists.txt.

Building on Windows

I'm trying to follow the instructions to build on Windows and I'm failing when trying to run CMake for libnado.

In particular, I have this error:
C:\repos\libnado-build\CMakeFiles\CMakeTmp\CheckSymbolExists.c(2): fatal error C1083: Cannot open include file: 'unistd.h': No such file or directory [C:\repos\libnado-build\CMakeFiles\CMakeTmp\cmTryCompileExec3210956335.vcxproj]

I think this means it's trying to do a unix build.
I'm using Visual Studio 2012 Express on Win 8.1 (although I have VS2013 installed also, which might be affecting it). I have cmake 3.2.0-rc2 if that could potentially make a difference.

Issue with the Function checkParameters in TransformationsImpl.cpp

Hi All,

In the function checkParameters in TransformationImpl.cpp the epsilon value is set to be 0.01. Is there a reason for this to be set to a specific value?

I am getting the error that my rotation matrix is not orthogonal. So I implemented the same code of checkParameters function in matlab. In matlab the function returns to a value true thereby asserting that the matrix is orthogonal, but with libpointmatcher says otherwise. I don't understand the reason.

Also there is comment called FIXME in the function.

I tried to change the value of epsilon to a lower value and ran make in libpointmatcher and got the following warning:

warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false [-Wstrict-overflow]

I am trying find out what the problem is. But kindly let me know what should be done for this problem.

Best Regards
Anuraj

Undefined symbols for architecture x86_64:

I'm trying to compile in Mac OS X 10.10 against Boost 1.57, which I installed using homebrew. Here is the relevant part of the compiler log:

Linking CXX shared library libpointmatcher.dylib
Undefined symbols for architecture x86_64:
"boost::filesystem::path::operator/=(boost::filesystem::path const&)", referenced from:
PointMatcherIO::FileInfoVector::localToGlobalFileName(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&) in IO.cpp.o
PointMatcherIO::FileInfoVector::localToGlobalFileName(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, std::__1::basic_string<char, std::__1::char_traits, std::_1::allocator > const&) in IO.cpp.o
"boost::filesystem::detail::initial_path(boost::system::error_code
)", referenced from:
PointMatcherSupport::validateFile(std::__1::basic_string<char, std::__1::char_traits, std::_1::allocator > const&) in IO.cpp.o
"boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code
)", referenced from:
PointMatcherIO::FileInfoVector::localToGlobalFileName(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&) in IO.cpp.o
PointMatcherIO::FileInfoVector::localToGlobalFileName(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&) in IO.cpp.o
"boost::filesystem::absolute(boost::filesystem::path const&, boost::filesystem::path const&)", referenced from:
PointMatcherSupport::validateFile(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&) in IO.cpp.o
"boost::system::system_category()", referenced from:
boost::mutex::unlock() in Logger.cpp.o
boost::unique_lockboost::mutex::lock() in Logger.cpp.o
boost::mutex::lock() in Logger.cpp.o
boost::mutex::mutex() in Logger.cpp.o
__GLOBAL__I_a in Logger.cpp.o
__GLOBAL__I_a in Exceptions.cpp.o
__GLOBAL__I_a in DataPoints.cpp.o
...
"boost::system::generic_category()", referenced from:
__GLOBAL__I_a in Logger.cpp.o
__GLOBAL__I_a in Exceptions.cpp.o
__GLOBAL__I_a in DataPoints.cpp.o
__GLOBAL__I_a in Matches.cpp.o
__GLOBAL__I_a in ICP.cpp.o
__GLOBAL__I_a in Registry.cpp.o
__GLOBAL__I_a in Registrar.cpp.o
...
"boost::filesystem::path::parent_path() const", referenced from:
PointMatcherIO::FileInfoVector::FileInfoVector(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in IO.cpp.o
PointMatcherIO::FileInfoVector::FileInfoVector(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >, std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator >) in IO.cpp.o
"boost::filesystem::path::extension() const", referenced from:
PointMatcher::DataPoints::load(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&) in IO.cpp.o
PointMatcher::DataPoints::load(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&) in IO.cpp.o
PointMatcher::DataPoints::save(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&) const in IO.cpp.o
PointMatcher::DataPoints::save(std::__1::basic_string<char, std::__1::char_traits, std::__1::allocator > const&) const in IO.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [libpointmatcher.1.2.1.dylib] Error 1
make[1]: *** [CMakeFiles/pointmatcher.dir/all] Error 2
make: *** [all] Error 2
22:21:13: The process "/usr/bin/make" exited with code 2.
Error while building/deploying project libpointmatcher (kit: Desktop Qt 5.4.0 clang 64bit)
When executing step "Make"
22:21:13: Elapsed time: 00:08.

installing via PPA crashed apt-get

i added the Ubuntu Precise PPA to my package repositories. then did "apt-get update". then "apt-get install libpointmatcher-dev libnabo-doc libpointmatcher-doc". But this crashed apt-get and i got some dialogs to send the error report to Ubuntu. see console output below. there is some conflict regarding the yaml library.

baxelrod@it3264u:~/aladdin2/ros/articulation$ sudo apt-get install libpointmatcher-dev libnabo-doc libpointmatcher-doc
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libkcmutils4 libnepomukdatamanagement4 qapt-batch libclucene0ldbl kubuntu-debug-installer libqca2 libfltk-gl1.3 libkdeclarative5
  libkjsembed4 oxygen-icon-theme libfltk-cairo1.3 linux-headers-3.2.0-29 libkemoticons4 libkdecore5 libkidletime4
  shared-desktop-ontologies libdlrestrictions1 odbcinst libntrack-qt4-1 kde-runtime-data libkatepartinterfaces4 libsolid4
  virtuoso-minimal libkde3support4 libnepomuk4 libkdewebkit5 libsoprano4 linux-headers-3.2.0-29-generic-pae libpolkit-qt-1-1
  libkdnssd4 libkparts4 libqapt1 kdoctools libvirtodbc0 odbcinst1debian2 icoutils katepart libthreadweaver4 libnepomukutils4
  libkmediaplayer4 libntrack0 libkfile4 libknewstuff3-4 libqapt-runtime libkpty4 libnepomuksync4 libstreamanalyzer0
  libknotifyconfig4 libkntlm4 libplasma3 kdelibs-bin libktexteditor4 kde-runtime libkio5 libkjsapi4 libstreams0 libattica0.3
  virtuoso-opensource-6.1-common plasma-scriptengine-javascript soprano-daemon libkhtml5 libkdeui5 libkdesu5 kdelibs5-plugins
  virtuoso-opensource-6.1-bin kate-data ntrack-module-libnl-0 libkrosscore4 libnepomukquery4a
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  libnabo-dev libnabo1 libpointmatcher1 yaml-cpp0.2.6-dev
The following NEW packages will be installed:
  libnabo-dev libnabo-doc libnabo1 libpointmatcher-dev libpointmatcher-doc libpointmatcher1 yaml-cpp0.2.6-dev
0 upgraded, 7 newly installed, 0 to remove and 490 not upgraded.
Need to get 1,347 kB of archives.
After this operation, 6,164 kB of additional disk space will be used.
Do you want to continue [Y/n]? 
Get:1 http://ppa.launchpad.net/stephane.magnenat/precise/ubuntu/ precise/main libnabo1 i386 1.0.4 [75.7 kB]
Get:2 http://ppa.launchpad.net/stephane.magnenat/precise/ubuntu/ precise/main libnabo-dev i386 1.0.4 [11.4 kB]
Get:3 http://ppa.launchpad.net/stephane.magnenat/precise/ubuntu/ precise/main libnabo-doc all 1.0.4 [137 kB]
Get:4 http://ppa.launchpad.net/stephane.magnenat/precise/ubuntu/ precise/main libpointmatcher1 i386 1.1.0 [616 kB]
Get:5 http://ppa.launchpad.net/stephane.magnenat/precise/ubuntu/ precise/main yaml-cpp0.2.6-dev i386 0.2.6-4ubuntu2 [316 kB]       
Get:6 http://ppa.launchpad.net/stephane.magnenat/precise/ubuntu/ precise/main libpointmatcher-dev i386 1.1.0 [13.1 kB]             
Get:7 http://ppa.launchpad.net/stephane.magnenat/precise/ubuntu/ precise/main libpointmatcher-doc all 1.1.0 [178 kB]               
Fetched 1,347 kB in 8s (151 kB/s)                                                                                                  
Selecting previously unselected package libnabo1.
(Reading database ... 346176 files and directories currently installed.)
Unpacking libnabo1 (from .../libnabo1_1.0.4_i386.deb) ...
Selecting previously unselected package libnabo-dev.
Unpacking libnabo-dev (from .../libnabo-dev_1.0.4_i386.deb) ...
Selecting previously unselected package libnabo-doc.
Unpacking libnabo-doc (from .../libnabo-doc_1.0.4_all.deb) ...
Selecting previously unselected package libpointmatcher1.
Unpacking libpointmatcher1 (from .../libpointmatcher1_1.1.0_i386.deb) ...
Selecting previously unselected package yaml-cpp0.2.6-dev.
Unpacking yaml-cpp0.2.6-dev (from .../yaml-cpp0.2.6-dev_0.2.6-4ubuntu2_i386.deb) ...
dpkg: error processing /var/cache/apt/archives/yaml-cpp0.2.6-dev_0.2.6-4ubuntu2_i386.deb (--unpack):
 trying to overwrite '/usr/lib/pkgconfig/yaml-cpp.pc', which is also in package yaml-cpp 0.2.7-5precise-20120502-0513-+0000
Selecting previously unselected package libpointmatcher-dev.
Unpacking libpointmatcher-dev (from .../libpointmatcher-dev_1.1.0_i386.deb) ...
Selecting previously unselected package libpointmatcher-doc.
Unpacking libpointmatcher-doc (from .../libpointmatcher-doc_1.1.0_all.deb) ...
Errors were encountered while processing:
 /var/cache/apt/archives/yaml-cpp0.2.6-dev_0.2.6-4ubuntu2_i386.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

i am using Ubuntu 12.04 with ROS groovy and hydro installed.

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.