ubuntu20.04安装pcl的详细步骤和走过的坑

由于项目原因需要用到PCL,因此在小ubuntu虚拟机上准备安装。

根据网上的攻略,需要安装以下依赖库

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
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

然而在安装

sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev

出现了问题,提示无法找到正确的正则表达式。

遂三个独特安装,但都安装不上。

上网百度之,将5.10改成5.8进行安装,发现需要的依赖项过多。只能换个方法。

再百度之,发现通过这种方法安装vtk会出现问题,需要通过官网源码进行安装。

去官网下载源码之后解压缩,进入文件目录

mkdir build
cd build
cmake-gui

使用cmake进行配置(参考网上教程图)

image-20200928112250384

然而又出现了新问题,在configure的时候找不到Qt5UiPlugin_DIR的路径,随百度之。

发现是qt版本的问题,需要QT5.8以上,通过默认命令安装的版本貌似不是5.8

sudo apt-get install qt5-default

于是去官网下载最新的5.14

image-20200928112431686

下载之后是.run文件,需要以下命令打开

sudo ./qt-opensource-linux-x64-5.14.0.run

然而在打开时提示没有此命令。

继续百度,发现需要修改权限(用ls文件显示安装包文件,发现文件名是白色而不是绿色,表示其不可执行。)

chmod +x ./qt-opensource-linux-x64-5.14.0.run
sudo ./qt-opensource-linux-x64-5.14.0.run

便可正确打开,默认安装在opt/Qt5.14.0

继续CMAKE的配置,然而还是找不到Qt5UiPlugin_DIR的路径,百度一通也无果。

经过思考后发现路径默认还是之前的qt路径,没有修改,需要手动修改

/opt/Qt5.14.0/5.14.0/gcc_64/lib/cmake/….

正确修改后configure和generate成功,进入build

make -j4
sudo make install

OK,VTK方面暂时安装完毕。下面正式进入pcl的安装

  • 不要从官网下载pcl然后自己cmake
  • 不要从git上拷贝进行cmake

不然你就会遇到我这样的错误

pcl

对于ubuntu 16.04以上,可以使用一行命令进行安装

sudo apt install libpcl-dev

终于安装成功!

image-20200928205841185

进入程序测试。

cmake文件:

find_package(PCL 1.2 REQUIRED)
include_directories(${PCL_INCLUDE_DIRS})
target_link_libraries (YOUR_PROJECT_NAME ${PCL_LIBRARIES})
add_executable(YOUR_PROJECT_NAME YOUR_FILE_NAME.cpp)

注意第二条,有些时候PCL_INCLUDE_DIR不是pcl/…,而是pcl-1.10(以我的版本为例)/pcl/…

所以可以把里面的pcl复制出来,就可以直接#include “pcl/…”了

c++测试文件:

#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"
using namespace pcl;

 
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;
}

image-20200928211206988

posted @ 2020-09-28 21:14  码我疯狂的码  阅读(17203)  评论(4编辑  收藏  举报