前言
今天在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
文件中去掉,即:
- 删掉 这一行
<depend package="opencv2"/>
。 - 然后在
/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了。