是的,你没看错!「手把手带你玩转ORB-SLAM3」教程2.0来了,在原有教程基础上更细节、更全面,不仅有SDK及ORB-SLAM3安装过程中的各种常见性问题解决方法及安装细节,同时还提供官方完整编译代码包哦,真正带你手把手~
本文主要讲解如何在orb-slam3中使用ros接入INDEMIND的双目鱼眼+imu模组。
具体分为以下4部分:
- SDK安装
- orb-slam3安装
- SDK orb-slam3中ROS程序修改和配置文件
- 运行
其中【SDK orbslam3中ROS程序修改和配置文件】又分为4部分:
- SDK中ros程序的修改
- orbslam3 ros中自定义msg的添加和topic订阅
- orbslam3 ros中配置文件的修改
- orbslam3 中读取配置文件代码修改
本文操作系统:ubuntu18.04
完整代码包下载地址:https://github.com/INDEMIND/ORB-SLAM3-Course
一、SDK安装
SDK下载及准备安装:
安装过程主要参考产品手册中Ubuntu一节,官方产品手册地址:https://imsee-sdk-docs.readthedocs.io/zh/latest/src/sdk/contents.html
1.安装依赖:
2.然后使用git下载 SDK:
3.准备安装SDK需要的依赖,执行以下命令即可:
安装OpenCV3.4.3版本
1.为什么安装OpenCV3.4.3版本?
解决方法:安装OpenCV3.4.3版本,并把SDK中的libIndemind.so替换掉
2.安装Opencv参考如下:
MNN安装:
因为MNN依赖protobuf,而安装protbuf有两种方式,一种是源码安装(可参见产品手册),另一种方法如下(较容易):
完成这些步骤,SDK就安装完毕了。
二、orb-slam3安装
如何安装:
具体安装过程请参考orbslam3官网。
安装注意:
orbslam3依赖的opencv是4.4以上的版本,而Indemind的sdk使用的是3.4.3版本。因此,需要修改orbslam3的工程,方法如下:
1.打开orbslam3工程的cmakelist.txt找到如下片段:
2.然后将该片段注释掉并添加代码,修改如下:
3.之后进行编译,成功后如下:
4.运行如下:
5.编译中的问题:
解决方法:修改 build.sh文件 将其中的make -j 改为 make -j2 或者-j1。
至此,ORB-SLAM3的安装结束。
三、SDK orb-slam3中ROS程序修改与配置文件
- SDK中ros程序的修改
接下来是介绍SDK中的ros程序imsee_ros_wrapper,浏览${xx}/sdk/IMSEE-SDK/ros/src/imsee_ros_wrapper的目录:${xx}是下载sdk的路径
其中添加了自定义的msg文件夹,里面包含了自定义的设备信息消息。主要包含双目鱼眼相机的参数和imu参数。
在src/wrapper_nodelet.cc中添加了发送设备信息函数和对应的topic:
从SDK接口中读取设备信息,使用ROS Topic方式,将信息发送出去。
程序中ros参数器的读取,需要修改相应的字段
否则,config文件中的配置参数不会生效。这里工程师将图像频率改为25hz,imu频率改为200hz
- orbslam3 ros中自定义msg的添加和topic订阅
随后是orbslam3中的ros程序修改:
工程师将Example_old/ros 拷贝到了 Example中
然后在build_ros.sh文件中添加如下命令:
运行 build_ros.sh后出现报错:
解决方法:将Thirdparty中的Sophus依赖加入到ros中的Cmakelist.txt中。如下:
再次运行后显示成功。
然后 在终端输入:
source Example/ROS/build/devel/setup.bash
也可以直接写入到.bashrc文件
下面是使用命令提示:
开ros_stereo.cc文件
订阅主题需要修改一下:
上图紫色部分是SDK发布出来的topic,订阅imu数据和左右目数据,具体可以查看SDK的文档。
- orbslam3 ros中配置文件的修改
为了能接受imsee_ros_wrapper发出的自定义设备信息,首先在对应的cmakelist.txt中添加:
在ros_stereo_inertial.cc中添加头文件:
#include<imsee_ros_wrapper/DeviceInfo.h>
在manifest.xml中添加:
<depend package="imsee_ros_wrapper"/>
定义IndemindParams类,该类的主要功能是将设备信息中的外参进行必要的变换,并重新写入到配置文件中。
在main函数中添加,一次性接受
rostopic的代码:
该代码在接受信息后,会调用函数CalculateTransforms,生成左右目之间的外参数Tlr和camera到Imu的外参数Tbc。然后再调用函数ReplaceParamsInYaml(argv[2]),在argv[2]对应的文件中写入Indemind的参数(参数的key都采用的下划线):
同时,Tlr和Tbc都以vector的方式写入到文件中。如下示例:
- orbslam3 中读取配置文件代码修改
orbslam3的tracking.cc文件中的函数ParseCamParamFile和ParseIMUParamFile需要修改其读入字段(需修改字段即上方两个截图),对应的修改代码如下:
至此修改完毕。
四、运行
启动SDK ros wrapper :
roslaunch imsee_ros_wrapper start.launch
启动orb-slam3 ros stereo inertial:
rosrun ORB_SLAM3 Stereo_Inertial Vocabulary/ORBvoc.txtExamples/ROS/ORB_SLAM3/Indemind_stereo_imu_fisheye.yaml 0