塔克机器人 Ubuntu18.04上运行ORB_SLAM3(包括运行Euroc数据集和通过单目、RGB-D相机模式实时获取前端数据)

本文详细介绍了如何在Ubuntu18.04环境下安装NoMachine软件、配置ORB-SLAM3所需的依赖库(如C++版本、Pangolin、Eigen3.5、OpenCV、DBoW2、g2o和Python),以及编译和运行ORB-SLAM3,包括解决网络连接、OpenCV版本不匹配等问题。
摘要由CSDN通过智能技术生成

前端时间看过视觉slam相关方向,实验室刚好有一台小车,所以试着在上面跑了一下ORB-SLAM3,下面是操作步骤和遇到的问题总结。如果是需要直接Ubuntu18.04上跑ORB_SLAM3的朋友可以忽略第一节的内容。

一、安装NoMachine软件

  1. 在PC机上安装NoMachine软件,用于方便操纵机器人系统。安装完成后,打开NoMachine软件,出现如下界面,点击OK。
    在这里插入图片描述
    2.NoMachine软件自动搜索同一局域网下的机器人系统,需要等一段时间。出现图标后,双击打开。(注意:必须让PC机和机器人处于同一局域网内,我使用的是手机热点
    在这里插入图片描述
    如果出现错误:
    在这里插入图片描述
    报错信息的意思是不能连接到端口为4000的ip地址为192.168.55.1的机器人系统。
    在这里插入图片描述
    查阅机器人系统的ip地址,在机器人系统打开一个终端,输入ifconfig,可以出现下面的信息:
    在这里插入图片描述
    所以机器人系统的ip地址为192.168.43.64,在host那里修改,如图所示:
    在这里插入图片描述
    3.输入用户名和密码,然后点击login。
    在这里插入图片描述
    4.连接成功。
    在这里插入图片描述

二、ORB_SLAM3相关环境安装

1.检查C++版本

首先去github上面看readme:
在这里插入图片描述
检验C++版本,要必须显示支持 C++11特性
(1) 打开终端,新建一个main.cpp

touch main.cpp
vim main.cpp

(2) 编译main.cpp

g++ -std=c++11 -o main main.cpp

(3) 检验编译是否成功

echo $?

这个命令的含义是:返回上一条命令的执行结果,成功就返回0,不成功则不是0的一个整数。这里还可以打印出main.cpp的结果来建议是否编译成功,输入./main
在这里插入图片描述
(4) 检验gcc版本

gcc -v

在这里插入图片描述

2.安装Pangolin

(1) 将github上的Pangolin包下载到本地

git clone https://github.com/stevenlovegrove/Pangolin.git

(2) 将Pangolin包解压后,打开一个终端,输入命令,进入Pangolin文件

cd Pangolin

(3) 使用mkdir创建一个build文件夹

mkdir build

(4) 进入build文件

cd build

(5) 链接配置文件

cmake ..

(6) 调用与构建平台相关的构建命令

cmake --build

(7) 安装

sudo make install

(8) 8.检验是否安装成功。进入到了build/examples/HelloPangolin文件夹下,运行了一个HelloPangolin的示例。如果出现一个立方体的就表明安装成功了!

cd build/examples/HelloPangolin
./HelloPangolin

在这里插入图片描述
在这里插入图片描述

3.安装Eigen3.5

(1)下载Eigen3.3.5,ORB_SLAM的github上说的是最少3.1.0,但是经过我的安装测试,3.1.0并不能满足我们的需求,后期用ROS启动时候3.1.0编译是会报错,采取3.3.5,为了减少后期的卸载安装的麻烦,我们直接使用3.3.5。Eigen3.3.5的gitlab地址:Eigen3.3.5
(2)将压缩包放到我们的工作区间进行解压,然后进入eigen-3.3.5文件夹,打开终端,新建一个build文件mkdir build
(3)进入build文件cd build
(4)链接置文件cmake ..
(5)安装sudo make install
在这里插入图片描述
(6)检验是否安装成功。打开一个新的终端,运行下面的命令locate eigen3可以查看eigen3的位置。
在这里插入图片描述

4.安装OpenCV

因为塔克机器人已自带ROS系统,并且该ROS系统自带opencv3.3.1 可通过命令pkg-config --modversion opencv查询,所以这里便不再单独安装了。如果需要的朋友可以参看OpenCV安装
在这里插入图片描述

5.安装DBoW2和g2o

源码中有,无需下载,在后面编译ORB_SLAM3时进行编译

6.安装Python

运行下面的命令进行安装:sudo apt install libpython2.7-dev
出现不能下载的问题:
在这里插入图片描述
解决方法:运行命令sudo apt-get update 再运行sudo apt install libpython2.7-dev就能安装成功了
在这里插入图片描述

三、编译ORB_SLAM3

(1)在工作空间下,打开终端,获取ORB_SLAM3的源码

git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3

在这里插入图片描述

可能会出现超时的错误,这是代理出错导致的。我的解决方法是:

git clone http://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3

下载成功
在这里插入图片描述
(2)下载成功后,进入 ORB_SLAM3文件夹cd ORB_SLAM3
(3)给build.sh赋予可允许权限chmod +x build.sh
(4)4.网上很多博主的方法到这一步是直接输入./build.sh命令直接运行build.sh脚本,这样直接运行就会导致编译出错时不知道问题的原因。查看build.sh脚本在这里插入图片描述
在这里插入图片描述
我们会发现这个脚本是直接编译了5个文档,连续编译5个,很容易出现不知道错误是哪个文档的现象,所以我们这里分开进行编译。
(a)在ORB_SLAM3文件夹下打开终端,编译Thirdparty/DBoW2

cd Thirdparty/DBoW2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j

在这里插入图片描述
(b)编译成功后,编译g2o

cd ../../g2o
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j

在这里插入图片描述
(c)编译成功后,编译Sophus

cd ../../Sophus
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release

!!注意:make -j(这一步先不忙运行,解释如下)需要改成make -l
在这里插入图片描述
我们可以看到在build.sh脚本中,最后一行是make -j命令。但是在终端输入make -j后,机器人系统就会卡死,这是因为运行内存不足导致的。接着尝试make -2和make -j4命令(其中make -j带一个参数,可以把项目进行并行编译,如make -j4就是让 make最多允许4个编译命令同时执行,这样可以有效的利用CPU),但是这两个命令虽然能够进行编译,但是编译速度很慢,到一定进度后,机器人操作系统就又卡死。机器人卡死后,执行ctrl +C,退出命令。如下图
在这里插入图片描述
接着尝试make -l命令(编译的过程还是需要很长的时间,耐心等待),编译成功!查阅资料得知:make带两个参数的含义:
-j 其实对应的是 --jobs,表示可以同步进行的任务
-l 其实对应的是 --load-average, 表示系统加载的任务数
在这里插入图片描述
(d)编译成功后,进入Vocabulary解压文件

cd ../../../
cd Vocabulary
tar -xf ORBvoc.txt.tar.gz
cd ..

(e)最后构建ORB_SLAM3

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release

如果出现下面的错误:
在这里插入图片描述
这个错误的信息就是不能找到一个OpenCV的配置文件与4.4版本相兼容,找到一个4.1.1版本的配置文件,但是不能够被使用。所示我们现在就需要修改ORB_SLAM3文件夹下的CMakeList.txt 中上图位置
原文:

find_package(OpenCV 4.4)改为find_package(OpenCV4.1.1)
LIST(APPENDCMAKE_MODULE_PATH${PROJECT_SOURCE_DIR}/cmake_modules)
find_package(OpenCV 4.4)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR “OpenCV > 4.4 not found.”)
endif()

改为:

LIST(APPENDCMAKE_MODULE_PATH${PROJECT_SOURCE_DIR}/cmake_modules)
find_package(OpenCV 4.1.1)
if(NOT OpenCV_FOUND)
message(FATAL_ERROR “OpenCV > 4.4 not found.”)
endif()

在这里插入图片描述
在这里插入图片描述
修改完后点击保存,再次运行cmake .. -DCMAKE_BUILD_TYPE=Release命令,成功!
在这里插入图片描述
将make -j4改成make -l,和第三个文档的原理一样,运行make -j4机器人系统将直接卡死,改成make -l可以进行编译,这个过程比较慢,大概需要一个小时,需要耐心等待。出现下面的提示不用管,这是提示系统运行内存不足。
在这里插入图片描述
在这里插入图片描述
至此,ORB_SLAM3安装完成!!!

四、ORB_SLAM3上跑公开数据集

1.从官网上下载数据集 ,这里下载的是Euroc数据集Euroc数据集下载地址,ASL格式,如下图所示。
在这里插入图片描述
2.路径的修改。这里首先需要在ORB_SLAM3文件夹下面新建一个dataset文件夹,将下载的Euroc数据集解压到dataset文件夹里面(我这里的路径是这样的,路径一定不能错!!!)
在这里插入图片描述
3.双击打开ORB_SLAM3源码中的脚本“euroc_examples.sh”,但是发现ORB_SLAM3源码
中没有这个文件,应该是作者删除了。查阅资料发现是因为下载的1.0版本,在以前0.4版本里面就有“euroc_examples.sh”。在其他的github仓库可以找到,地址:0.4版本ORB_SLAM3
如图:这个启动文件内是一个启动文件命令集合,我们选取其中的某一个命令行运行即可。在这里,我选择的euroc_examples.sh
在这里插入图片描述
将新下载的ORB_SLAM3解压,将其中的euroc_examples.sh复制到原本的ORB_SLAM3工作空间。找到包含MH01的指令
在这里插入图片描述
修改为:(注意路径和我之前安装的一致)

./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ./dataset/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt

在这里插入图片描述
4.在ORB_SLAM3中打开终端,运行一下命令,数据集运行成功,ORB_SLAM3安装成功!

./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ./dataset/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt

虽然运行成功,但是不能出现界面,因为我安装的是OpenCV1.0的版本。解决办法:
找到ORB_SLAM3/Examples/Monocular下的mono_eurocc.cc文件。把这一行的false改为true, ORB_SLAM3::System SLAM(argv[1],argv[2],ORB_SLAM3::System::MONOCULAR, false); Pangolin的可视化界面就可以出现了。
在这里插入图片描述
点击保存后,还需要重新编译(注意:以.cc文件结尾的文件,在修改之后必须要重新进行编译)在ORB_SLAM3文件目录下打开一个终端,输入

chmod +x build.sh
./build.sh

这次编译不同于第一次,会很快通过的!编译成功之后再次运行,就会出现界面啦!

./Examples/Monocular/mono_euroc ./Vocabulary/ORBvoc.txt ./Examples/Monocular/EuRoC.yaml ./dataset/MH01 ./Examples/Monocular/EuRoC_TimeStamps/MH01.txt

在这里插入图片描述
在这里插入图片描述

五、单目模式下运行ORB_SLAM3

1.1.ROS部分的编译。根据github的ROS部分来,先在~ /.bashrc环境中添加环境变量,值得一提的是,由于orb_slam作者的更新,ROS示例被放到了Examples_old位置,所以编译文件时应该注意,我们不再是进入Examples,而是进入到Examples_old。在~/.bashrc中添加环境变量的操作如下:

  • 打开~/.bashrc sudo gedit ~/.bashrc
  • 在最后一行添加环境变量(一定要添加到最后一行!!!如果不放在bashrc的最后一行,环境变量是写入不进去的!)其中PATH要替换成自己的工作空间路径。
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM3/Examples_old/ROS

在这里插入图片描述

  • 验证一下ROS的环境变量,输入echo $ROS_PACKAGE_PATH
    在这里插入图片描述
    如果显示不对,就在终端输入命令source .bashrc进行文件的刷新,然后再次运行命令echo $ROS_PACKAGE_PATH 就可以显示正确了。
  • 最后进入Examples_old/ORS/ORB_SLAM3进行编译
cd Examples_old/ROS/ORB_SLAM3
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release 
make l  (运行这行命令有错,解决在下面)

错误解答:
报错一:cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
找到ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR下的ros_mono_ar.cc文件将:
cv::Mat Tcw = mpSLAM->TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
替换为:
cv::Mat Tcw;
Sophus::SE3f Tcw_SE3f = mpSLAM->
TrackMonocular(cv_ptr->image,cv_ptr->header.stamp.toSec());
Eigen::Matrix4f Tcw_Matrix = Tcw_SE3f.matrix();
cv::eigen2cv(Tcw_Matrix, Tcw);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
错误二:vPoints.push_back(pMP->GetWorldPos());
找到ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR下的ViewerAR.cc文件将错误
vPoints.push_back(pMP->GetWorldPos());改为:
cv::Mat WorldPos;
cv::eigen2cv(pMP->GetWorldPos(), WorldPos);
vPoints.push_back(WorldPos);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
**错误三:**同样在ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src/AR下的ViewerAR.cc文件
将cv::Mat Xw = pMP->GetWorldPos();改为:
cv::Mat Xw;
cv::eigen2cv(pMP->GetWorldPos(), Xw);

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
错误四:error: ‘eigen2cv’ is not a member of ‘cv’
找到ORB_SLAM3/Examples_old/ROS/ORB_SLAM3路径下的CMakeLists.txt,注释掉其中关于AR的部分解决问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
错误解决后,再次运行make -l,编译成功!
在这里插入图片描述
2.打开一个终端运行:roscore
在这里插入图片描述
3.再打开一个终端运行,通过SSH命令连接到机器人,运行摄像头节点:

roslaunch xtark_ros_wrapper xtark_camera.launch

出现下面的界面就表示摄像头成功启动啦!
在这里插入图片描述
4.另外再打开一个终端,通过输入rviz,打开rviz工具查看,查看摄像头界面。
在这里插入图片描述
然后再按照图片中的顺序,执行步骤,会出现以下的界面,就说明摄像头启动成功了!看到成功之后,可以将rviz工具关闭。
在这里插入图片描述
在这里插入图片描述
5.运行命令,查看所有的订阅话题:rostopic list
在这里插入图片描述
其中/usb_cam/image_raw就是摄像头的话题
6.修改代码在/home/xtark/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/src目录下找到:ros_mono.cc文件,打开找到并修改成我们自己摄像头的订阅/usb_cam/image_raw
在这里插入图片描述
在这里插入图片描述
7.回到ORB_SLAM主目录,打开终端,把刚刚修改的代码进行编译./build_ros.sh

在这里插入图片描述
8.另开一个终端运行(/home/xtark/注意这里的路径需要修改成自己的文件路径)

Rosrun ORB_SLAM3 Mono /home/xtark/ORB_SLAM3/Vocabulary/ORBvoc.txt /home/xtark/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/Asus.yaml

错误一:首选这里出现[rosrun] Couldn’t find executable named Mono错误(忘记截图了),解决方法是在/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3文件夹下打开终端运行:

chmod +x build_ros.sh
./build_ros.sh

运行成功后,在/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3文件下就生成了Mono文件了!
**错误二:接下来这个错误花费很长的时间解决!(这里忘记截图了)运行到图片的中的最后一步后就出现Monocular Segmentation fault (core dumped)**这个错误,中文是分段错误(堆芯转储),不理解。
在这里插入图片描述
在网上查阅资料,说是需要进行gdb调试(这个方法行不通,不能解决这个错误)。网上关于这个错误的解决博客不多,最后在github上的一篇文章中找到相关的问题(https://github.com/UZ-SLAMLab/ORB_SLAM3/issues/333)
本篇文章下面的评论中是这样提到:这可能是由 ./build.sh 和 ./build_ros.sh 中使用的不同版本的 OpenCV 造成的。在 ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt 和 ORB_SLAM3/CMakeLists.txt 中,它需要 opencv 4。但在ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/CMakeLists.txt中,它需要opencv 3。我已经在外面安装了opencv4.1.0,在ros中安装了opencv3.3.1。最后,它导致了分割错误。
根据提示,查询我们的OpenCV版本。ROS机器人系统已安装的是opencv3.3.1。但是我们在安装ORB_SLAM3对build.sh进行编译的时候,给我们提示的错误信息是需要4.1.1版本的,所以我们当时把CMakeLists文件中的opencv版本改成4.1.1。编译是能够通过的。但是进行ROS编译需要都把opencv同一成3.3.1版本的。所以我们这里的错误就是OpenCV版本不一致导致的。接下来进行如下的操作,统一OpenCV的版本:
(1)分别把/ORB_SLAM3文件夹和/ORB_SLAM3/Thirdparty/DBoW2文件夹下的CMakeLists文件中的opencv改成3.3.1版本的。同时还需要添加设置找opencv文件的语句:set(OpenCV_DIR /home/xtark/Software/opemcv-3.3.1/build) 这句话必须添加,我最开始就没有添加,把前面版本号修改之后直接进行rosrun操作就会报同样的错误!!!
在这里插入图片描述
在这里插入图片描述
(2)然后在路径下/usr/lib/aarch64-linux-gnu/cmake/opencv4 找到OpenCVConfig.cmake文件,并把其中包含4.1.1的代码全部改成3.3.1
在这里插入图片描述
在这里插入图片描述
(3)最后回到ORB_SLAM3文件夹下,重新进行编译。

Chmod +x build.sh
./build.sh

以及

Chmod +x build_ros.sh
/build_ros.sh

最后再次运行==Rosrun ORB_SLAM3 Mono /home/xtark/ORB_SLAM3/Vocabulary/ORBvoc.txt /home/xtark/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/Asus.yaml == 运行成功!
在这里插入图片描述
9.移动机器人

(1)首先通过SSH命令连接到机器人,运行机器人底盘驱动节点。保持机器人静止,等待机器人底盘启动。roslaunch xtark_ros_wrapper xtark_driver.launch
在这里插入图片描述
(2)再新建终端,SSH连接到机器人后,运行键盘控制节点。显示界面如下,可通过按键对机器人进行控制。

roslaunch xtark_ctl xtark_keyboard.launch

K 停止
I、J、<、L 前、后、左、右
q/z 最大速度增加/减少10%
w/z 仅线性速度增减/减少10%
在这里插入图片描述
在这里插入图片描述

六、RGB-D模式下运行ORB_SLAM3

1.执行命令查询设备号lsusb执行完成后可以见到下面的信息,其中502是彩色相机,403是深度相机
在这里插入图片描述

2.在~/ros_ws/src/ros_astra_camera/launch/astrapro.launch文件下,找到 name=”product” 的位置,将 value 改为上面查询到的彩色相机的设备号
在这里插入图片描述
在这里插入图片描述
3.启动相机

roslaunch astra_camera astrapro.launch

出现如下的错误,这是因为权限导致的。这里发现一个问题:单目摄像头和RGBD摄像头不能同时共存。因为我在将这里的权限修改之后,发现不能运行单目摄像头了,然后取下摄像头,再安上,单目摄像头可以运行了。但是在此运行RGBD摄像头就又出现下面的错误信息。
在这里插入图片描述
在这里插入图片描述
解决方法:另起一个终端输入以下命令(这里的008要和错误提示信息对应):

sudo chmod 777 /dev/bus/usb/001/008

在这里插入图片描述
4.运行命令:

rosrun ORB_SLAM3 RGBD /home/xtark/ORB_SLAM3/Vocabulary/ORBvoc.txt /home/xtark/ORB_SLAM3/Examples_old/ROS/ORB_SLAM3/Asus.yaml

运行成功!到此机器人便可以成功通过单目摄像头和RGBD摄像头跑ORB_SLAM3了!!!
在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值