Ubuntu18.04安装python-pcl

Ubuntu18.04安装python-pcl

需求: 通过安装python-pcl库, 可以使用pcl中的某些函数。例如, 使用open3d 读取pcd文件时,只保留xyz信息,无法获取强度值。故采用python-pcl中的函数 load 进行读取。
参考:Ubuntu 18.04安装python-pcl 解决ImportError: libpcl_keypoints.so.1.7问题

一. 当前环境

  • Ubuntu18.04
  • python3.6

二. 安装记录

1. 试错过程

首先按照参考文的里面的过程,一路顺利。但是测试时,在python中import pcl时,出现新的错误,在博文问题中也有人问到相同的问题,错误如下:

import pcl
undefined symbol: _ZN3pcl6search6KdTreeINS_12PointXYZRGBAENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEE13setInputCloudERKN5boost10shared_ptrIKNS_10PointCloudIS2_EEEERKNSA_IKSt6vectorIiSaIiEEEE

猜测原因:库在使用过程中链接了错误的版本,导致出现了未定义的符号。

2. 正确安装流程

2.1 安装pcl点云库,Ubuntu18.04默认安装1.8版本的pcl

sudo apt-get install libpcl-dev pcl-tools

2.2 使用源码方式,安装VTK7.1版本

  • 先安装opengl
sudo apt-get install libgl1-mesa-dev #需要先安装opengl
sudo apt-get install libxt-dev
  • 下载VTK7.1.1源码
    登录 https://vtk.org/download/ ,下载 An Earlier Release (7.1.1)中,Platform: source 下面的VTK-7.1.1.tar.gz。

  • 解压与编译、安装

tar -xf VTK-7.1.1.tar.gz
mkdir build
cd build && cmake ..
make -j8
sudo make install

注意安装完成后,VTK安装位置如下

/usr/local/include/vtk-7.1  #包含目录,头文件所在 
/usr/local/lib   # 动态库目录

2.3 使用源码方式,安装python-pcl

  • 先删除第一步试错安装的pcl
    这一步骤很重要,否则后期依旧会报未定义符号的错误,例如我这次使用conda的虚拟环境,删除pcl
rm -rf /home/cui/anaconda3/envs/learning3d/lib/python3.6/site-packages/pcl/
  • 下载python-pcl
git clone https://github.com/strawlab/python-pcl.git(原版,如果速度慢请使用下面的)
git clone https://gitee.com/lucy2020/python-pcl.git
  • 修改配置
    在setup.py文件中,修改三处,分别如下,这里修改了vtk版本与上面安装vtk的包含目录与库目录。
修改726行为:vtk_version = '7.1'
修改729行为:vtk_include_dir = os.path.join('/usr/local/include/vtk-' + vtk_version)
修改730行为:vtk_library_dir = os.path.join('/usr/local/lib')
  • 编译与安装
python setup.py build_ext -i
python setup.py install

三. 结果

可以正常在python3.6环境中愉快的使用pcl了,如下面的小例子,点云数据转换为numpy:

import numpy as np
import pcl
p = pcl.PointCloud(10)  # "empty" point cloud
a = np.asarray(p)       # NumPy view on the cloud
a[:] = 0                # fill with zeros
print(p[3])             # prints (0.0, 0.0, 0.0)
a[:, 0] = 1             # set x coordinates to 1
print(p[3])             # prints (1.0, 0.0, 0.0)

你可能感兴趣的:(环境配置,python,自动驾驶,开发语言)