测试环境:
- 系统:Ubuntu18.04
- Eigen 3.3.4 查看Eigen3版本的方法
- Pangolin 0.6
- OpenCV 3.4.14
- ROS Melodic
一、 安装依赖
ORB-SLAM的各项依赖里OpenCV,Eigen,g20等都比较常规,直接下载源码编译安装就可以。需要注意的是Opencv版本别装太高。遇到的问题出在安装Pangolin。通过源码编译安装完成后,测试十四讲中高博的示例代码,编译可以通过,但在执行时会报错:error while loading shared libraries: libpangolin.so: cannot open shared object file: No such file or directory,大概就是没有链接上动态库,需要修改一个配置文件,告诉他去/usr/local/lib
里搜索。参考https://blog.csdn.net/weixin_42226918/article/details/86158540
二、 编译源代码
Git clone或者下载压缩包解压以后,按照官网的教程,创建目录,执行./build.sh,这里面遇到的几个报错大致如下:
- /ORB_SLAM3/src/LocalMapping.cc:628:49: error: no match for ‘operator/’ (operand types are ‘cv::Matx<float, 3, 1>’ and ‘float’) x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3);
解决方法是在localMapping.cc的628行,把x3D = x3D_h.get_minor<3,1>(0,0) / x3D_h(3);
换成
x3D = cv::Matx31f(x3D_h.get_minor<3,1>(0,0)(0) / x3D_h(3), x3D_h.get_minor<3,1>(0,0)(1) / x3D_h(3), x3D_h.get_minor<3,1>(0,0)(2) / x3D_h(3));
- recipe for target ‘CMakeFiles/ORB_SLAM3.dir/src/CameraModels/KannalaBrandt8.cpp.o’ failed
在ORB_SLAM3-master/include/CameraModels/KannalaBrandt8.h ,#include "TwoViewReconstruction.h"这一行的后面,中添加如下代码:
namespace cv
{
template<typename _Tp, int m, int n> static inline Matx<_Tp, m, n> operator / (const Matx<_Tp, m, n>& a, float alpha)
{
return Matx<_Tp, m, n>(a, 1.f / alpha, Matx_ScaleOp());
}
}
参考链接https://blog.csdn.net/weixin_48464886/article/details/118970304
三、执行./euroc_examples
这里的问题主要在g2o和DBoW2上,这个可以参考ORM SLAM2 GitHub上一个issues的回答
https://github.com/introlab/rtabmap/issues/287
大致就是我们在使用ORB-SLAM的时候,不能链接使用自己装在/usr/local
的库,应该用ORB-SLAM3 Thirdparty的路径下内置的libg2o.so,所以可以把下面这句话加到~/.bashrc
里去
export LD_LIBRARY_PATH=xxx/ORB_SLAM3/lib:xxx/ORB_SLAM3/Thirdparty/g2o/lib:xxx/ORB_SLAM2/Thirdparty/DBoW2/lib:$LD_LIBRARY_PATH
把其中的xxx换成自己的路径。之后就执行成功啦!
编译成功的截图:
四、运行单目demo
4.1 下载EuRoC数据集
泡泡机器人整理的SLAM常用数据集连https://blog.csdn.net/qq_36170626/article/details/94902166
zip格式就是官网推荐的ASL格式,下载以后把文件夹重命名为MH01,
4.2 测试
把MH01文件夹所在的文件夹的路径替换了/ORB_SLAM3/Examples/euroc_examples.sh
的第二行的引号内。如果路径错了,会报错找不到图片。
之后cd
到/ORB_SLAM3/Examples
,复制euroc_examples.sh的第二行的命令:
./Monocular/mono_euroc ../Vocabulary/ORBvoc.txt ./Monocular/EuRoC.yaml /home/qyz/Dataset/EuRoc/MH01 ./Monocular/EuRoC_TimeStamps/MH01.txt dataset-MH01_mono
运行成功的截图
五、ROS运行单目demo##
参考链接
https://github.com/hxiaoxi/SLAM/blob/master/ROS%20%2B%20ORB_SLAM.md
https://www.jianshu.com/p/31c95d9a5f97
安装ROS Melodic,参见ROS官网:http://wiki.ros.org/melodic/Installation/Ubuntu
rosdep update报错,可以参考这个链接
https://zhuanlan.zhihu.com/p/392082731
5.1 创建ROS工作空间,初始化
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
source devel/setup.bash
catkin_make后会自动生成build、devel、src文件夹,catkin_make可以看做是cmake和make的结合体。
为了不用每次启动一个新的终端都更新一下环境变量,可以执行下面的命令,把source命令加到~/.bashrc里
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
5.2 下载ORB-SLAM3的源码,编译
通过下载压缩包解压或者git clone的方式,把ORB-SLAM3的源码放到~/catkin_ws/src
里,把文件夹重命名为ORB-SLAM3
之后就是像上面一样编译ORB-SLAM3的源码
cd ~/catkin_ws/src/ORB_SLAM3/
chmod +x build.sh
./build.sh
之后准备把ORB-SLAM编译成一个ROS功能包,先把 ROS 所在目录加入 ROS_PACKAGE_PATH 环境变量中,具体操作是把下面的命令添加到 ~/.bashrc 文件末尾,把
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:<PATH>/ORB_SLAM3/Examples/ROS
之后source,然后执行编译,
chmod +x build_ros.sh
./build_ros.sh
这一步执行./build_ros.sh时我遇到了ImportError: No module named rospkg这个错误,后来在ROS ANSWERS上找到了合适的回答
The reason this error occurs is because Python packages in /opt are added to PYTHONPATH environment variable BUT for ones in /usr, path does not exist in PYTHONPATH variable. The python-rospkg gets installed in /usr by default. So you just need following line in .bashrc to fix this:
发生此错误的原因是 /opt 中的 Python 包已添加到 PYTHONPATH 环境变量中,但对于 /usr 中的 Python 包,PYTHONPATH 变量中不存在路径。 默认情况下,python-rospkg 安装在 /usr 中。 所以你只需要 .bashrc 中的以下行来解决这个问题:
所以只需要在~/ .bashrc 中添加以下行来解决这个问题:
export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages
然后再source,chmod,再运行build_ros.sh脚本,编译ROS节点成功
5.3 测试
数据集依然选用euroc,把一个bag文件放到/home/qyz/catkin_ws/src/ORB-SLAM3/Datasets
目录下
在 ROS 模式下,需要从 rosbag 里面发布数据,因此要从上述数据网站上下载相应的 rosbag 数据包。
在运行时,一个关键的设置是将 slam node 接收的 ros topic 和 rosbag 发布的 ros topic 匹配起来,也就是收、发双方的 ros topic 名字必须相同.
topic 名字的转化既可以在运行 slam node 时设置,格式为
rosrun <package_name> <node_name> original_topic:=new_topic
也可以在 play rosbag 的时候设置,格式为
rosbag play <bag_name> original_topic:=new_topic
可以用rosbag info xxx.bag
查看一个bag文件包含的topic
由于我准备跑一个单目的demo,所以topic选/cma0或者/cam1应该都可以
第一步,启动一个终端,启动roscore
roscore
第二步,启动一个终端,运行ORB-SLAM3 package中的Mono节点,路径改成自己的
rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml
Mono后需要跟两个参数,第一个是ORB vocabulary,第二个xxx.yaml需要填数据集的相机参数文件。下载的源码里Examples/Monocular/路径下有
第三步,启动一个终端,播放bag
rosbag play /home/qyz/catkin_ws/src/ORB_SLAM3/Datasets/a1.bag /cam0/image_raw:=/camera/image_raw