因为工作中要进行点云数据的显示,因此要安装python-pcl
,网上搜了很多教程,但是安装中还是遇到很多问题,这里把自己遇到的和可能遇到的问题总结一下。
环境:Ubuntu:14.04 python:2.7.6 pcl:1.7.0
网上的安装方法如下:
首先安装PCL模块,我们要使用python-pcl
依赖于PCL模块:
sudo apt-get install software-properties-common python-software-properties
sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-all
然后是安装其他的依赖模块:
sudo apt-get install python-pip
sudo apt-get install python-dev
sudo pip install Cython==0.25.2
sudo pip install numpy
sudo apt-get install git
git clone https://github.com/strawlab/python-pcl.git
cd python-pcl/
python setup.py build_ext -i
python setup.py install
最后两条命令在执行时提示权限问题需要加sudo
,耗时较长,可能会遇到以下问题:
执行python setup.py build_ext -i
时报错
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++ [enabled by default]
virtual memory exhausted: 无法分配内存
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
网上的解决方法是创建一个文件这样的,我试了以下,问题没有解决。
执行python setup.py install
时报错
cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++ [enabled by default]
#warning "Using deprecated NumPy API, disable it by " \
^
pcl/
x86_64-linux-gnu-gcc: internal compiler error: 已杀死 (program cc1plus)
Please submit a full bug report,
with preprocessed source if appropriate.
See for instructions.
error: command 'x86_64-linux-gnu-gcc' failed with exit status 4
我是参考这里。修改setup.py文件,添加以下内容:
import os
from distutils.sysconfig import get_config_vars
(opt,) = get_config_vars('OPT')
os.environ['OPT'] = " ".join(
flag for flag in opt.split() if flag != '-Wstrict-prototypes'
)
可是依然报错!!
执行cmake
时提醒版本过低:
按照这个进行升级,升级之后查看版本cmake --version
又报错:
CMake Error: Could not find CMAKE_ROOT !!!
CMake has most likely not been installed correctly.
Modules directory not found in
/usr/local/bin
段错误 (核心已转储)
查找原因说要卸载重装,于是卸掉cmake
又重装。再次查看cmake
版本,提示bash: /usr/bin/cmake: 没有那个文件或目录
。因为直接使用cmake
系统会到默认的/usr/bin
中去寻找,但是安装的cmake
是在/usr/local/bin
中,所以当然不会找到,解决方法是做一个链接即可:ln -s /usr/local/bin/cmake /usr/bin
。
执行make
时报错:c++: internal compiler error: killed (program cc1plus)
,原因是系统没有交换分区, 编译过程中内存耗尽, 导致了编译中断,解决方式是增加一个交换分区:按照这个执行,命令前需要加sudo
确保权限。然后再执行make
命令。
上面就是按照网上的一些说明进行的,遇到问题就去查解决方法,但是最后也没装好python-pcl
,于是转为按照官方的方法安装。
再次尝试
python-pcl
的GitHub地址,下面对于不同操作系统、不同python版本需要安装的依赖和方法都有说明。我用的Ubuntu 14.04,根据这个说明我应该先安装:
Python 2.7.6, 3.4.0, 3.5.2
pcl 1.7.0
Cython <= 0.25.2
并且下面有安装pcl模块的命令:
sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl -y
sudo apt-get update -y
sudo apt-get install libpcl-all -y
然后是pip
模块的安装:
pip install --upgrade pip
pip install cython==0.25.2
pip install numpy
最后是python-pcl
模块的安装:
git clone https://github.com/strawlab/python-pcl.git # 获取python-pcl,然后解压缩
cd python-pcl
# 执行下面的两条命令之前可以先阅读一下下面的问题
python setup.py build_ext -i
python setup.py install
最后的耗时较长,执行完就算是安装好了,首先进行一下测试,在python程序中import pcl
,如果没有问题,就表示安装成功了。
后续问题:
安装完成后,运行例子,import pcl
正常,但是pcl.pcl_visualization
模块无法导入,按照这个尝试进行解决。
第556行根据vtk版本取消对应两行的注释,不清楚版本可以根据路径到对应目录下查看。取消第560和561行的注释:
ext_args['include_dirs'].append('/usr/include/vtk-5.8')
ext_args['library_dirs'].append('/usr/lib')
第615行if
判断语句,根据PCL版本取消注释对应版本下的:
Extension("pcl.pcl_visualization", ["pcl/pcl_visualization.pyx"], language="c++", **ext_args)
然后运行python程序,依然报ImportError: No module named pcl_visualization
的错误,重新执行最后两条命令后模块导入正常。
主要是通过python-pcl
读取PCD点云文件并显示,通过pcl.load(filename.pcd)
可以读取PCD文件的点云数据,然后通过pcl.pcl_visualization
将点云显示出来,具体代码可以查看一下网上的示例。
因为使用的数据是从雷达采集的数据生成的,有一些点的数值是异常的,在坐标系下的偏差很大,这样导致点云图上只形成了“两个点”。比如有10000个点,但是有1个点的值是有偏差的,这样在显示时,那9999个正常的点都聚集在了一起,于是可视化界面看到的就是“两个点”,因此在向PCD文件写入数据时要注意异常点的处理。
说道这里再介绍一下PCD文件,PCD文件是有固定格式的,包含头信息和数据信息,网上介绍的很详细,这里不再解释,只是要说一下里面的WIDTH
、HEIGHT
、POINTS
三个参数。
对于有序点云,WIDTH
表示点云数据集的宽度,HEIGHT
表示数据集的高度,即点云的行列数,二者的乘积就是点云中点的数量,也就是POINTS
的值。
对于无序点云,WIDTH
代表了点云中点的个数,和POINTS
参数的值相同,HEIGHT
设置为1。
在使用python-pcl
读取点云PCD文件时,要保证WIDTH
和HEIGHT
的值的乘积等于POINTS
的值,并且和PCD文件中点的数量相等,否则会读取失败。在写PCD文件时,一般会先将点云的数目赋给WIDTH
和POINTS
,完成PCD文件头信息的内容。再写入数据信息时,异常点被处理掉不会写入,那么就会造成PCD文件点的数量和头信息的值不符,导致读取失败,要加以注意。