【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、ORB_SLAM3源码编译
  • 二、ORB_SLAM3实时单目相机测试
    • [1. 查看摄像头的话题](#1. 查看摄像头的话题)
    • [2. 运行测试](#2. 运行测试)
  • [三. 运行测试可能的报错](#三. 运行测试可能的报错)
    • [1. 报错一](#1. 报错一)
      • [(1) 问题描述](#(1) 问题描述)
      • [(2) 原因分析](#(2) 原因分析)
      • [(3) 解决](#(3) 解决)
    • [2. 报错二](#2. 报错二)
      • [(1) 问题描述](#(1) 问题描述)
      • [(2) 解决](#(2) 解决)

前言

本次教程运行ORB_SLAM3,所需的环境如下:

Ubuntu18.04、ros版本:melodic

Opencv4.5.2、Pangolin0.6、

Boost库1.77.0版本、Eigen3.3.4

注意:以下的教程和所遇到的问题解决,使用的是v0.4-beta版本的ORB_SLAM源码,不同的版本遇到的问题和解决的方法不太一样!!!!!

一、ORB_SLAM3源码编译

所有的环境配置,安装的具体教程和踩坑记录,具体可以参考这篇博客:

这里就不赘述了

二、ORB_SLAM3实时单目相机测试

以usb单目摄像头为例,有安装过相应的驱动的,可直接进入下一步,若是没有,具体的驱动的安装,和相应的配置,具体参考这篇博客:VMware虚拟机中ubuntu使用记录(5)------ 如何在ubuntu中安装USB相机ros驱动并获取usb摄像头数据

1. 查看摄像头的话题

打开终端1:

bash 复制代码
  roscore

在相机驱动的工作空间目录下,打开终端2:

bash 复制代码
 source devel/setup.bash                //生效过环境,可跳过此步
 roslaunch usb_cam usb_cam-test.launch      //usb_cam为自己的驱动文件的名字

运行2终端的同时,Ctrl+Alt+T打开终端3:

bash 复制代码
   rostopic list

列出所有的ROS话题,其中/usb cam/image_raw为我单目摄像头的话题数据,如下图所示:

2. 运行测试

(1) 修改ros_mono.cc文件

由于本次测试的时单目,故只需在/ORB_SLAM3/Examples/ROS/ORB_SLAM3/src目录下找到:ros_mono.cc文件,打开找到并修改成我们自己摄像头的订阅话题(usb_cam/imahe_raw),后面的参数"1"不用修改,如下图所示:

(2) 编译源码

回到src/ORB_SLAM3主目录再次运行:

bash 复制代码
chmod +x build_ros.sh
./build_ros.sh

(3) ORB_SLAM3运行相机
1)启动ROS,打开终端1:

bash 复制代码
roscore

2)开启相机

在自己创建工作空间(我的是catkin_ws/)目录下,打开终端2:

bash 复制代码
 source devel/setup.bash                    //生效过环境,可跳过此步
 roslaunch usb_cam usb_cam-test.launch      //改成自己的相机启动文件

3)运行ORB_SLAM3

在src/ORB_SLAM3目录下的终端输入:

bash 复制代码
rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM3/My_camera.yam

指令的参数说明:

bash 复制代码
rosrun ORB_SLAM3 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE

1.Mono

代表的是运行单目的意思,本次测试使用的是单目摄像头

2. PATH_TO_VOCABULARY

ORBvoc.txt特征词典文件路径,我的路径是:

bash 复制代码
/home/chen/catkin_ws/src/ORB_SLAM3/Vocabulary/ORBvoc.txt 

3. PATH_TO_SETTINGS_FILE

即相机设置文件,官方提供的是Asus.yaml,可以另复制命名一个文件My_camera.yaml,将里面的相机参数修改成自己标定过的参数。

(4)最后运行成功的截图:

三. 运行测试可能的报错

1. 报错一

(1) 问题描述

rosrunORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM3/Asus.yaml

时出现如下:段错误(核心已转储),报错的页面如下图所示:

(2) 原因分析

在ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt和ORB_SLAM3/CMakeLists.txt中,使用的是opencv4版本,而在ORB_SLAM3/Examples/ROS/ORB_SLAM3/CMakeLists.txt中,要求使用的是OpenCV3的版本,所以最后导致segmentation fault(段错误)。

(3) 解决

以下是在v0.4-beta版本的ORB_SLAM源码上进行的修改解决:修改opencv版本的最低要求,改成统一的opencv3版本
1)修改CMakeLists.txt文件的代码

在ORB_SLAM3/CMakeLists.txt修改为:

在ORB_SLAM3/Thirdparty/DBoW2/CMakeLists.txt中修改为:

在ROS/ORB_SLAM3/CMakeLists.txt中不变

修改完成后再次编译源码:

bash 复制代码
./build.sh

2. 报错二

(1) 问题描述

经过上述报错一中的修改之后,再次运行./build.sh编译代码时出现报错:no match for 'operator',具体的报错的信息如下所示:

(2) 解决

1)修改LocalMapping.cc文件

在src/ORB_SLAM3/src目录下的LocalMapping.cc文件,大概在628行,修改为:

cpp 复制代码
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));

修改位置如下图所示:


2)再次运行./build.sh
报错页面信息如下


解决:

修改src/ORB_SLAM3/src/CameraModels目录下的KannalaBrandt8.cpp文件,大概在534行,修改为:

cpp 复制代码
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());
}
}

修改的位置如下:

再次执行./build.sh,./build_ros.sh,不出意外就能编译成功!!!!!!

编译成功后,就可以使用自己相机配置文件实时运行ORB_SLAM3

相关推荐
luoganttcc8 分钟前
是凯恩斯主义主导 西方的经济决策吗
大数据·人工智能·金融·哲学
好奇龙猫14 分钟前
AI学习:SPIN -win-安装SPIN-工具过程 SPIN win 电脑安装=accoda 环境-第五篇:代码修复]
人工智能·学习
远山枫谷22 分钟前
如何通过nodean安装n8n以及可能遇到的问题
人工智能
AIGC_北苏31 分钟前
EvalScope模型压力测试实战
人工智能·语言模型·模型评估·框架评估
CheungChunChiu32 分钟前
AI 模型部署体系全景:从 PyTorch 到 RKNN 的嵌入式类比解析
人工智能·pytorch·python·模型
分布式存储与RustFS39 分钟前
存算一体架构的先行者:RustFS在异构计算环境下的探索与实践
大数据·人工智能·物联网·云原生·对象存储·minio·rustfs
Scc_hy39 分钟前
强化学习_Paper_2000_Eligibility Traces for Off-Policy Policy Evaluation
人工智能·深度学习·算法·强化学习·rl
IT小哥哥呀40 分钟前
论文见解:REACT:在语言模型中协同推理和行动
前端·人工智能·react.js·语言模型
来酱何人41 分钟前
低资源NLP数据处理:少样本/零样本场景下数据增强与迁移学习结合方案
人工智能·深度学习·分类·nlp·bert
ChinaRainbowSea41 分钟前
11. Spring AI + ELT
java·人工智能·后端·spring·ai编程