Ubuntu16.04下PCL點雲庫的安裝及使用demo

必備組件安裝

PCL點雲庫安裝

sudo apt install libpcl-dev

注意:若是在Ubuntu14.04下安裝的是libpcl-all,通常狀況下在Ubuntu的軟件倉庫裏首選帶dev後綴的和什麼後綴都不帶的庫版本。這裏安裝的是PCL1.7版本python

最終安裝到的路徑爲:linux

  • 頭文件目錄:/usr/include
  • 庫文件目錄:/usr/lib/x86_64-linux-gnu

因此實際上這個庫安裝後,只有一些.h文件和在庫文件目錄中的.so文件。ios

cmake中調用方法

CMakeLists.txt中:git

find_package(PCL REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
並在最後的target_link_libraries()命令中加入${PCL_LIBRARIES}

注意:只要find_package可以找到庫,那必定會產生以下幾個變量:github

  • PCL_INCLUDE_DIRS:存儲的是PCL庫全部的頭文件所在的目錄
  • PCL_LIBRARY_DIRS:存儲的是PCL庫全部的庫文件(共享庫或者靜態庫或者源文件)所在的目錄
  • PCL_LIBRARIES:存儲的是PCL庫每一個庫文件(即共享庫或者靜態庫或者源文件)的詳細位置(包括文件名)
  • PCL_FOUND:存儲是否找到了這個PCK庫
  • PCL_DEFINITIONS

注意:include_directories做用是添加一個新的目錄到cmake的頭文件搜索目錄裏。
link_directories做用是添加一個新的目錄到cmake的庫文件搜索目錄裏。然而不少庫都喜歡把庫文件放在/usr/lib/x86_64-linux-gnu這個文件夾下函數

VTK庫安裝

sudo apt install libvtk6-dev libvtk6.2

VTK庫在cmake中的使用參見pcl庫的使用,幾乎如出一轍。
注意:因爲VTK庫與PCL庫是配套的,可是大於等於7.1的VTK庫會與PCK庫不兼容,其體如今InsertTupleValue等找不到。故最好安裝小於7.1的版本。具體請參見VTK版本不兼容現象
另外注意在應用商店裏python-vtk包和libpcl-dev包前後安裝的時候會相互卸載沒用到的組件,致使一個安裝了,同時另外一個被卸載了,請務必注意。ui

Eigen庫的安裝

Eigen庫的安裝,Eigen庫是一個只有頭文件沒有庫文件的庫,因此使用的時候只須要include_directories導入頭文件目錄便可。code

Boost庫的安裝

與上述相似,可是注意的是在Ubuntu16.04中,cmake不能自動找到Boost,須要先設置BOOST_ROOTget

示例demo

CMakeLists.txt

其cmakelists.txt文件以下:it

cmake_minimum_required(VERSION 3.9)
project(pcldemo)
set(CMAKE_CXX_STANDARD 17)

find_package(Eigen3 REQUIRED)
include_directories("/usr/include/eigen3")#很奇怪的是Eigen只有頭文件沒有庫文件,因此只能經過這種方式導入便可使用Eigen

# pcl
find_package( PCL REQUIRED)
include_directories( ${PCL_INCLUDE_DIRS} )
link_directories(${PCL_LIBRARY_DIRS})

#Boost
set(BOOST_ROOT "/usr/local/boost") #這個是我本身加的,由於原來Findboost.cmake提示找不到boost庫
find_package(Boost REQUIRED)
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})

#VTK
find_package(VTK REQUIRED)
include_directories(${VTK_INCLUDE_DIRS})
link_directories(${VTK_LIBRARY_DIRS})

add_executable(pcldemo main.cpp)
target_link_libraries(pcldemo
        "/usr/lib/x86_64-linux-gnu/libpcl_visualization.so.1.7.2"
        libboost_system.so libboost_filesystem.so
        ${VTK_LIBRARIES}
)

尚待解決的問題:
最棒target_link_libraries的時候,visualization.so必需要用全路徑,直接寫名字卻不行,尚待研究。其次,對於PCL庫,直接在target_link_libraries中用${PCL_LIBRARIES}的調用卻不行,尚待研究。

main函數

#include <iostream>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/pcd_io.h>

int main(int argc, char* argv[]){
    pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud(new pcl::PointCloud<pcl::PointXYZRGB>);

    pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
    viewer.showCloud(cloud);

    while (!viewer.wasStopped())
    {
    }
}

注意,網上有些demo是錯誤的,就在於對cloud的定義上,少了一個ConstPtr子類,我就爲這個問題折騰了好幾天,果真不能篤信權威啊。

相關文章
相關標籤/搜索