系统信息:
ubuntu16.04
i7 GTX860m
过程:
首先从网上找到一份实现Kintinuous代码:
https://github.com/mp3guy/Kintinuous
阅读readme 可知运行Kintinuous需要依赖:
Cmake #允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件
OpenGL#图形库
CUDA>= 7.0(https://developer.nvidia.com/cuda-downloads)#gpu加速运算库
OpenNI2(https://github.com/occipital/OpenNI2)#OpenNatural Interaction搭建视觉和音频传感器与视觉和音频感知中间件通信的桥梁。
SuiteSparse#稀疏矩阵处理工程,是一组C、Fortran和MATLAB函数集
Eigen#C++矩阵运算库
Boost#可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一
zlib#提供数据压缩用的函式库
libjpeg#处理JPEG图像数据格式的自由函式库
OpenCV(http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip)
DLib(https://github.com/dorian3d/DLib) @330bdc10576f6bcb55e0bd85cd5296f39ba8811a#机器学习库,有c++和Python两个版本,这里用的是c++版本 注意@后面是版本号,装错版本让编译过程收到极大的阻碍
DBoW2(https://github.com/dorian3d/DBoW2) @4a6eed2b3ae35ed6837c8ba226b55b30faaf419d#Bags of binary wordsfor fast place recognition in image sequence,使用的特征检测算法为Fast,描述子使用的是brief描述子,是一个视觉词袋库,它提供了生成和使用词典的接口
DLoopDetector(https://github.com/dorian3d/DLoopDetector) @84bfc56320371bed97cab8aad3aa9561ca931d3f#基于DBoW2构建和使用视觉词典,并且添加了回环检测算法模块和验证模块,是一个完整的回环检测/拓扑制图系统。
iSAM(http://people.csail.mit.edu/kaess/isam/)#IncrementalSmoothing and Mapping递增平滑与地图构建算法
PCL(http://pointclouds.org/)#点云库,实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。
Pangolin(https://github.com/stevenlovegrove/Pangolin)#处理opengl 显示 交互和提取视频输入的库
通过apt-getinstall 可以安装大部分的依赖:
sudo apt-get install g++ cmake cmake-gui doxygen mpi-default-devopenmpi-bin openmpi-common libflann-dev libeigen3-dev libboost-all-devlibvtk5-qt4-dev libvtk6.2 libvtk5-dev libqhull* libusb-dev libgtest-dev Git-core freeglut3-dev pkg-config build-essentiallibxmu-dev libxi-dev libusb-1.0-0-dev graphviz mono-complete qt-sdk
本机之前装了Oracle的Java,这里没有安装openjdk-7-jdkopenjdk-7-jre,具体装法可以参考:Ubuntu 安装 JDK 7 / JDK8 的两种方式
ubuntu 安装jdk 的两种方式:
1:通过ppa(源) 方式安装.
2:通过官网下载安装包安装.
这里推荐第1种,因为可以通过 apt-get upgrade 方式方便获得jdk的升级
使用ppa/源方式安装
1.添加ppa
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
2.安装oracle-java-installer
jdk7
sudo apt-get install oracle-java7-installer
jdk8
sudo apt-get install oracle-java8-installer
安装器会提示你同意 oracle 的服务条款,选择 ok
然后选择yes 即可
如果你懒,不想自己手动点击.也可以加入下面的这条命令,默认同意条款:
JDK7 默认选择条款
echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
JDK8 默认选择条款
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
接下会是等待(依个人网速定)
如果你因为防火墙或者其他原因,导致installer 下载速度很慢,可以中断操作.然后下载好相应jdk的tar.gz 包,放在:
/var/cache/oracle-jdk7-installer (jdk7)
/var/cache/oracle-jdk8-installer (jdk8)
下面,然后安装一次installer. installer 则会默认使用 你下载的tar.gz包
3.设置系统默认jdk
JDk7
sudo update-java-alternatives -s java-7-oracle
JDK8
sudo update-java-alternatives -s java-8-oracle
如果即安装了jdk7,又安装了jdk8,要实现两者的切换,可以:
jdk8 切换到jdk7
sudo update-java-alternatives -s java-7-oracle
jdk7 切换到jdk8
sudo update-java-alternatives -s java-8-oracle
4.测试jdk 是是否安装成功:
java -version
javac -version
直接下载jdk压缩包方式安装(这里只介绍jdk7的,jdk8 的原理完全一致)
分为下面5个步骤
1.官网下载JDK
2.解压缩,放到指定目录
3.配置环境变量
4.设置系统默认JDK
5. 测试jdk
1.官网下载JDK
地址: http://www.oracle.com/technetwork/articles/javase/index-jsp-138363.html
选择相应的 .gz包下载
2.解压缩,放到指定目录(以jdk-7u60-linux-x64.gz为例)
创建目录:
sudo mkdir /usr/lib/jvm
加压缩到该目录:
sudo tar -zxvf jdk-7u60-linux-x64.gz -C /usr/lib/jvm
3.修改环境变量:
sudo vim ~/.bashrc
文件的末尾追加下面内容:
#set oracle jdk environment
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0_60 ## 这里要注意目录要换成自己解压的jdk 目录
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
使环境变量马上生效
source ~/.bashrc
4.设置系统默认jdk 版本
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.7.0_60/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.7.0_60/bin/javac 300
sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.7.0_60/bin/jar 300
sudo update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/jdk1.7.0_60/bin/javah 300
sudo update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk1.7.0_60/bin/javap 300
然后执行:
sudo update-alternatives --config java
若是初次安装jdk,会有下面的提示
There is only one alternative in link group java (providing /usr/bin/java):
/usr/lib/jvm/jdk1.7.0_60/bin/java
否者,选择合适的jdk
5.测试jdk
java -version
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b19)
Java HotSpot(TM) 64-Bit Server VM (build 24.60-b09, mixed mode)
jdk 安装成功
ubuntu两种下安装jdk7 jdk8 的方式介绍完毕。
其余不能通过apt-get安装的库:
首先需要装显卡驱动:
去官网查适合自己计算机的显卡驱动
http://www.nvidia.cn/Download/index.aspx?lang=cn
查询对应显卡对应的驱动,替代命令中的版本号
sudo apt install nvidia-375 nvidia-settings nvidia-prime#prime是为了解决可能出现装了驱动后无法登陆ubuntu的问题
安装完成后重启:
证明驱动已装。
接下来装cuda。
去cuda官网下驱动。适合ubuntu16.04的为cuda8.0
sudo sh cuda_8.0.27_linux.run
下载安装完,跑例子:
证明cuda成功。
安装pcl:
从github下载下载源码编译。
git clonehttps://github.com/PointCloudLibrary/pcl.git
cd pcl
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release-DBUILD_GPU=OFF -DBUILD_apps=OFF -DBUILD_examples=OFF ..
make -j4#取决于你的cpu的核的数量
sudo make install
sudo ldconfig#动态链接库管理命令。,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。在运行这个命令时报了一个错。
OpenNI2:
$ git clonehttps://github.com/occipital/OpenNI2
$ cdOpenNI2
$ make -j4
由于没有生成cmake_install.cmake文件,所以不能/usr/lib中找到此库,在编译Kintinuous时需要手动把此库的lib和libOpenNI2.so地址加入。
Opencv:
从opencv官网下载2.4.9版本(http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/2.4.9/opencv-2.4.9.zip),到目录下
mkdir build
cd build
cd cmake ..
make
sudo makeinstall
DLib, DBoW2, DLoopDetector, iSAM and Pangolin的安装方法也类似,下载对应源码后输一次上述命令即可。
需要注意的是,我在下载dlib时,github上有两个版本,一个星数高的没有提供install文件,需要自己更改Kintinuous的makelist文件。另外一个即是本文提供的超链接,提供了install省了不少事,但是卸载的时候就比较头疼。诸位自己取舍。
还有一点是Dlib,DBoW2,DLoopDetector在下载是要选择旧版本(点击tag可以选),不然编译时会出很多错。
装完依赖库后,最后就是编译Kintinuous了。
Kintinuous:
从github下载Kintinuous
cmake 编译,可以选用gui版本方便选择参数。
第一次编译过程出现找不到opencv_dep_cudart,在编译kintinuous的时候加入-D CUDA_USE_STATIC_CUDA_RUNTIME=OFF;
在编译
此时把对应地址补上。编译即可成功。
去到生成的文件夹中,运行make
生成 Kintinuous。从here(http://www.cs.nuim.ie/research/vision/data/loop.klg)下载数据loop.klg
运行例子
./Kintinuous -s 7 -v ../vocab.yml.gz -l loop.klg -ri -fl -od#vocab.yml.gz在master目录下
第一次出现
Segmentation fault (core dumped)
第一反应是完了还要去检查源码,心情绝望。
后面看项目的issue
看到有人在跑例子时也遇到问题,虽然他有报具体的错误,不过还是按照里面的该法试了一下。具体做法:
改Kintinuous/src/CMakeLists.txt,
把61 加到set(CUDA_ARCH_BIN "20 30 35 50 52 " CACHE。。这句
改成:set(CUDA_ARCH_BIN "20 30 35 50 52 61" CACHE STRING
再次编译build
例子成功运行。
以上编译完成。
下面记录自己遇到的问题。
第一次没有按教程跑代码,采取直接编译Kintinuous,遇到问题直接解决的思路。
遇到DLib 问题:
去下dlib的库:
https://github.com/davisking/dlib
根据网上资料:
如果要自己建立工程,可以仿照dlib/examples/CMakeLists.txt,直接include(dlib/dlib/cmake)文件即可,如下:
cmake_minimum_required(VERSION 2.8.4)
PROJECT(dlib_test)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=C++11-O2")
IF(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything")
ELSEIF(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall-Wextra")
ENDIF()
INCLUDE(/home/hpc/Michael/dlib/dlib/cmake)
ADD_EXECUTABLE(dlib_test dlib_test.cpp)
TARGET_LINK_LIBRARIES(dlib_test dlib)
然而修改了Kintinuous的cmake文件依然报错。
尝试编译c++例子:
经查询:
在CMakeLists.txt中找到
find_package(OpenCV QUIET)
前面加上set(CUDA_USE_STATIC_CUDA_RUNTIMEOFF)
例子编译执行成功,证明dlib库没问题
但cmake依然报错。应该是库没有安装到系统所以Kintinuous找不到dlib的配置文件。
换一种思路。
文档上让我们编译例子,因为例子要用到所下载的库,可以通过看例子的CMakeLists.txt来学习如何在外部文件中使用dlib库。
把dlib的绝对路劲写死进去,更改cmakelist,修改的比较多,由于时间所限没有继续实行下去,改为按照教程走。
总结:
本次实验依赖的大量库都需要自己从网上下载后编译,对cmake的用法有了一定的了解。
但对cmkelist语法不熟悉,不能自主改cmakelist以适应需求。
其次我学会了利用github中的issue。遇到问题直接搜索得到的答案没有针对性。但issue中的问题就很有参考价值。很多问题的表现形式虽然不同,但解决方法相似,要好好利用。