踩过的坑——nicp的下载和编译

这里的nicp是normal iterative closest point的缩写,也就是之前的ICP算法一个实现库。这个库的网站是:nicp

最近做的项目需要用到ICP算法,我看了感觉这个库的实现还不错。不过它的安装遇到了一些问题,所以也记录一下。

首先,这个库在作者运行的系统是ubuntu 16.04,因此使用别的版本的系统可能会出现问题。但是理论上是不应该出现问题的。出现了问题就再去查吧,不过这个库不是很有名,可能也查不到什么相同的问题。

步骤如下:

  1. 安装依赖库:

    1
    sudo apt install git cmake libeigen3-dev libsuitesparse-dev qtdeclarative5-dev qt5-qmake libqglviewer-dev libflann-dev libopencv-dev freeglut3-dev
  2. 克隆NICP:

    1
    git clone https://github.com/yorsh87/nicp.git
  3. 编译这个库:

    1
    2
    3
    4
    5
    cd nicp
    mkdir build
    cd build
    cmake ..
    make

这个就是很普通的步骤,但是你最后可能会出现各种错误,比如未定义的引用,或者undefined reference to symbol哒哒哒之类的,这是因为在作者的cmakelists文件里,需要的opencv是2.4.8,使用3+的opencv编译可能会通过(之前的18.04版本无法编译通过,需要把2.4.8去掉才行,而且即使去掉了,找到的3.x的版本,依然make不成功。在这个项目的issue里也有说换了个系统成功了,所以尽量使用16.04系统吧),但是运行程序的时候可能会出错。可以下载两个opencv,分别是2.x和3.x,但是不能全部安装。不过,cmakelists中安装了之后只是把路径添加到环境变量了,我们也可以指定OpenCV的路径,这样它找到的就是我们想要让它找的版本。find_package想要找的是OpenCVModules.cmake,这个一般在OpenCV的build文件夹里,因此在CMakeLists.txt中find_package(OpenCV REQUIRED)前加一句:

1
set(OpenCV_DIR "PATH\OpenCV-2.x\build")

就可以了。
经过我的测试,实际上OpenCV 3.x也是可以用的,但是要保证示例中和nicp库make时候用的OpenCV版本一致。

  1. 如果你想在别的工程中使用这个库,比较方便的是把他添加到环境变量里:
    1
    gedit ~/.bashrc

在文件末尾添加:

1
2
3
# NICP
export NICP_ROOT=/path/to/nicp
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${NICP_ROOT}/lib

最后记住需要:

1
source ~/.bashrc

这样的话环境变量会立即生效,如果还不行就重启。

然后,如果想要使用NICP的几个例子,对于下载的源代码中的CMakeLists.txt文件,find_package(opencv)的这一块,也需要做相应的改动。然后就应该可以跑的通了。

可是比较坑的地方是,NICP的代码不支持C++11以上!编译选项加上-std=c++11,就会出现“对类内部的static成员初始化需要constexpr类型”的错误,还好这个比较容易改,将static去掉就好了。这个问题还是挺诡异的,因为讲道理模板元编程的话是可以这样做的。