【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、ORB_SLAM3源码编译
- 二、ORB_SLAM3实时单目相机测试
- 1. 查看摄像头的话题
- 2. 运行测试
- 三. 运行测试可能的报错
- 1. 报错一
- (1) 问题描述
- (2) 原因分析
- (3) 解决
- 2. 报错二
- (1) 问题描述
- (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:
roscore
在相机驱动的工作空间目录下,打开终端2:
source devel/setup.bash //生效过环境,可跳过此步roslaunch usb_cam usb_cam-test.launch //usb_cam为自己的驱动文件的名字
运行2终端的同时,Ctrl+Alt+T打开终端3:
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主目录再次运行:
chmod +x build_ros.sh
./build_ros.sh
(3) ORB_SLAM3运行相机
1)启动ROS,打开终端1:
roscore
2)开启相机
在自己创建工作空间(我的是catkin_ws/)目录下,打开终端2:
source devel/setup.bash //生效过环境,可跳过此步roslaunch usb_cam usb_cam-test.launch //改成自己的相机启动文件
3)运行ORB_SLAM3
在src/ORB_SLAM3目录下的终端输入:
rosrun ORB_SLAM3 Mono Vocabulary/ORBvoc.txt Examples/ROS/ORB_SLAM3/My_camera.yam
指令的参数说明:
rosrun ORB_SLAM3 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
1.Mono
代表的是运行单目的意思,本次测试使用的是单目摄像头
2. PATH_TO_VOCABULARY
ORBvoc.txt特征词典文件路径,我的路径是:
/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中不变

修改完成后再次编译源码:
./build.sh
2. 报错二
(1) 问题描述
经过上述报错一中的修改之后,再次运行./build.sh编译代码时出现报错:no match for ‘operator’,具体的报错的信息如下所示:

(2) 解决
1)修改LocalMapping.cc文件
在src/ORB_SLAM3/src目录下的LocalMapping.cc文件,大概在628行,修改为:
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行,修改为:
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
相关文章:
【ORB_SLAM系列3】—— 如何在Ubuntu18.04中使用自己的单目摄像头运行ORB_SLAM3(亲测有效,踩坑记录)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、ORB_SLAM3源码编译二、ORB_SLAM3实时单目相机测试1. 查看摄像头的话题2. 运行测试 三. 运行测试可能的报错1. 报错一(1) 问题描述(2) 原因分析(3) 解决 2. …...
Science Advances|柔性超韧半导体纤维的大规模制备(柔性半导体器件/可穿戴电子/纤维器件/柔性电子)
北京大学 雷霆(Ting Lei)团队,在《Science Advances》上发布了一篇题为“Continuous production of ultratough semiconducting polymer fibers with high electronic performance”的论文。论文内容如下: 一、 摘要 共轭聚合物具有良好的光电特性,但其脆性和机械特性差,…...
VirtualBox虚拟机与bhyve虚拟机冲突问题解决@FreeBSD
问题 在安装完bhyve虚拟系统的主机上启动VirtualBox虚拟机的时候,报错:不能为虚拟电脑 debian 打开一个新任务. VirtualBox cant operate in VMX root mode. Please close all other virtualization programs. (VERR_VMX_IN_VMX_ROOT_MODE). 返回 代码…...
【网络层】ICMP 因特网控制协议
文章目录 ICMP 含义以及作用ICMP协议解析结合ICMP协议和ping常见问题 ICMP 含义以及作用 ICMP:Internet control massage protocol 因特网控制协议 Internet控制报文协议ICMP是网络层的一个重要协议。 ICMP协议用来在网络设备间传递各种差错和控制信息,…...
汇编原理(四)[BX]和loop指令
loop:循环 误区:在编译器里写代码和在debug里写代码是不一样的,此时,对于编译器来说,就需要用到[bx] [bx]: [bx]同样表示一个内存单元,他的偏移地址在bx中,比如下面的指令 move bx, 0 move ax,…...
Linux查看设备信息命令
dmidecode | grep Product Name 查看grub版本号:rpm -qa | grep -i "grub" 客户端操作系统版本: cat /etc/issue cat /etc/redhat-release 处理器品牌及型号: less /proc/cpuinfo |grep model...
transformer的特点
Transformers是一种用于处理序列数据的神经网络架构,最初由Vaswani等人在2017年提出,主要用于自然语言处理任务。与传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,Transformers采用了一种全新…...
27快28了,想转行JAVA或者大数据,还来得及吗?
转行到JAVA或者大数据领域,27岁快28岁的年龄完全来得及。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个评论222,私信22,我在后台发给你。…...
英飞凌 AURIX TriCore 单片机开发入门
文章目录 目的硬件准备AURIX™ Development StudioInfineon MemtoolAURIX™ iLLD Drivers总结 目的 英飞凌的32位 AURIX™ TriCore™ 系列单片机 经常用于汽车和工业领域。开发该系列单片机比较常用的开发环境有 HighTec 和 AURIX™ Development Studio 。本文将基于后者&…...
Centos安装,window、ubuntus双系统基础上安装Centos安装
文章目录 前言一、准备工作二、开始安装1、2、首先选择DATE&TIME2、选择最小安装3、 选择安装位置 总结 前言 因工作需要,我需要在工控机上额外装Centos7系统,不过我是装在机械硬盘上了不知道对性能是否有影响,若有影响,后面…...
2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷6(容器云)
#需要资源(软件包及镜像)或有问题的,可私聊博主!!! #需要资源(软件包及镜像)或有问题的,可私聊博主!!! #需要资源(软件包…...
第13章 常用类
一、包装类 二、String String的常用方法: equals:判断内容是否相等,区分大小写。 String str1 "hello";String str2 "Hello";System.out.println(str1.equals(str2));//false equalsIgnoreCase:判断内容…...
15.数组的方法(改变原数组和不改变原数组)
改变原数组 (1)pop 语法:数组名.pop() 作用:删除数组最后一项 返回值:返回被删除的那一项 var arr=["zhangsna","lisi","wanger","mazi"] var res=arr.pop() console.log(arr) //[zhangsna, lisi, wange…...
随后记: uniapp uview u-dropdown 下拉菜单固定高度滑动不生效
使用u-dropdown 下拉组件 按照uview官网讲解使用 配置根本不生效 scroll-y"true" style"height: 200rpx;" 但是在下拉的时候,不能上下滑动 ,原因是自带的遮罩层挡住了 解决办法:在下拉菜单打开和关闭的时候,…...
一文梭哈动态代理
大家好,这里是教授.F 引入: 先看一个生活化的例子,如果一个明星他会唱歌,会跳舞。但是自己太忙了,没时间去宣传自己和去找工作,所以他需要有人帮他代理。然后呢这个代理者也需要知道他会什么,什…...
如何查询Windows 10电脑的IP地址
如何查询Windows 10电脑的IP地址 引言 在Windows 10操作系统中,查询电脑的IP地址是一项基本而重要的任务,无论是为了配置网络、解决连接问题,还是进行远程访问。 基础知识 IP地址:互联网协议地址,用于标识网络中的…...
java: 警告: 源发行版 8 需要目标发行版 8
前言 该文章中项目背景是:IDEA与设置的版本与实际电脑配置的不一致。也就是说只改了这个团队项目的JDK版本,IDEA上其它项目JDK版本未更改。 提示: IDEA警告:javaX:警告:源发行版 需要目标发行版 简略步…...
CCF-CSP认证 2023年12月 2.因子化简
题解: 通过质数筛法,用个板子函数就行了,计算出质数系数就行了 #pragma GCC optimize(2, 3, "Ofast", "inline") #include <bits/stdc.h> #define endl \n using namespace std; long long int num; const int M…...
基于Vue2与3版本的Element UI与Element Plus入门
基于Vue2与3版本的Element UI与Element Plus入门 Element UI 入门安装引入 Element UI使用组件 Element Plus 入门安装引入 Element Plus使用组件 常用组件自定义主题兼容性和升级社区和支持 Element UI 入门 Element UI 是基于 Vue 2.0 的桌面端组件库,它提供了一…...
Mysql数据库创建自增序列
创建序列表 CREATE TABLE sequence (name varchar(50) NOT NULL,current_value bigint(30) NOT NULL,increment int(11) NOT NULL DEFAULT 1 ) ENGINEInnoDB DEFAULT CHARSETutf8 ROW_FORMATDYNAMIC COMMENT序列表;创建函数 查询当前序列名的序列值 CREATE DEFINERroot% FUNC…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...
