注:仅红色为编译通过的过程。
最终确定版本:ubuntu16.04+vtk7.1.1,opencv3.4.0+opencv_contrib-3.4.0,PCL1.8.1
参考:
VT安装参考链接:
https://blog.csdn.net/dell5200/article/details/81142951
opencv多版本安装与配置参考链接:
https://blog.csdn.net/llfjcmx/article/details/81238766
https://blog.csdn.net/zhangjunhit/article/details/85156760
pcl源码安装参考链接:
https://blog.csdn.net/sinat_28752257/article/details/79169647
rosKinect安装参考链接:(见下一节)
在安装opencv及opencv contrib扩展库时,总是因为VTK无法make成功,于是把pcl、vtk等都删掉,按照vtk、opencv、pcl、ros等顺序再次配置slam工作环境。报错如下:
提示vtk相关的问题:invalid use of incomplete type 'class vtkTexture'等等的内容。。。完全不懂为什么!!!
多次调试无果,决定来次安装大换血。(小白对安装编译等原理不是很懂,只是硬碰硬的去尝试,请众大神多指教讲解原因)
尝试输入了如下指令(慎用,否则roskinect需要重新装)
sudo apt-get autoremove vtk
之后VTK才再次安装成功。
一、VTK安装
版本:VTK8.2.0
在 http://www.vtk.org/download/ 下载了VTK-8.2.0库,解压到了根目录下(VTK-8.2.0);
1. 安装ccmake 和 VTK 的依赖项:
sudo apt-get install cmake-curses-gui
sudo apt-get install freeglut3-dev
2. 配置VTK :
cd VTK-8.2.0
mkdir build
cd build
ccmake .
此时会弹出窗口,
# 按照VTK tutorial要求,每设置完一项均按'c'进行一次configuration,直到所有项目设置完,
BUILD_SHARED_LIBS = ON
BUILD_TESTING = ON # 默认OFF,如果打开的话,编译时会由于下载测试数据所用url过旧而报错,建议OFF
CMAKE_BUILD_TYPE = Release # 默认Debug运行会较慢
CMAKE_INSTALL_PREFIX = /usr/local # 这里用默认就行,或者改到想要安装的位置
# 以下为高级设置,需先在命令行按't'才可见
VTK_FORBID_DOWNLOADS = ON # 默认OFF,建议打开,否则编译会报错,理由同BUILD_TESTING
# 此时应已经出现'g' generating 的按键选项,按 'g' 即完成配置.
保存配置,退出,然后:
sudo make -j8
sudo make install
这样顺利安装好了vtk。在没卸载vtk的时候,再次安装总是提出错误,最后选择了卸载重装(也有可能与上面高级配置的选择有关)。
二、opencv及opencv_contrib安装
然后重新安装opencv,之前安装了opencv3.4.0(不包括扩展库contrib),尝试后依然是原来的错误。(若多次尝试后仍不行,则计划更换VTK版本);
pkg-config --modversion opencv
通过该指令查看当前安装的opencv版本,我这里是3.4.0;
现在想尝试安装多opencv版本(opencv3.4.0、opencv4.1.0,因为怀疑是VTK版本与opencv版本不匹配的问题,但暂时不想删掉原来的版本)。
opencv源码下载地址:https://opencv.org/releases/
opencv contrib源码下载地址:https://github.com/opencv/opencv_contrib/releases
下载好了opencv4.1.0及对应的opencv_contrib-4.1.0,分别解压,将opencv源码放到根目录下的opencv4.1文件夹,讲解压后的opencv_contrib-4.1.0放到opencv4.1文件目录下。
opencv依赖库在之前就已安装过:
sudo apt-get install build-essential libvtk5-dev
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
sudo apt-get install build-essential qt5-default ccache libv4l-dev libavresample-dev libgphoto2-dev libopenblas-base libopenblas-dev doxygen openjdk-8-jdk pylint libvtk6-dev
sudo apt-get install pkg-config
安装好依赖库后,准备安装opencv4.1.0:
cd opencv4.1
mkdir build
cd build
sudo cmake -D WITH_VTK=ON -D VTK_DIR=/home/angel/VTK-8.2.0/build -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4.1 ENABLE_CXX11=YES OPENCV_EXTRA_MODULES_PATH=/home/angel/opencv/opencv_contrib-4.1.0/modules/ ..
因为我们还安装了opencv-contrib,所以还有一个OPENCV_EXTRA_MODULES_PATH 这个变量名,后面要跟上你自己的路径名,记得修改一下。
并且根据小六老师的指导,在这里也加入了VTK build 路径的指定:VTK_DIR= /XXX/VTK/build -D
(这部分也可以采用cmake-gui的方式,参考链接 https://blog.csdn.net/zhuhan_june/article/details/79830048 ,这里不再讲述。)
显示
configuring done
generating done
开始重要的一步尝试:
sudo make -j8
漫长的等待,期待成功,每次运行到41%左右的时候简直会慌的一批,期望不要再失败,阿弥陀佛。。。
编译成功!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
此时必须来雪饼!此时必须来棉花糖!此时必须来酸奶!此时必须要夹肉!!!!!!!!!
接下来:
sudo make install
至此,opencv4.1及opencv_contrib安装结束。但是在/usr/local/opencv4.1下仅有bin、include、lib与share文件夹,未找到pkgconfig文件目录。在cmake时,未指定生成pkgconfig文件————重装!!!!
奇怪的是,之前用cmake指令可以编译opencv_contrib(未报错),此次想要通过cmake-gui的方式,规定安装到的目录CMAKE_INSTALL_PREFIX(/usr/local/opencv4.1)、CMAKE_BUILD_TYPE 值为RELEASE、OPENCV_ENABLE_NONFREE 选中(SURF 专利问题)、勾选OPENCV_GENERATE_PKGCONFIG。点击Generate生成配置文件,OPENCV_EXTRA_MODULES_PATH处为/home/angel/opencv4.1/opencv_contrib-4.1.0/modules,再次点击Generate生成配置文件,始终报错(该问题在opencv3.4.0里就不存在,但opencv3.4.0与我目前安装的vtk8.2.0似乎不能兼容)。
大概真的是五行缺电脑,棉花糖吃早了~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
更换opencv及contrib库版本为4.0.0,将cmake-gui的以上参数改为对应的4.0.0版本及路径,cmake过程没有出错。
新建好目录/usr/local/opencv4.0 ;
将opencv4.0与opencv_contrib-4.0.0压缩包解压,在/home/angel/opencv4.0内放置解压后的opencv4.0.0的文件,并讲解压后的文件夹opencv_contrib-4.0,0放入该文件夹(/home/angel/opencv4.0),在/home/angel/opencv4.0文件夹内新建build文件夹 。
//此次仍采取cmake-gui的方式 :
选择源文件/home/angel/opencv4.0 、/home/angel/opencv4.0/build ;
规定安装到的目录CMAKE_INSTALL_PREFIX(/usr/local/opencv4.0)、CMAKE_BUILD_TYPE 值为RELEASE、OPENCV_ENABLE_NONFREE 选中(SURF 专利问题)、勾选OPENCV_GENERATE_PKGCONFIG、勾选BUILD_opencv_world。其他不做修改,点击Generate生成配置文件;
在OPENCV_EXTRA_MODULES_PATH处设置为/home/angel/opencv4.1/opencv_contrib-4.1.0/modules,再次点击Generate生成配置文件 ;
显示configuring done;generatingdone.
//至此cmake成功。
cd ~
cd opencv4.0
cd build
sudo make -j8
sudo make install
//需等待较长的时间。
至此,opencv4.0.0与opencv_contrib-4.0.0安装完毕。检查/usr/local/opencv4.0内的文件,pkgconfig、xfeatures2d、nonfree.hpp等目前需要的文件都是齐全的。
将之前安装的opencv4.1.0等相关文件清除掉。
现在电脑上装了两个版本的opencv(3.4.0不带扩展库与4.0.0带扩展库contrib),需要做一些配置。
配置opencv环境变量
1、安装成功后还需要设置opencv的环境变量。打开文件:
sudo gedit /etc/ld.so.conf.d/opencv.conf
2、将以下内容添加到最后:
/usr/local/opencv4/lib
3、接下来配置动态库:
sudo ldconfig
4、更改环境变量:
sudo gedit /etc/bash.bashrc
在文件后添加
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv4.0/lib/pkgconfig
export PKG_CONFIG_PATH=/usr/local/opencv4.0/lib
保存之后,source一下(不进行source也可以,重新开一个终端):
source /etc/bash.bashrc
查看opencv的版本没有变化:
pkg-config --modversion opencv
默认版本依然是3.4.0,没有什么变化,但应该没有影响。
下面尝试代码,看头文件能否找到。
当需要使用opencv4.0.0时,在工程文件下的CMakeLists.txt中加入下面几行:
set(OpenCV_DIR /usr/local/opencv4.0/share/OpenCV4)#使用opencv3.4.0时该句去掉
find_package(OpenCV 4.0 REQUIRED) #默认是find_package(OpenCV REQUIRED)
include_directories(SYSTEM ${OpenCV_INCLUDE_DIRS}
"/usr/local/opencv4.0/include/opencv4" )#使用opencv3.4.0时该句去掉
用该方法即可实现opencv版本的切换使用,并可使用nonfree等头文件,进行SURF/SIFT的使用。
可以愉快的继续处理视觉里程计代码了。
因为卸载了PCL、ros等,现在开始重新配置安装。
三、PCL源码安装
按照书上的指令,这种ppa安装方式并不适合Ubuntu16.04的系统,需采用源码安装。
之前下下载好了PCL:源码在https://github.com/PointCloudLibrary/pcl.git网页下载,然后解压到Home目录
再按照http://pointclouds.org/documentation/tutorials/compiling_pcl_posix.php上步骤操作,
如下:
位置是/home/angel/pcl
yilaikucankao:
https://blog.csdn.net/lilywri823/article/details/86583269
则:
cd pcl
mkdir build
cd build
cmake ..
make -j4
sudo make -j4 install
至此安装完成,可以用第五讲拼接点云代码测试,也可以用网络上的这段代码测试:
//pcl_test.cpp
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv)
{
std::cout << "Test PCL !!!" << std::endl;
pcl::PointCloud::Ptr point_cloud_ptr (new pcl::PointCloud);
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(r) << 16 |
static_cast(g) << 8 | static_cast(b));
point.rgb = *reinterpret_cast(&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_text)
FIND_PACKAGE( PCL REQUIRED COMPOMENT common io visualization)
INCLUDE_DIRECTORIES(${PCL_INCLUDE_DIRS})
LINK_DIRECTORIES(${PCL_LIBRARY_DIRS})
LINK_DIRECTORIES(/usr/local/include/pcl-1.9/)
#INCLUDE_DIRECTORIES( "/home/angel/pcl/" "/home/angel/pcl/")
ADD_DEFINITIONS(${PCL_DEFINITIONS})
ADD_EXECUTABLE(pcl_test pcl_text.cpp)
TARGET_LINK_LIBRARIES(pcl_test ${PCL_LIBRARIES})
INSTALL(TARGETS pcl_test RUNTIME DESTINATION bin)
若成功,则PCL编译成功。
四、ROS编译安装
目前主要用到Realsense 所需的ros wrapper 与lego-loam代码所需的ros环境。相关内容见下一篇内容。