下面是安装pcl之前需要安装的相关依赖,将近30个依赖,一定确保没有遗漏,还是按顺序把每条执行一遍(当然也可以再执行一遍看是否遗漏)
1 安装依赖:
sudo apt-get update
sudo apt-get install git build-essential linux-libc-dev
sudo apt-get install cmake cmake-gui
sudo apt-get install libusb-1.0-0-dev libusb-dev libudev-dev
sudo apt-get install mpi-default-dev openmpi-bin openmpi-common
sudo apt-get install libpcap-dev
sudo apt-get install libflann1.9 libflann-dev
sudo apt-get install libeigen3-dev
sudo apt-get install libboost-all-dev
sudo apt-get install vtk6 libvtk6.3 libvtk6-dev libvtk6.3-qt libvtk6-qt-dev
sudo apt-get install libqhull* libgtest-dev
sudo apt-get install freeglut3-dev pkg-config
sudo apt-get install libxmu-dev libxi-dev
sudo apt-get install mono-complete
sudo apt-get install libopenni-dev libopenni2-dev
2 下载源码:
git clone https://github.com/PointCloudLibrary/pcl.git
编译安装:
cd pcl
# 切换到指定版本v1.9.1再编译
git checkout pcl-1.9.1
(如果安装不了,去官网手动下载源码包,解压后cd进入源码文件夹内)
3 执行cmake:
# 创建目录
mkdir release
# 进入目录
cd release
# 配置cmake
cmake -DCMAKE_BUILD_TYPE=None \
-DCMAKE_INSTALL_PREFIX=/usr/local \
-DBUILD_GPU=ON \
-DBUILD_apps=ON \
-DBUILD_examples=ON ..
# 编译
make -jn(n为内核数,例如"make -j11"其中11为内核数)
4 安装:
sudo make install
5 测试:
pcl_viewer ../test/pcl_logo.pcd#相关文件夹下打开终端
通常前面的安装不会出什么问题,真正出问题实在make编译阶段,主要存在两个问题:
1、反复出现 c++ internal compiler error
出错的原因是(虚拟机)运行内存不足,而大量template的扩展需要足够的内存。
方法1:
若是在虚拟机上,关掉虚拟机,可直接调节虚拟机内存大小,然后重新启动即可。
方法2:
可以通过临时使用交换分区来解决:
sudo dd if=/dev/zero of=/swapfile bs=64M count=16
#count的大小就是增加的swap空间的大小,64M是块大小,所以空间大小是bs*count=1024MB
sudo mkswap /swapfile
#把刚才空间格式化成swap格式
sudo swapon /swapfile
#使用刚才创建的swap空间
在编译完成后,一定要关闭(释放)交换空间,否则之后开不了机
sudo swapoff /swapfile
sudo rm /swapfile
之后继续执行你的相关操作就可以了。。。
注意:如果创建了临时空间之后仍提示“c++: internal compiler error: Killed (program cc1plus)”,可能是因为分配的空间不够大,可以继续分配更大的空间。过程中可以使用free -m命令来查看交换空间使用情况。
2、error:static assertion failed:YOU_TRIED_CALLING_A_VECTOR_METHOD_ON_A_MATRIXEIGEN_STATIC_ASSERT_VECTOR_ONLY
解决方法参考:Use fixed-size Eigen block expressions in `FrustumCulling` by caselitz · Pull Request #2786 · PointCloudLibrary/pcl · GitHub具体操作:打开报错文件(pcl/filters/include/pcl/filters/impl/frustum_culling.hpp),把所有看到.block()的(x,y,3,1)改写为<3,1>(x,y),如果有.head(),可以按照官网那改,如果没有,改动同样位置的.block()
顺带一提,根据github上pcl库里的搜索结果,这个问题应该在1.10以上版本被解决了