[Part 3] 在Ubuntu 16.04源码编译PCL 1.8.1支持VTK和QT

本文首发于个人博客https://kezunlin.me/post/137aa5fc/,欢迎阅读!

Part-3: Install and Configure PCL 1.8.1 with vtk qt support on Ubuntu 16.04 from source

Series

  • Part-1: Install and Configure Qt5 on Ubuntu 16.04
  • Part-2: Install and Configure VTK 8.1.0 from source with Qt5 on Ubuntu 16.04
  • Part-3: Install and Configure PCL 1.8.1 with vtk qt support on Ubuntu 16.04 from source
  • Part-4: Install and Configure PCL 1.8.1 with vtk qt support on windows 10 from source

Guide

  • qt: 5.7.0
  • qmake: 3.0
  • qtcreator: 3.5.1
  • vtk: 8.1.0 (source)
  • pcl :1.8.1 (source)

Setup Prerequisites

 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-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.8 libflann-dev
 sudo apt-get install libeigen3-dev
 sudo apt-get install libopenni2-dev
 sudo apt-get install libqhull7 libqhull-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 openjdk-8-jdk openjdk-8-jre

dropped

 sudo apt-get install qt-sdk 
 sudo apt-get install libvtk5.10-qt4 libvtk5.10 libvtk5-dev
 sudo apt-get install vtk6 libvtk6-dev libvtk6-qt-dev 
 

Notice for vtk version.

metslib

for cmake error:

no metslib found.

fix by

wget https://www.coin-or.org/download/source/metslib/metslib-0.5.3.tgz
tar xzvf metslib-0.5.3.tgz
cd metslib-0.5.3
./configure
make 
sudo make install

glxinfo

install

sudo apt-get install mesa-utils
glxinfo 

possible error

X Error of failed request:  BadRequest (invalid request code or no such operation)
Major opcode of failed request:  154 (GLX)
Minor opcode of failed request:  34 ()
Serial number of failed request:  34
Current serial number in output stream:  33

fix,make sure NVIDIA drivers are installed successfully and no conflict.

check display OpenGL info

$ glxinfo | grep OpenGL

OpenGL vendor string: NVIDIA Corporation
OpenGL renderer string: GeForce GTX 1060/PCIe/SSE2
OpenGL core profile version string: 4.5.0 NVIDIA 384.90
OpenGL core profile shading language version string: 4.50 NVIDIA
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 4.5.0 NVIDIA 384.90
OpenGL shading language version string: 4.50 NVIDIA
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 384.90
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:

It means we use OpenGL version 4.5.0 for NVIDIA display.

Or by nvidia-settings, NVIDIA X Server Settings--> X Screen 0 --> OpenGL/GLX Information.

compile

wget https://github.com/PointCloudLibrary/pcl/archive/pcl-1.8.1.tar.gz

 cd pcl
 mkdir build
 cd build
 cmake-gui ..
 

with options

 QT_USE_FILE /home/kezunlin/program/pcl-1.8.1/build/use-qt5.cmake
 
 VTK_DIR  /usr/local/lib/cmake/vtk-8.1
 
 CMAKE_BUILD_TYPE       Release
 CMAKE_CONFIGURATION_TYPES Release
 CMAKE_INSTALL_PREFIX  /usr/local
 
 PCL_SHARED_LIBS       ON
 PCL_QT_VERSION        5
 PCL_ENABLE_SSE        ON
 
 Build_visualization ON
 Build_apps ON
 Build_examples OFF # error may occur
Using CPU native flags for SSE optimization: -march=native

make and install

 # it may take several minutes, wait ...
 make -j8
 sudo make -j8 install
cmake install to /usr/local/bin, /usr/local/lib/, /usr/local/include/pcl-1.8
PCL_DIR will be /usr/local/share/pcl-1.8

error for example

/home/kezunlin/program/pcl-1.8.1/examples/segmentation/example_cpc_segmentation.cpp:493:17: error: ‘class vtkUnsignedCharArray’ has no member named ‘InsertNextTupleValue’
         colors->InsertNextTupleValue (color);

so cmake with options

Build_examples OFF

Test pcl_viewer

test pcl_viewer

/usr/local/bin/pcl_viewer ~/program/pcl-1.8.1/test/car6.pcd

Success.

Tips: screen snapshot by gnome-screenshot -a.

Cloud Viewer

cloud_viewer.cpp

#include 
#include 
#include 
#include 
    
int user_data;
    
void 
viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
    viewer.setBackgroundColor (1.0, 0.5, 1.0);
    pcl::PointXYZ o;
    o.x = 1.0;
    o.y = 0;
    o.z = 0;
    viewer.addSphere (o, 0.25, "sphere", 0);
    std::cout << "i only run once" << std::endl;
    
}
    
void 
viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{
    static unsigned count = 0;
    std::stringstream ss;
    ss << "Once per viewer loop: " << count++;
    viewer.removeShape ("text", 0);
    viewer.addText (ss.str(), 200, 300, "text", 0);
    
    //FIXME: possible race condition here:
    user_data++;
}
    
int 
main ()
{
    // car6 x y z
    // colored_cloud x y z rbga
    pcl::PointCloud::Ptr cloud (new pcl::PointCloud);
    pcl::io::loadPCDFile ("colored_cloud.pcd", *cloud);
    
    pcl::visualization::CloudViewer viewer("Cloud Viewer");
    
    //blocks until the cloud is actually rendered
    viewer.showCloud(cloud);
    
    //use the following functions to get access to the underlying more advanced/powerful
    //PCLVisualizer
    
    //This will only get called once
    viewer.runOnVisualizationThreadOnce (viewerOneOff);
    
    //This will get called once per visualization iteration
    viewer.runOnVisualizationThread (viewerPsycho);
    while (!viewer.wasStopped ())
    {
    //you can also do cool processing here
    //FIXME: Note that this is running in a separate thread from viewerPsycho
    //and you should guard against race conditions yourself...
    user_data++;
    }
    return 0;
}

/*
http://pointclouds.org/documentation/tutorials/cloud_viewer.php
http://pointclouds.org/documentation/tutorials/pcl_visualizer.php
http://docs.pointclouds.org/1.7.0/structpcl_1_1_point_x_y_z_r_g_b.html
*/

CMakeLists.txt

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

project(cloud_viewer)

# set bin folder
set(CMAKE_BINARY_DIR ${CMAKE_SOURCE_DIR}/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR})
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR})

find_package(PCL 1.8.1 REQUIRED)

#message( [***] ${PCL_INCLUDE_DIRS})
#message( [***] ${PCL_LIBRARY_DIRS})
#message( [***] ${PCL_DEFINITIONS})
#message( [***] ${PCL_LIBRARIES})

include_directories(${PCL_INCLUDE_DIRS})
link_directories(${PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS})

add_executable (cloud_viewer cloud_viewer.cpp)
target_link_libraries (cloud_viewer ${PCL_LIBRARIES})

compile

mkdir build
cd build 
cmake ..
make

run demo

bin folder

$ tree bin/

bin/
├── cloud_viewer
└── colored_cloud.pcd

0 directories, 2 files

run demo

./cloud_viewer

Code Example

Pcd write

see Part-4: Install and Configure PCL 1.8.1 with vtk qt support on windows 10 from source

Reference

  • compile pcl on posix
  • pcl on ubuntu 16.04
  • compile pcl on windows
  • vcpkg

for windows

  • compiling pcl on windows
  • compiling pcl dependencies on windows
  • coding pcl viewer
  • SSE AES

History

  • 20180105: created.
  • 20180227: rewrite pcl compile part.

Copyright

  • Post author: kezunlin
  • Post link: https://kezunlin.me/post/137aa5fc/
  • Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 3.0 unless stating additionally.

你可能感兴趣的:(c++)