必备组件安装
PCL点云库安装
sudo apt install libpcl-dev
注意:如果在Ubuntu14.04下安装的是libpcl-all,一般情况下在Ubuntu的软件仓库里首选带dev后缀的和什么后缀都不带的库版本。这里安装的是PCL1.7版本
最终安装到的路径为:
头文件目录:/usr/include
库文件目录:/usr/lib/x86_64-linux-gnu
所以实际上这个库安装后,只有一些.h文件和在库文件目录中的.so文件。
cmake中调用方法
CMakeLists.txt中:
find_package(PCL REQUIRED)
include_directories(
P
C
L
I
N
C
L
U
D
E
D
I
R
S
)
l
i
n
k
d
i
r
e
c
t
o
r
i
e
s
(
{PCL_INCLUDE_DIRS}) link_directories(
PCLINCLUDEDIRS)linkdirectories({PCL_LIBRARY_DIRS})
并在最后的target_link_libraries()命令中加入${PCL_LIBRARIES}
注意:只要find_package能够找到库,那一定会产生如下几个变量:
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包先后安装的时候会相互卸载没用到的组件,导致一个安装了,同时另一个被卸载了,请务必注意。
Eigen库的安装
Eigen库的安装,Eigen库是一个只有头文件没有库文件的库,所以使用的时候只需要include_directories导入头文件目录即可。
Boost库的安装
与上述类似,但是注意的是在Ubuntu16.04中,cmake不能自动找到Boost,需要先设置BOOST_ROOT
示例demo
CMakeLists.txt
其cmakelists.txt文件如下:
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(
P
C
L
I
N
C
L
U
D
E
D
I
R
S
)
l
i
n
k
d
i
r
e
c
t
o
r
i
e
s
(
{PCL_INCLUDE_DIRS} ) link_directories(
PCLINCLUDEDIRS)linkdirectories({PCL_LIBRARY_DIRS})
#Boost
set(BOOST_ROOT “/usr/local/boost”) #这个是我自己加的,因为原来Findboost.cmake提示找不到boost库
find_package(Boost REQUIRED)
include_directories(
B
o
o
s
t
I
N
C
L
U
D
E
D
I
R
S
)
l
i
n
k
d
i
r
e
c
t
o
r
i
e
s
(
{Boost_INCLUDE_DIRS}) link_directories(
BoostINCLUDEDIRS)linkdirectories({Boost_LIBRARY_DIRS})
#VTK
find_package(VTK REQUIRED)
include_directories(
V
T
K
I
N
C
L
U
D
E
D
I
R
S
)
l
i
n
k
d
i
r
e
c
t
o
r
i
e
s
(
{VTK_INCLUDE_DIRS}) link_directories(
VTKINCLUDEDIRS)linkdirectories({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
V
T
K
L
I
B
R
A
R
I
E
S
)
尚
待
解
决
的
问
题
:
最
棒
t
a
r
g
e
t
l
i
n
k
l
i
b
r
a
r
i
e
s
的
时
候
,
v
i
s
u
a
l
i
z
a
t
i
o
n
.
s
o
必
须
要
用
全
路
径
,
直
接
写
名
字
却
不
行
,
尚
待
研
究
。
其
次
,
对
于
P
C
L
库
,
直
接
在
t
a
r
g
e
t
l
i
n
k
l
i
b
r
a
r
i
e
s
中
用
{VTK_LIBRARIES} ) 尚待解决的问题: 最棒target_link_libraries的时候,visualization.so必须要用全路径,直接写名字却不行,尚待研究。其次,对于PCL库,直接在target_link_libraries中用
VTKLIBRARIES)尚待解决的问题:最棒targetlinklibraries的时候,visualization.so必须要用全路径,直接写名字却不行,尚待研究。其次,对于PCL库,直接在targetlinklibraries中用{PCL_LIBRARIES}的调用却不行,尚待研究。
main函数
#include
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/io/pcd_io.h>
int main(int argc, char* argv[]){
pcl::PointCloudpcl::PointXYZRGB::ConstPtr cloud(new pcl::PointCloudpcl::PointXYZRGB);
pcl::visualization::CloudViewer viewer("Simple Cloud Viewer");
viewer.showCloud(cloud);
while (!viewer.wasStopped())
{
}
}
注意,网上有些demo是错误的,就在于对cloud的定义上,少了一个ConstPtr子类,我就为这个问题折腾了好几天,果然不能笃信权威啊。