经典基于外观的SLAM框架-RTABMAP(RGBD视觉输入方案)

news2024/12/24 20:23:16

经典基于外观的SLAM框架-RTABMAP

文章目录

  • 经典基于外观的SLAM框架-RTABMAP
    • 1. RTABMAP整体框架
    • 2.RTABMAP的内存管理机制
    • 3. 视觉里程计
    • 4. 局部地图
    • 5. 回环检测与图优化
    • 6. 代码工程实践

1. RTABMAP整体框架

  RTABMAP是采用优化算法的方式求解SLAM问题的SLAM框架,本赛题的定位参考输入信息只有RGB-D相机的图像信息,RTABMAP支持RGB-D视觉信息的输入,并且输出包括位姿、二维占据栅格地图(2D Occupancy)、三维占据地图(3D Occupancy)和点云地图,输出地图具有多样性,RTABMAP有分级的内存管理机制,能够对输入帧进行图结构建模和统筹规划,将建图部分的计算量简化到设备可以承受的范围内。
视觉传感器有两个优点,其一是定位的位姿具有鲁棒性,不易丢失;其二是感知到的信息量较大,与激光传感器相比得到的语义更加丰富。里程计能提供短期运动信息,这种信息可以给位姿估计提供预测信息,当环境特征缺失时,里程计提供的短期运动信息也可以参考处理。RTABMAP的系统框架图:
在这里插入图片描述
  在RTABMAP中,视觉传感器是必备的输入传感器,另外可以输入激光雷达传感器作为选配输入传感器,当然也可以将RGB-D的信息通过转换工具转换为激光点数据,一般这种方案存在于接入ros-navigation工具包使用,该工具包的必备输入是激光扫描输入,RTABMAP接入里程计的形式可以是轮式里程计、视觉里程计、激光里程计等,由于赛题条件的限制,我们采用视觉里程计,RTABMAP托管机器人坐标和地图坐标系的转换关系完成位姿估计,传感器数据会存入STM(Short-Term Memory),这段内存块被称为短期内存模块,由于RTABMAP采用图结构来组织地图,图结构包含节点和边,所以每一帧传感器数据的到来都会创建一个节点,该节点中存储的内容包括该帧对应的里程计位姿、该帧所有传感器的视觉观测数据以及在该帧上提取出的视觉单词(基于词袋模型的回环检测)和局部地图等。节点之间的连接边分为三种:

  1. 相邻连接边。相邻连接边里程计能够直接获得相邻连节点之间的位姿变换关系。
  2. 闭环连接边。闭环连接边基于视觉词袋的闭环检测和多视图几何计算出当前节点与闭环节点之间的位姿变换关系。
  3. 相似连接边。相似连接边主要用于激光扫描数据相关的闭环检测,因为激光扫描设备对于巡视器本身的转向不敏感,更容易在闭环检测上出现问题。

  在闭环检测检测到闭环时,RTABMAP将所有的节点和所有的边进行全局优化,优化的过程通过图优化模块进行,同时会对内部的位姿漂移问题进行优化(主要是修正地图点到里程计的变换关系),经过修正后的节点中存储的局部地图通过拼接集成全局地图。

2.RTABMAP的内存管理机制

  由于视觉传感器的每一帧到来都会创建一个节点,那么建图规模达到很大之后,节点的数量也是同样非常大的,在此种情况下,对所有进行进行全局优化的计算将会十分的耗费资源甚至难以行进,为了保证优化和回环检测的实时性,RTABMAP采用了分级的内存管理机制。
  RTABMAP采用图结构维护地图结构,将所有的节点分为三类,即存储局部地图节点的STM、存储全局地图节点的工作内存WM(Working Memory)、存储短期与全局地图缺乏相关性的不重要节点的长期内存LTM(Long-Term Memory),节点的分类实例如下图所示,图中横向的箭头表征相邻连接边,竖向的箭头表征闭环连接边,灰色节点存储在STM中,白色节点存储在WM中,黑色节点处于LTM中,编号455节点外围有黑色外圈,表征当前巡视器位姿,其中每个节点都包含视觉传感器观测的数据、里程计的位姿信息和各连接边信息等。
在这里插入图片描述

  RGB-D的视觉传感器数据输入SM内存块,本内存块对传感器的观测数据进行数据降维、特征提取、位姿计算后,加入STM内存块,在STM内存块添加时序相邻的节点若相似度较高,则对两个节点进行权重更新的融合计算,当STM区满后,挑选最早加入STM的节点移出,并加入到WM进行后续的闭环检测搜索节点储备,WM中的闭环检测涉及词袋模型和贝叶斯滤波,视觉词袋用于计算两个节点之间的相似度,贝叶斯滤波器维护节点之间的相似性。当WM内存区满后,挑选最早进入WM区的节点移出,并加入到LTM中。内存管理机制的框图如下图所示。

在这里插入图片描述

3. 视觉里程计

  视觉里程计采用F2M(Frame-to-Map)实现,F2F(Frame-to-Frame)是利用图像帧到图像帧之间的特征点配准来进行位姿变换的计算,而F2M利用图像帧到地图之间的特征点配准进行位姿变换的配准,RTABMAP的视觉里程计系统框图如下图所示。
在这里插入图片描述

4. 局部地图

  在RTABMAP的STM中插入新节点后,系统会利用深度图像生成对应的局部地图,局部地图的参考坐标系为巡视器本身的坐标系,全局地图(最终经过局部地图拼接而成)的参考坐标系为世界坐标系,局部地图与全局地图通过机器人到世界坐标系的坐标变换完成。视觉里程计节点利用闭环检测和全局优化,以此种方式维护全局位姿,全局位姿的核心是地图到视觉里程计的坐标变换关系。局部地图的输出流程处理框图如下图所示。
在这里插入图片描述

5. 回环检测与图优化

  对于局部建图的累计误差,需要回环检测和全局优化的介入,视觉词袋模型和贝叶斯滤波器用于回环检测,视觉词袋模型属于视觉SLAM的常规模型和解决办法,其主要用于快速匹配相似度高的帧,而贝叶斯滤波器维护所有候选节点相似度的概率分布。设当前位姿节点为 L t L_t Lt,随机变量 S t S_t St表示WM中所有待检测的候选节点,随机变量 S t = i S_t=i St=i的概率表征 L t L_t Lt L i L_i Li有回环的可能性,根据贝叶斯可得 S t S_t St更新的公式如下式所示。
P ( S t | L t ) = η P ( L t | S t ) ∑ i = − 1 t n P ( S t | S t − 1 = i ) P ( S t − 1 = i | L t − 1 ) P\left(S_t\middle| L^t\right)=\eta P\left(L_t\middle| S_t\right)\sum_{i=-1}^{t_n}{P\left(S_t\middle| S_{t-1}=i\right)P\left(S_{t-1}=i\middle| L^{t-1}\right)} P(St Lt)=ηP(LtSt)i=1tnP(StSt1=i)P(St1=i Lt1)
  其中 L = L − 1 , … , L t L=L_{-1},\ldots,L_t L=L1,,Lt表示t时刻WM中所有的节点,观测模型 P ( L t | S t ) P\left(L_t\middle| S_t\right) P(LtSt)可以通过似然函数 ℓ ( S t = j | L t ) = P ( L t | S t = j ) \ell\left(S_t=j\middle| L_t\right)=P\left(L_t\middle| S_t=j\right) (St=jLt)=P(LtSt=j)计算。归一化的观测模型 P ( S t | L t ) P\left(S_t\middle| L^t\right) P(StLt)与阈值对比,若低于阈值则回环检测成功,否则取 P ( S t | L t ) P\left(S_t\middle| L^t\right) P(StLt)中概率取值最高的 S t = i S_t=i St=i对应的节点 L i L_i Li选定为回环节点。最后将WM中所有的节点和约束边进行全局优化,同时对里程计位姿进行修正。

6. 代码工程实践

  RTABMAP的源码地址在https://github.com/introlab/rtabmap
  RTAB-Map(Real-Time Appearance-Based Mapping)是一个开源的RGB-D SLAM(Simultaneous Localization and Mapping)库,用于实时构建环境地图。它结合了视觉识别和图像姿态估计,并使用回环检测来优化地图的一致性。RTAB-Map的代码组织结构主要包括以下几个主要组件:

  1. Core(核心):这是RTAB-Map的核心模块,提供了地图构建、回环检测和姿态估计等功能。它实现了基于视觉特征的回环检测算法和基于图优化的姿态估计方法。

  2. Database(数据库):RTAB-Map使用数据库来存储和管理地图数据。数据库模块提供了对地图的读取、写入和查询功能。它可以将地图数据保存到硬盘上的SQLite数据库中,并且可以根据需要从数据库中加载地图。

  3. GUI(图形用户界面):RTAB-Map附带了一个基于Qt的图形用户界面,用于可视化地图构建的过程和结果。GUI模块提供了交互式地图浏览、参数设置和结果导出等功能。

  4. Plugins(插件):RTAB-Map支持插件扩展,可以通过插件机制添加额外的功能。例如,它提供了插件接口来支持不同类型的传感器、回环检测算法和地图优化算法。

  5. Examples(示例):RTAB-Map提供了一些示例代码,演示如何使用库中的不同功能。示例代码包括从RGB-D相机读取数据、构建地图、保存和加载地图等。

以RGB-D作为输入的程序参考示例:

#include <ros/ros.h>
#include <std_msgs/String.h>
#include <sensor_msgs/Image.h>
#include <sensor_msgs/CameraInfo.h>
#include <sensor_msgs/PointCloud2.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/opencv.hpp>
#include <rtabmap_ros/rgbd_sync.h>
#include <rtabmap_ros/rgbd_odometry.h>
#include <rtabmap_ros/rgbd_mapping.h>

void imageCallback(
    const sensor_msgs::ImageConstPtr& rgbMsg,
    const sensor_msgs::ImageConstPtr& depthMsg,
    const sensor_msgs::CameraInfoConstPtr& infoMsg)
{
    cv_bridge::CvImagePtr cvRgbPtr;
    cv_bridge::CvImagePtr cvDepthPtr;
    try
    {
        cvRgbPtr = cv_bridge::toCvCopy(rgbMsg, sensor_msgs::image_encodings::BGR8);
        cvDepthPtr = cv_bridge::toCvCopy(depthMsg, sensor_msgs::image_encodings::TYPE_32FC1);
    }
    catch (cv_bridge::Exception& e)
    {
        ROS_ERROR("cv_bridge exception: %s", e.what());
        return;
    }

    cv::Mat rgbImage = cvRgbPtr->image;
    cv::Mat depthImage = cvDepthPtr->image;

    // Perform RGB-D SLAM with RTAB-Map

    // ...
}

int main(int argc, char** argv)
{
    ros::init(argc, argv, "rtabmap_example");
    ros::NodeHandle nh;

    message_filters::Subscriber<sensor_msgs::Image> rgbSub(nh, "/camera/rgb/image_raw", 1);
    message_filters::Subscriber<sensor_msgs::Image> depthSub(nh, "/camera/depth/image_raw", 1);
    message_filters::Subscriber<sensor_msgs::CameraInfo> infoSub(nh, "/camera/rgb/camera_info", 1);

    typedef message_filters::sync_policies::ApproximateTime<sensor_msgs::Image, sensor_msgs::Image, sensor_msgs::CameraInfo> MySyncPolicy;
    message_filters::Synchronizer<MySyncPolicy> sync(MySyncPolicy(10), rgbSub, depthSub, infoSub);
    sync.registerCallback(boost::bind(&imageCallback, _1, _2, _3));

    ros::spin();

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/648775.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux---虚拟机配置固定IP

1. IP地址 每一台联网的电脑都会有一个地址&#xff0c;用于和其它计算机进行通讯 IP地址主要有2个版本&#xff0c;V4版本和V6版本&#xff08;V6很少用&#xff0c;课程暂不涉及&#xff09; IPv4版本的地址格式是&#xff1a;a.b.c.d&#xff0c;其中abcd表示0~255的数字…

深度学习应用篇-元学习[15]:基于度量的元学习:SNAIL、RN、PN、MN

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

免费的Outlook邮箱备份的方法!

关于Outlook邮箱备份 Outlook是Microsoft Office微软办公软件套装的组件之一&#xff0c;利用一套Microsoft应用程序和服务&#xff0c;与Office工具共享与协作&#xff0c;和各种设备时刻保持联系。用户可以通过登录邮箱首页申请Outlook为域名后缀的邮箱。 长时间使用Outl…

使用海外社交媒体的九种方法(和五个专业提示!)

社交媒体是推广您的产品、吸引新客户以及围绕您的业务建立社区的有效方式。您可以使用社交媒体做的事情几乎没有限制&#xff0c;但无限的可能性会带来让自己过于分散的风险。好消息是&#xff0c;通过遵循一些最佳实践&#xff0c;您的在线商店可以取得成功。 目录 使用…

3ds MAX 灯光

简单展示一下3dsMAX中灯光的不同效果&#xff1a; 先简单画一个房间出来&#xff0c;展示效果就不添加材质了 在选项卡中添加灯光&#xff1a; 首先是直接渲染的结果&#xff0c;没有添加光照&#xff0c;可以看出也没有阴影等 采用【目标聚光灯】&#xff0c;这有点类似在摄…

【MySQL新手入门系列二】:手把手教你入门MySQL - 数据库及数据表操作

如果您是一位刚刚开始学习MySQL的新手&#xff0c;本文将为您提供一些实用的入门知识和技巧&#xff0c;帮助您快速上手。 【MySQL新手入门系列一】&#xff1a;手把手教你入门MySQL 前面我们已经大致讲了一下mysql的安装等介绍&#xff0c;本篇文章将以windows为例&#xff0c…

聚类分析(文末送书)

目录 聚类分析是什么 一、 定义和数据类型 聚类应用 聚类分析方法的性能指标 聚类分析中常用数据结构有数据矩阵和相异度矩阵 聚类分析方法分类 二、K-means聚类算法 划分聚类方法对数据集进行聚类时包含三个要点 K-Means算法流程: K-means聚类算法的特点 三、k-med…

【JVM系列】垃圾收集器介绍

文章目录 垃圾收集器Serial收集器ParNew收集器Parallel收集器CMS收集器G1收集器 常用的收集器组合 垃圾收集器 Serial收集器 串行收集器是最古老&#xff0c;最稳定以及效率高的收集器&#xff0c;可能会产生较长的停顿&#xff0c;只使用一个线程去回收。新生代、老年代使用…

不逆向解决5s盾之cloudscraper

一、背景 经常写爬虫的同学&#xff0c;肯定知道 Cloud Flare 的五秒盾。当你没有使用正常的浏览器访问网站的时候&#xff0c;它会返回如下这段文字&#xff1a; Checking your browser before accessing xxx. This process is automatic. Your browser will redirect to your…

020+limou+C语言内存管理

0.在Linux下验证C语言地址空间排布 这里是limou3434的博文系列。接下来&#xff0c;我会带您了解在C语言程序视角下的内存分布&#xff0c;会涉及到一点操作系统的知识&#xff0c;但是不多&#xff0c;您无需担忧。 注意&#xff1a;只能在Linux下验证&#xff0c;因为Windo…

外观模式(十三)

每天都是全新的一天&#xff0c;感谢今日努力的自己。 上一章简单介绍了组合模式(十二), 如果没有看过, 请观看上一章 一. 外观模式 引用 菜鸟教程里面的外观模式介绍: https://www.runoob.com/design-pattern/facade-pattern.html 外观模式&#xff08;Facade Pattern&…

商品编号篡改测试-业务安全测试实操(7)

商品编号篡改测试,邮箱和用户篡改测试 手机号码篡改测试-业务安全测试实操(6)_luozhonghua2000的博客-CSDN博客 邮箱和用户篡改测试 测试原理和方法 在发送邮件或站内消息时,篡改其中的发件人参数,导致攻击者可以伪造发信人进行钓鱼攻击等操作,这也是一种平行权限绕过漏洞…

2023年CPSM-3中级项目管理专业人员认证招生简章

CPSM-3中级项目管理专业人员认证&#xff0c;是中国标准化协会&#xff08;全国项目管理标准化技术委员会秘书处&#xff09;联合中国国际人才交流基金会&#xff0c;面向社会开展项目管理专业人员能力的等级证书。旨在构建多层次从业人员培养培训体系&#xff0c;建立健全人才…

软体机器人对工业应用的影响

原创 | 文 BFT机器人 软机器人模仿生物体的运动和动作&#xff0c;使它们具有高度的多功能性和迷人性。 软机器人领域正在迅速发展。它旨在为各种行业创造灵活的设备&#xff0c;包括医疗保健、太空探索、食品生产、地理、物流、康复、国防和家庭应用。 软机器人的独特之处在于…

windows下使用cmake编译c++

好久没有更新博客了 最近在做c相关的&#xff0c;编译起来确实很痛苦。 所以心血来潮&#xff0c;继续更新一下 主要还是一些跨平台的库&#xff0c;比如zlib、libpng、opencv、ffmpeg 编译工具使用mingw作为主要编译环境支持&#xff0c;使用msys进行编译。 一、下载mingw…

Python--输入和输出

Python--输入和输出 <font colorblue>一、输入&#xff1a;input()函数<font colorblue>二、输出&#xff1a;print()函数<font colorblue>1.print函数说明<font colorblue>2.格式化输出<font colorblue>方法一&#xff1a;使用占位符&#xff0…

MySQL哈希索引

介绍 建表时存储引擎选择 MEMORY&#xff0c;则创建索引就是哈希索引&#xff1a;如create index nameidx on student(name);哈希索引底层数据结构就是链式哈希表&#xff0c;链式就是指冲突时用链表法解决哈希表中的元素没有任何顺序可言&#xff0c;则只能进行等值比较。如果…

PinYin4j库的使用

一、PinYin4j库简介 1、PinYin4j简介 Pinyin4j 是一个流行的 Java 库&#xff0c;支持汉字和大多数流行的拼音系统之间的转换&#xff08;汉语拼音&#xff0c;罗马拼音等&#xff09;。可自定义拼音输出格式&#xff0c;功能强大。 官网地址&#xff1a;http://pinyin4j.sou…

道岔表示故障电路如何进行检查

一、分线盘区分提速道岔表示电路故障的方法 定位时可以通过测量X1、X2 (或者反位时X1、X3)端子间的交直流电压和BD1-7的3号端子上的电流&#xff0c;来判断表示电路的故障和范围。表示电路正常工作时&#xff0c;在分线盘端子X1、X2之间可以测到电压交流60V左右&#xff0c;直…

小白也能学会的电脑C盘空间释放技巧大集合

引言 电脑C盘快装满了怎么办&#xff1f;这是很多人使用电脑时面临的困扰。电脑的运行速度会变得很慢&#xff0c;甚至出现蓝屏等问题。那么&#xff0c;如何解决电脑C盘快装满的问题呢&#xff1f;接下来&#xff0c;本文将详细介绍解决电脑C盘快装满的几种方法。 先记录一下…