-->

ubuntu16.04 orbslam 安装笔记

Posted on By Marquis

前言

今天在ubuntu16.04装了orbslam,第一次安装,踩了很多坑,装好之后能make成功了才想起来记笔记,当然其中很多坑都忘记啦……
大体原则就是根据ORB_SLAM 的安装步骤以及出错信息去搜索解决。

现在用的虚拟机是 这里 搭的。
具体环境:

  • 以前安装的opencv 版本:3.4.1,目测这个opencv的版本不重要
  • 还有anaconda的python2,目测这个Python也不重要

安装步骤

按照 官方教程,一步步来吧
这里为了方便,我稍微打乱官方的顺序,不过应该不影响编译。

获取源代码

` git clone https://github.com/raulmur/ORB_SLAM.git ORB_SLAM`

然后创建build目录,并进去:

 mkdir build
 cd build

以下均假定我们在build目录。

eigen 的处理

两种处理方式,其中第一种方式处理的更好

第一种(推荐)

根据在Ubuntu16.04(ROS-kinetic)上编译测试ORB-SLAM1和ORB-SLAM2的介绍,Ubuntu16.04安装的Eigen库与源码自带的g2o库产生了一些不兼容的问题,因此需要
打开ORB_SLAM1/Thirdparty/g2o/g2o/solvers文件夹下的linear_solver_eigen.h文件,
找到typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic, SparseMatrix::Index> PermutationMatrix;
将其改为typedef Eigen::PermutationMatrix<Eigen::Dynamic, Eigen::Dynamic> PermutationMatrix;

第二种(更改 eigen 为 3.2.0 版本)

以前我们用sudo apt install libeigen3-dev装的eigen,不过在编译 ORB_SLAM 的时候会出现以下错误:

usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h:119:9: error: ‘YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY’ is not a member of ‘Eigen::internal::static_assertion<false>’

根据ORB_SLAM installation on Ubuntu Xenial 16.04的指示,我们的eigen版本有点太高了,要安装 3.2.0 才行啊,需要从 https://launchpad.net/ubuntu/trusty/amd64/libeigen3-dev/3.2.0-8 下载deb文件,并手动安装:
sudo dpkg -i libeigen3-dev_3.2.0-8_all.deb
它会提示我们:

dpkg: warning: downgrading libeigen3-dev from 3.3~beta1-2 to 3.2.0-8

注:

若果不按照第一种方式改g2o的代码,而是先用最高版eigen编译g2o然后用第二种方法把eigen版本降低的话,可能会出现能正常编译,但跑 rosbag play Example.bag的时候只能显示关键帧,没跑出地图(这是我的case,我发现别人使用第二种方式也正常跑出来了)的情况。 我不去自己试了,反正可能会出现问题。

安装boost

sudo apt-get install libboost-all-dev

注:
在link的时候有可能提示找不到boost,这时候就需要手动将boost的库文件加进来了,具体步骤:
先拷贝:

  • 运行 locate boost_system,得到 /usr/lib/x86_64-linux-gnu/libboost_system.so.1.58.0,其实同目录还有一个不带后边数字的库文件,因此只需要将其添加到lib目录即可: cp /usr/lib/x86_64-linux-gnu/libboost_system.so ../lib/
  • 同理,运行locate boost_filesystem,然后cp /usr/lib/x86_64-linux-gnu/libboost_filesystem.so ../lib/

然后在Cmakelists.txt中加入库目录:

target_link_libraries(${PROJECT_NAME}
${OpenCV_LIBS}
${EIGEN3_LIBS}
${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so
${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so
${PROJECT_SOURCE_DIR}/lib/libboost_filesystem.so
${PROJECT_SOURCE_DIR}/lib/libboost_system.so
)

后两行的.so是我们新加的哈。

安装ros

由于Xenial支持 ROS Kinetic,因此安装 ROS Kinetic 就行了,根据这里的指示,
先:

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

这样,我们的电脑就允许从packages.ros.org安装软件啦。

设置keys:
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

让 Debian package index 保持最新:
sudo apt-get update

安装Desktop-Full Install (Recommended),这个东西包含了 ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception:
sudo apt-get install ros-kinetic-desktop-full

这个东西装了我好长时间,有一个多小时吧,痛苦。

初始化rosdep,并更新:

sudo rosdep init
rosdep update

在每一次打开一个bash会话时都自动将ROS 的环境变量加进去:

echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

安装其他包(不知道有啥用):
sudo apt-get install python-rosinstall python-rosinstall-generator python-wstool build-essential

将 ORB-SLAM 目录加到 ROS_PACKAGE_PATH 这个环境变量中

也就是修改 .bashrc 文件

echo "export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/marquis/Documents/ORB_SLAM" >> ~/.bashrc
source ~/.bashrc

opencv 依赖的处理

由于我们用的是ROS Kinetic,自带了opencv3,因此需要将opencv的依赖从 manifest.xml 文件中去掉,即:

  1. 删掉 这一行 <depend package="opencv2"/>
  2. 然后在/ORB_SLAM/src/ORBextractor.cc 的首部加入 #include <opencv2/opencv.hpp>

编译 g2o. Go

进入 Thirdparty/g2o/
执行

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make 

编译 DBoW2. Go

进入 Thirdparty/DBoW2/
执行

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make  

正式编译啦

mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make

正式编译遇到的问题及解决方法

编译 orbslam的时候可能会提示没有 rospkg

这个具体忘了,只记得一点点了。

直接安装即可:
pip install rospkg

另一个奇怪的错误

ImportError: cannot import name _remove_dead_weakref [rospack] Error: could not find python module ‘rosdep2.rospack’.

我在python里明明可以 import rosdep2.rospack
这里 给出了解决方案,即切回系统自带的python即可:
` export PATH=/usr/bin:$PATH`

运行 步骤

下载测试用例

可以从两个地方下载

  • http://webdiis.unizar.es/~raulmur/orbslam/downloads/Example.bag.tar.gz
  • https://drive.google.com/file/d/0B8Qa2__-sGYgRmozQ21oRHhUZWM/view?usp=sharing

tar xvzf 解压得到 Example.bag

解压 词汇文件

Data/ORBvoc.txt.tar.gz

执行启动ROS服务

打开一个终端,运行 roscore

运行查看程序

运行 image_view 和 rviz,并读取配置文件:
打开一个终端,

roslaunch ExampleGroovyOrNewer.launch

这个等价于在 ORB_SLAM 目录执行如下三行代码(要是这样的话,每一行都得打开一个终端啦):

rosrun ORB_SLAM ORB_SLAM Data/ORBvoc.txt Data/Settings.yaml 
rosrun image_view image_view image:=/Frame _autosize:=true
rosrun rviz rviz -d Data/rviz.rviz

跑数据

cd 到前面下载的 Example.bag 的目录,打开一个终端,运行rosbag play Example.bag
就能看到运行结果了。
不过我的rviz的结果貌似很不好,只能显示关键帧啊。

rviz 不能运行怎么办?

运行rivz的时候提示:Segmentation fault (core dumped)
这里给出了解决方案,并且该同学也是 ROS kinetic in Ubuntu 16.04 on a VM,
我们先关闭虚拟机的图形硬件加速,如果能运行,就不用安装他说的Mesa 3D graphics library了,如果不行,那么就得按照他给的这个链接
一步步安装Mesa 3D graphics library了:

sudo add-apt-repository ppa:ubuntu-x-swat/updates
sudo apt-get update

sudo apt-get dist-upgrade

最后一步浪费了我一个多小时。
安装完使用glxinfo | grep "OpenGL version" 检查安装结果,我的显示为:OpenGL version string: 2.1 Chromium 1.9
重启虚拟机就ok了。