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

经典基于外观的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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python 第三方库安装换源】

换源&#xff1a; pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/其他国内第三方库的下载源地址&#xff1a; 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 科技大学&#xff1a;https://pypi.mirrors.ustc.edu.cn/simple/ 豆瓣&a…

Vue实例知识点分享

文章目录 导文下面是创建 Vue 实例的基本步骤 常用的 Vue 实例方法和属性总结 导文 Vue的实例是用来创建 Vue 应用程序的对象。通过实例化 Vue 构造函数&#xff0c;我们可以创建一个具有响应式数据、计算属性、方法和生命周期钩子等特性的 Vue 实例。 下面是创建 Vue 实例的基…

python技术分享

文章目录 python介绍应用领域环境搭建基础知识编程工具变量基本数据类型容器数据类型程序结构运算符函数类 技巧总结python内存管理python常用技术python的缺陷优化python的编码规范提升性能总结 python介绍 弱类型的语言 声明一个变量&#xff0c;直接赋值即可&#xff0c;简…

Android强大的原生调试工具adb的常用命令

文章目录 ADB简介常用命令列出链接的设备进入设备的shell环境设备日志安装应用程序卸载应用程序将本地文件复制到调试设备上将设备上的文件拉取到本地启动程序强制停止程序运行截图屏幕录制列出调试设备所有的应用的报名 结语 ADB简介 ADB&#xff08;Android Debug Bridge&am…

【从零开始学习JAVA | 第二十一篇】常见API介绍 System

目录 前言&#xff1a; System&#xff1a; System类中静态方法&#xff1a; 总结&#xff1a; 前言&#xff1a; system 是一个很底层的 API&#xff0c;是一个工具类&#xff0c;提供了一些与系统相关的方法。他在我们写项目的时候提供了一些非常实用的方法&#xff0c;本…

量子机器学习Variational Quantum Classifier (VQC)简介

变分量子分类器&#xff08;Variational Quantum Classifier&#xff0c;简称VQC&#xff09;是一种利用量子计算技术进行分类任务的机器学习算法。它属于量子机器学习算法家族&#xff0c;旨在利用量子计算机的计算能力&#xff0c;潜在地提升经典机器学习方法的性能。 VQC的…

优化--分类树,我从2s优化到0.1s

1.前言 分类树查询功能&#xff0c;在各个业务系统中可以说随处可见&#xff0c;特别是在电商系统中。 但就是这样一个简单的分类树查询功能&#xff0c;我们却优化了5次。 到底是怎么回事呢&#xff1f; 2.背景 我们的网站使用了SpringBoot推荐的模板引擎&#xff1a;Thym…

【Python实战】Python采集情感音频

成年人的世界真不容易啊 总是悲伤大于欢喜 爱情因为懵懂而快乐 却走进了复杂和困惑的婚姻 前言 我最近喜欢去听情感类的节目&#xff0c;比如说&#xff0c;婚姻类&#xff0c;我可能老了吧。我就想着怎么把音乐下载下来了&#xff0c;保存到手机上&#xff0c;方便我们业余时…

Jnpf低代码开发平台

一、写在前面 低代码开发平台&#xff0c;一个号称能在几分钟的时间里开发出一套公司内部都可使用的应用系统开发工具。 很多人或许都隐隐听说过低代码&#xff0c;因为低代码不仅远名国外&#xff0c;国内的腾讯、阿里、华为、网易、百度等科技巨头也纷纷入局&#xff0c;足以…

URL到页面: 探索网页加载的神秘过程

当我们从浏览器的地址栏输入 URL, 按下回车, 再到最后出现需要的网页界面, 这中间究竟发生了什么, 接下来就一步步进行解析. 主要是如下过程: 输入网址DNS 解析客户端发送 HTTP 请求建立 TCP 连接服务器处理请求, 计算响应, 返回响应浏览器渲染页面关闭连接 本篇中只是概述整…

docker 操作手册

名词解释 images&#xff1a;封装了应用程序的镜像 tag&#xff1a;镜像的标记&#xff0c;一个镜像可以创建多个标记 container&#xff1a;装载镜像并运行 常用命令 查看容器 docker ps -a //查看全部镜像 启动容器 docker start mysql //启动mysql容器 停止容器 doc…

Maven(三):Maven的组成详解

文章目录 坐标和依赖坐标详解依赖配置依赖范围传递性依赖依赖调节可选依赖优化排除依赖归类依赖优化依赖 仓库本地仓库远程仓库仓库镜像常用搜索地址 生命周期与插件三套生命周期clean生命周期default生命周期site生命周期 插件 聚合与继承更加灵活的构建常见问题使用jdk来运行…

TuyaOS 开发固件OTA上传固件指南

文章目录 一、产品创建二、TuyaOS设备开发三、固件上传 通过TuyaOS接入涂鸦云的产品全部默认支持固件OTA功能&#xff0c;TuyaOS设备实现固件OTA需要&#xff1a; 自定义产品创建TuyaOS嵌入式开发固件上传固件OTA配置与发布 等步骤实现产品OTA。本文重点讲述TuyaOS开发模式下&…

基于数据驱动 U-Net 模型的大气污染物扩散快速预测,提升计算速度近6000倍

项目背景 当前&#xff0c;常见的大气污染预测模型大多是基于物理机理构建的&#xff0c;比如空气质量预测模型 Calpuff、AERMOD、CMAQ 等。然而&#xff0c;这些模型运算较为复杂&#xff0c;对于输入数据的要求非常高&#xff0c;运算耗时也比较长&#xff0c;适合用于常规固…

如何在 ZBrush 和 UE5 中创建精灵吟游诗人(P1)

小伙伴们大家好&#xff0c;今天 云渲染小编给大家带来的是CG艺术家Hugo Sena关于“精灵吟游诗人”项目背后的工作流程&#xff0c;讨论了角色身体、服装和竖琴的工作流程&#xff0c;并解释了如何在虚幻引擎 5 中设置灯光。篇幅较长&#xff0c;分为上下两篇&#xff0c;大家接…

为摸鱼助力:一份Vue3的生成式ElementPlus表单组件

目录 一、实现背景 二、简介 三、组织架构设计 四、实现方式 五、代码示例 六、示例代码效果预览 七、项目预览地址 & 项目源码地址 目前项目还有诸多待完善的地方&#xff0c;大家有好的想法、建议、意见等欢迎再次评论&#xff0c;或于github提交Issues 一、实现…

【吃透网络安全】2023软考网络管理员考点网络安全(三)计算机系统安全评估

涉及知识点 计算机系统安全评估准则&#xff0c;计算机系统安全评估历史&#xff0c;软考网络管理员常考知识点&#xff0c;软考网络管理员网络安全&#xff0c;网络管理员考点汇总。 后面还有更多续篇希望大家能给个赞哈&#xff0c;这边提供个快捷入口&#xff01; 第一节…

解决vue依赖报错SockJSServer.js出现Cannot read property ‘headers‘ of null

前言 在做新的需求需要变更vue的项目代码时突然出现报错 TypeError: Cannot read property ‘headers’ of null at Server.socket.on (***/node_modules/webpack-dev-server/lib/servers/SockJSServer.js:68:32) 不清楚为什么突然出现了这个问题&#xff0c;之前在这个vue项目…

【安全】使用docker安装Nessus

目录 一、准备docker环境服务器&#xff08;略&#xff09; 二、安装 2.1 搜索镜像 2.2 拉取镜像 2.3 启动镜像 三、离线更新插件 3.1 获取challenge 3.2 官方注册获取激活码 3.3 使用challenge码和激活码获取插件下载地址 3.4 下载的插件以及许可协议复制到容器内 四…

数据结构第六章 图 6.4 图的应用 错题整理

4.A A. 不是简单路径的话&#xff0c;有环&#xff0c;去环路径会更短 B. 适合的 弗洛伊德算法才不适合 C. 本来就是 D 2X2矩阵拓展到3X3矩阵 再扩大 若是子集 即加入新顶点后&#xff0c;最短路径都没有变&#xff0c;错 5.B 本题用弗洛伊德更合适 但这道题只需全部代入求最…