二、PLC安装踩坑总结(Ubuntu 16.4+PCL1.8.1+VTK7.1+Qt5.9.9)

二、PCL安装踩坑总结(Ubuntu 16.4+PCL1.8.1+VTK7.1+Qt5.9.9)

问题解决暂未更完、、、

毕设相关,装一下PCL库。听说官网推荐的安装方法不很稳定,以及看到【最简易的PCL安装方法(ubuntu16.04系统)】,想都没想,别人我不知道能不能一次成功,我肯定是不得行的(果然装了无数遍),老老实实编译源码。

一、写在前面

  • 安装经历
    台式机(有anaconda环境,许多依赖文件和库与PCL中冲突,比较难搞)、笔记本。
    都是Ubuntu 16.4+PCL1.8.1+VTK7.1+Qt5.9.9。
#官网推荐安装方法
sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-all

每次装什么软件我都抱着殊死一搏的勇气(因为总能把各种问题集结个遍、、手动狗头)。搜了一些教程贴,感觉,也很easy嘛,也就安装的依赖项多了些、时间长了些、、naive!!too naive!!!

  • 先总结

| 成功栗子 | PCL1.8.1+VTK7.1.1+Qt5.9.9 | |
|-------|:—?-----------|-------?
|失败栗子 |PCL1.11.1+VTK5.10.1+Qt4.8.2 | PCL1.11.1+VTK6.2.0+Qt5.9.9 |
| PCL1.11.1+VTK8.2.1+Qt5.9.9 | PCL1.11.1+VTK7.1.1+Qt4.8.2 |PCL1.8.1+VTK6.2.1+Qt5.9.9 |
期间试错无数,以为少了某些依赖,其实就是PCL和VTK的版本没对上,强推一波在笔记本上最终安装的成功教程《Ubuntu16上安装PCL》。
【师兄说1.9以上版本可能不太稳定,考虑到课题组内部工作的衔接方便,就从1.11.1改成了1.8.1版本。想装什么版本根据自己需要随意哈~】

正确搭配PCL-1.7.2 + VTK-5.10.1 / VTK-6.2.0PCL-1.8.1 + VTK-7.1.1PCL-1.9.1 + VTK-8.2.0
Qt主版本需要5以上(ubuntu16.04自带4.8.7版本)

二、安装过程

总结发现有两种方法

1.VTK放在依赖项中安装

先搜了一下安装教程,《Ubuntu16.04 安装配置 PCL1.9》和《Ubuntu16.04下PCL库的安装与测试》,先向大佬致谢!(以上尝试失败)

  • 安装依赖项(以上2篇文章的安装步骤都一样的,直接贴一下代码)
     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 libflann1.8 libflann-dev
     sudo apt-get install libeigen3-dev
     sudo apt-get install libboost-all-dev     
     sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev
#(实现可视化需要更新的vtk版本,可以使用sudo apt-get install libvtk + Tab 补全查找自己需要的版本。
#建议sudo apt-get install libvtk6.2 libvtk6.2-qt libvtk6-dev,安装主版本6以上的,vtk关系到PCL可视化模块的使用)
     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 qt-sdk openjdk-8-jdk openjdk-8-jre
  • 从github上下载PCL源码
 git clone https://github.com/PointCloudLibrary/pcl.git
 #特别提示:直接git默认下载最新版本的,当前时间节点下我下载得到了1.11.1版本,跟依赖中的VTK版本是不匹配的,导致安装失败。
 #建议在官网选择需要安装的版本,并匹配正确的VTK和Qt。
  • 编译:(各个帖子都提醒这一步很漫长,可我并没觉得很漫长,肉眼可见地编译完了,还悄悄地喜滋滋~~呔!)
  cd pcl
  mkdir release
  cd release
  cmake -DCMAKE_BUILD_TYPE=None -DCMAKE_INSTALL_PREFIX=/usr \
        -DBUILD_GPU=ON -DBUILD_apps=ON -DBUILD_examples=ON \
        -DCMAKE_INSTALL_PREFIX=/usr ..
  make
  • 安装:
  sudo make install

顺利的话(没报错error,有warning一般没关系),到此就安装成功了,赶紧测试吧~

2.官网下载合适的VTK版本,单独编译

  • 安装依赖项
    按照此帖安装成功,感恩感谢!但是里面的安装包链接似乎有问题,正确官网链接已经写在本文最开始了。
     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 libflann1.8 libflann-dev
     sudo apt-get install libeigen3-dev libboost-all-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
     sudo apt-get install libx11-dev libxext-dev libxtst-dev libxrender-dev
     sudo apt-get install libxmu-dev libxmuu-dev
     sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev
  • 下载解压编译VTK源码并安装
     tar -xzvf VTK-7.1.1.tar.gz #解压缩
     cd VTK-7.1.1
     mkdir build && cd build  #创建build文件夹并进入,可以分成两步
     cmake ..
     cmake-gui      #设置见下图所示
     make
     sudo make install #安装VTK

“where is the source code" 和 " where to build the binaries"选择VTK-7.1.1文件夹及在其下创建的build 文件夹,勾选“VTK_GROUP_QT”,查看“VTK_QT_VERSION” = 5,点击Configure,Generate。关闭。
【注意确认下Qt5的路径,若找不到或者版本不对,详细见问题4”ubuntu16.04下qt4切换程qt5“及解决方法。】
在这里插入图片描述

  • 下载解压编译PCL源码并安装
     tar -xzvf pcl-pcl-1.8.1.tar.gz #解压缩
     cd pcl-pcl-1.8.1 #切换到上面解压的文件夹,也可以更改文件夹名字
     mkdir build && cd build  #创建build文件夹并进入,可以分成两步
     cmake ..
     cmake-gui     #设置见下图所示
     make -j4      #根据自己机器性能设置线程数,2/4/8/16等。编译时间较长,关闭不必要的程序
     sudo make install   #安装PCL

与VTK的编译安装类似。“where is the source code" 和 " where to build the binaries"选择pcl-pcl-1.8.1文件夹及在其下创建的build 文件夹,勾选”OPENNI2“点击Configure,Generate。关闭。【注意检查Qt5路径和VTK版本号。因为我先装过VTK8.2.0,Configure后默认该版本,导致了又一次的安装失败。】
在这里插入图片描述顺利的话(没报错error,有warning一般没关系),到此就安装成功了,赶紧测试吧~

3.PCL及VTK卸载

安装过程主要是cmake 和make编译后, build文件夹下会生成工程文件。把build文件夹及内容删除,再删除用户目录下带”libpcl“的文件即可。

sudo rm -r build
sudo rm -r /usr/include/pcl-1.8.1 /usr/share/pcl /usr/bin/pcl* /usr/lib/libpcl*
#先找到pcl*相关文件和libpcl*的路径,再删除。根据自己的实际情况,找不到就用locate命令搜索一下。

提示:如果安装了多个版本,注意辨别删除版本的路径。

4.测试

在安装路径下新建一个文件夹,放置以下两个文件(pcl_test.cpp文件和对应的CMakeLists.txt文件,随便怎么命名,内部调用一致就行)

#新建pcl_test.cpp文件:

#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/console/parse.h>
 
int main(int argc, char **argv) {
    std::cout << "Test PCL !!!" << std::endl;
    
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);
    uint8_t r(255), g(15), b(15);
    for (float z(-1.0); z <= 1.0; z += 0.05)
    {
      for (float angle(0.0); angle <= 360.0; angle += 5.0)
      {
	pcl::PointXYZRGB point;
	point.x = 0.5 * cosf (pcl::deg2rad(angle));
	point.y = sinf (pcl::deg2rad(angle));
	point.z = z;
	uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
		static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
	point.rgb = *reinterpret_cast<float*>(&rgb);
	point_cloud_ptr->points.push_back (point);
      }
      if (z < 0.0)
      {
	r -= 12;
	g += 12;
      }
      else
      {
	g -= 12;
	b += 12;
      }
    }
    point_cloud_ptr->width = (int) point_cloud_ptr->points.size ();
    point_cloud_ptr->height = 1;
    
    pcl::visualization::CloudViewer viewer ("test");
    viewer.showCloud(point_cloud_ptr);
    while (!viewer.wasStopped()){ };
    return 0;
}
#新建CMakeLists.txt文件:
cmake_minimum_required(VERSION 2.6)
project(pcl_test)
 
find_package(PCL 1.2 REQUIRED)
 
include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})
 
add_executable(pcl_test pcl_test.cpp)
 
target_link_libraries (pcl_test ${PCL_LIBRARIES})
 
install(TARGETS pcl_test RUNTIME DESTINATION bin)
  • 同时还要新建一个build文件,编译的时候会自动生成工程配置文件,打开终端执行:
mkdir build
cd build
cmake ..
make
./pcl_test
  • 可以看到这么漂亮的图形哦~
    在这里插入图片描述

三、遇到的问题及解决

序号问题
1Makefile:149: recipe for target ‘all’ failed
2fatal error: pcl/visualization/pcl_visualizer.h
3安装VTK时CMAKE中找不到Qt5路径
4ubuntu16.04下qt4切换程qt5
5/usr/lib/…/lib64/libSM.so: undefined reference to ‘uuid_unparse_lower@UUID_1.0’ /usr/lib/…/lib64/libSM.so: undefined reference to ‘uuid_generate@UUID_1.0’
6
7

【注:问题1-4是我按照方法1将VTK放在依赖项中安装遇到的,后来重装按照方法二成功了;问题5-7是跟anaconda环境冲突的一些问题及解决】

第一遍在cmake的时候出现了问题1的报错

1.问题1及其解决:Makefile:149: recipe for target ‘all’ failed

查了一下,是因为安装的VTK版本过低,不支持1.8及1.9以后版本,我丢!根据诸多大佬的切身建议,安装了高版本的VTK依赖项:sudo apt-get install libvtk6.2 libvtk6.2-qt libvtk6-dev,更新到6.2版本啦,又出现新的问题了,真是太棒了呢(强颜欢笑)!

再次编译,又有新问题2出现了呢~嘻嘻

2.问题2及其解决:fatal error: pcl/visualization/pcl_visualizer.h

【最终来说,没有真正解决问题2,只是最后的最后,实在没办法,卸载重装就没这个问题了。】

看到了这篇文章,我感觉到自己可能马上就要得到救赎《[Ubuntu + PCL]fatal error: pcl/visualization/pcl_visualizer.h: 没有那个文件或目录》和《[Bug集合]fatal error: pcl/visualization/pcl_visualizer.h: No such file or directory》,激动地措手手~

  sudo apt install tcl-vtk
  sudo apt-get install libvtk6.2 libvtk6.2-qt libvtk6-dev
  sudo apt-get update
  #然后再编译pcl,此处就不贴代码了

该帖改成6.2成功了,而我此处本来就6.2版本,不出意外又失败了,很难保持微笑了~(此时真的不知道哪个版本才是相互对应的…)

3.问题3及其解决:安装VTK时CMAKE中找不到Qt5路径

#问题3表述:
 By not providing "FindQt5.cmake" in CMAKE_MODULE_PATH this project has
  asked CMake to find a package configuration file provided by "Qt5", but
  CMake did not find one.

虽然眼下问题2没解决,但还是要继续,而且还VTK没跑,也许还有别的问题没解决,never give it up,我可以!我能行!我以为是vtk版本太低,就换成了8.2。《ubuntu16.04 安装pcl1.8.0》和《Ubuntu16.04下pcl库和vtk的编译安装》,
对照了两个帖子,发现我之前X11,OpenGL,CMake-gui(Qt5)依赖项没安装,那么问题的最终解决会是在这里么?

#安装X11
sudo apt-get install libx11-dev libxext-dev libxtst-dev libxrender-dev libxmu-dev libxmuu-dev
#安装OpenGL
sudo apt-get install build-essential libgl1-mesa-dev libglu1-mesa-dev
#安装libglut-dev
sudo apt-get install freeglut3-dev
#cmake
sudo apt-get install cmake cmake-gui 
#打开cmake图形界面
cmake-gui

执行完最后一步:出现了cmake的图形界面,配置“where is the source code”的路径为vtk-8.2所在的目录,在vtk-8.2目录新建build文件夹,配置“where to build the binaries”为build文件夹,点击Configure,配置完成后提示configure done,选择“VTK_GROUP_QT”再次点击configure,配置完成后点击generate按钮,会在build文件夹下生成工程文件。
一切看起来都是这么完美!但是,在选择“VTK_GROUP_QT”再次点击configure后,就报错如下,找不到Qt5,即引出第三个问题。
在这里插入图片描述
注意到”Qt5-DIR-NOTFOUND‘,寻思既然电脑找不到路径,就手动给添上呗~ cd了qt4的路径,在上一级果然发现了qt5的文件夹,切换!擦,还是报这个错!

连续两次报错终于想要打开qt5文件夹看看,竟然是空的!qt5根本没安装?!崩溃了快,难以置信我都在干什么蠢事。又是一波快速了解Qt,引出问题4。

4.问题4及其解决:ubuntu16.04下qt4切换程qt5(由问题三引出,顺便解决)

1.查看是否安装了Qt、安装版本以及路径信息:qmake -v。
Ubuntu16.4默认安装Qt4版本,这里可以看到是4.8.7
在这里插入图片描述
2.快速了解Qt是啥、能干啥、基本模块
Qt是一个跨平台C++图形用户界面应用程序开发框架。
《Qt学习之路》
《Qt4 和 Qt5 模块的分类》

3.妄图偷懒
根据经验贴《ubuntu16.04下qt4和qt5同时安装的切换》,把路径默认的Qt4改成Qt5,然鹅、、、又出现如下一堆报错。
【经查我的电脑只有qt4的相关设置文件、没有安装qt5,此贴是解决其标题的问题:“切换”,并且该帖中的qt4和qt5安装路径在同一文件夹下。】在这里插入图片描述
4.由此显然可知,我的下一步是,安装Qt5

先去官网下载:http://download.qt.io/archive/qt/

  • 看了一下发布时间,保守起见,我选择了5.9.9版本(19年12月末发布)。
  • 新建一个qt5.9.9文件夹,把下载的“qt-opensource-linux-x64-5.9.9.run”文件放进去,cd qt5.9.9,切换到该文件夹准备安装。
 ~/qt5.9.9$ sudo ./qt-opensource-linux-x64-5.9.9.run
#报错
sudo: ./qt-opensource-linux-x64-5.9.9.run: command not found
  • 需要先更改权限,设为可执行文件。
#增加可执行权限
 ~/qt5.9.9$ chmod +x ./qt-opensource-linux-x64-5.9.9.run
 #安装
~/qt5.9.9$ sudo ./qt-opensource-linux-x64-5.9.9.run
  • 出现Qt5安装图形化界面,设置邮箱、密码~【一定记住安装路径】此处我使用了默认安装路径 /opt/5.9.9(Qt4默认安装在/usr/lib/x86_64-linux-gnu/下)
    在这里插入图片描述
    在这里插入图片描述
  • 在qt选择器下设置Qt5的路径(原来是存放的Qt4路径):
#进入默认选择器qtchooser位置
cd /usr/lib/x86_64-linux-gnu/qt-default/qtchooser
#更改default.conf文件中路径
sudo gedit default.conf
  • 原路径:
    在这里插入图片描述
  • 更改后save(第一行路径要到bin,找不到就cd 、ls -a大法):
    在这里插入图片描述
  • 验证:qmake -v。可以看到,成功安装Qt5.9.9版本。
    在这里插入图片描述问题4至此已完整解决。
    执行cmake-gui,在“Qt5-DIR”手动选择Qt5.9.9路径,此时Configure、Generate都无报错,问题3至此也已完整解决。

以下是已有anaconda3环境的台式机下安装PCL,某些文件/库与之冲突的问题。

5.问题5及其解决:/usr/lib/…/lib64/libSM.so: undefined reference to ‘uuid_unparse_lower@UUID_1.0’ /usr/lib/…/lib64/libSM.so: undefined reference to ‘uuid_generate@UUID_1.0’

这个问题真的让我头疼欲裂,是PCL编译的时候错误链接到了anaconda3/lib下,根据大佬的指示一通操作猛如虎,修改PCL/lib路径,切断anaconda3/lib路径,但是,后面还是报同样的错误。
先贴一下大佬的解决方案并解释一下(翻译轻喷),想原汁原味了解详情的话可以点上段的链接自己去看。

第一段

第一段就是说,整体解决方案是将anaconda3/lib路径从系统中移除,完了再重建。
下面给了具体操作。

1.删除PCL编译的build文件夹,再新建。(其实就是卸载PCL了,在2.3讲过哦~)
2.在终端PCL-XX/build使用 echo $PATH 命令查看anaconda lib环境变量
	echo $PATH
3.复制2中的路径,删除anaconda中的相关文件夹
4.执行 PATH=[MODIFIED_PATH] ,其中[MODIFIED_PATH] 是上一步中的路径
5.再次执行 echo $PATH 确认anaconda路径已经被移除
6.在同一个终端窗口再次build生成工程文件

此时程序就会调用系统文件夹而非anaconda路径,成功。

给一个修改路径的例子(modified PATH): 如果原路径为 /home/you/anaconda3/bin:/usr/local/bin:/usr/sbin:/usr/bin ,那么修改后的就是 /usr/local/bin:/usr/sbin:/usr/bin

注意,从.bashrc 文件会永久修改路径,可能会导致anaconda不可用,所以上面修改路径是在终端中进行的。

经验:不要盲目跟着任何一篇帖子盲目操作,一定得搞清楚自己的问题是怎么产生的!!!我没有任何一次的任何一个哪怕小问题是看了哪个帖子就完全解决了,对不上的。。。
【虽然第一句话我每次事后都跟自己说、、、逃!】