【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…...
css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
