第五篇 openvslam建图与优化模块梳理

2023-05-16

建图模块

mapping_module在初始化系统的时候进行实例化,在构建实例的时候会实例化local_map_cleaner和local_bundle_adjuster。系统启动的时候会在另外一个线程中启动该模块。

// src/openvslam/system.cc:78
mapper_ = new mapping_module(map_db_, camera_->setup_type_ == camera::setup_type_t::Monocular);

// src/openvslam/system.cc:123
mapping_thread_ = std::unique_ptr<std::thread>(new std::thread(&openvslam::mapping_module::run, mapper_));

1779232-20190921200534265-949575333.png

对新增的关键帧进行建图

// src/openvslam/mapping_module.cc:128
void mapping_module::mapping_with_new_keyframe()
对新增的关键帧进行建图mapping_with_new_keyframe
    取出队列中最早放入的关键帧
    设置原始关键帧ID
    将新关键帧保存入数据库store_new_keyframe
        计算当前关键帧的BoW特征向量
        获取当前关键帧的lm
        如果当前关键帧可以观测到该lm,将lm添加入local_map_cleaner的fresh_landmarks中
        否则
            添加lm的观测
            更新lm几何信息
            计算lm的描述子
        更新图连接update_connections
            获取图关键帧所有lm
            统计出共视关键帧以及共视lm数量情况,筛选出共视lm大于15的关键帧weight_covisibility_pairs
            寻找出共视lm数量最多的关键帧当做最近的共视关键帧
            图中添加连接add_connection
            对weight_covisibility_pairs进行降序排列,更新ordered_covisibilities_和ordered_weights_
            更新生成树。最近的共视关键帧设置为父树,当前关键帧为子树
        存储关键帧
    去除冗余的lm(remove_redundant_landmarks)
        移除的逻辑
        1. observed_ratio小于观测门限,需要从局部地图buffer和数据库中移除;
        2. 如果lm被添加之后一段时间内,被观测到的其他帧观测到的次数<=2,则认为时无效帧,需要从局部地图buffer和数据库中移除;
        3. 如果lm被添加之后一段时间内被多次观测到,则认为该lm有效,只从局部地图buffer中移除;
    依据当前关键帧和共视关键帧重新三角化lm(create_new_landmarks)
        获取当前关键帧权重高的共视关键帧
        逐个计算当前关键帧与共视关键帧之间的本质矩阵
        利用本质矩阵计算出两关键帧lm的匹配情况
        三角化匹配的lm,三角化成功的点将添加入库
    检测处理重复的lm(update_new_keyframe)
        获取两层共视关键帧
        融合重复的lm(fuse_landmark_duplication)
            获取当前帧的lm
            逐个共视关键帧去重(replace_duplication)
                如果lm没有被共视关键帧观测到
                将lm重投影至该共视关键帧,提取共视关键帧投影区域附近的特征点,如果相似度很高且重投影误差很小,
                使用共视关键帧的lm点取代当前的lm,如果共视关键帧没有对应的lm则把当前lm添加到共视关键帧
            获取所有共视关键帧的lm集合再次进行去重(replace_duplication)
                这里和上面去重输入参数是不一样的,这里的关键帧是当前关键帧,lm是共视关键帧lm集合
        更新当前帧lm几何信息和图连接
    进行局部地图BA(local_bundle_adjuster)
    祛除冗余的关键帧remove_redundant_keyframes
        获取当前关键帧的共视关键帧
        逐个共视关键帧计算冗余观测count_redundant_observations
            获取当前共视关键帧的lm
            逐个lm统计其共视关键帧数量,如果不小于3个就认为lm是冗余的num_redundant_obs++
            lm深度有效就认为是有效的lm,num_valid_obs++
        如果num_redundant_obs / num_valid_obs > 0.9,则认为该共视关键帧是冗余的,移除掉
将新的关键帧发送给全局优化模块队列

观测门限清理

在跟踪模块优化局部地图optimize_current_frame_with_local_map时,首先会统计出当前帧可以被观测到的lm,会调用lm->increase_num_observable(),位姿优化后统计inlier的lm,调用lm->increase_num_observed(),因此num_observed_记录的是跟踪过程中真正有效的lm,num_observable_记录的是局部地图中可以被当前帧观测到的lm,如果num_observed_ / num_observable_的值很小的话,说明该lm对位姿评估没有太大意义,可以从局部地图buffer和数据库中清除掉。

// src/openvslam/tracking_module.cc:340
bool tracking_module::optimize_current_frame_with_local_map()

全局优化模块

和建图模块一样, 全局优化模块global_optimization_module在初始化系统的时候进行实例化,在构建实例的时候会实例化graph_optimizer、loop_detector和loop_bundle_adjuster。系统启动的时候会在另外一个线程中启动该模块。

// src/openvslam/system.cc:80
global_optimizer_ = new global_optimization_module(map_db_, bow_db_, bow_vocab_, camera_->setup_type_ != camera::setup_type_t::Monocular);

// src/openvslam/system.cc:124
global_optimization_thread_ = std::unique_ptr<std::thread>(new std::thread(&openvslam::global_optimization_module::run, global_optimizer_));

1779232-20190921200554770-1565896675.png

run
    取出队列中最早放入的关键帧
    设置标记保证在回环检测和校正期间关键帧不被擦除
    将关键帧传入回环检测模块
    检测回环候选detect_loop_candidates
        回环检测功能被禁用或者刚刚被校正过,则不需要检测回环候选,直接将关键帧添加到bow_db
        1. 通过查询BoW数据库来搜索循环候选者
            在查询之前,计算当前关键帧和每个共视关键帧之间的BoW相似性的最小分数
            获取回环候选acquire_loop_candidates
                获取与当前关键帧相连的关键帧集合(通过graph_node)
                统计当前关键帧和其他关键帧共享单词数量情况
                将最大共享单词数量*0.8作为最小共享单词门限
                计算共享单词数满足条件的候选关键帧于当前关键帧的bow得分
                挑选出不大于最小分数候选关键帧对儿score_keyfrm_pairs
                计算每个候选关键帧(score_keyfrm_pairs)邻域的得分并取总和best_total_score
                大于best_total_score*0.75才为有效的候选帧
            没有回环候选帧将当前关键帧添加到BoW database
        2. 寻找连续关键帧集合find_continuously_detected_keyframe_sets
            逐个查看回环候选关键帧
                获取相连的关键帧集合
                检测与之前连续关键帧集合是否相连,如果相连,添加入当前连续关键帧集合
        3. 将连接数大于2的关键帧放入回环候选
        4. 保存当前连续关键帧集合以便下次使用
    如果当前关键没有找到回环候选,那么当前帧是可以被删除的
    验证回环并且从中选出一个validate_candidates
        使用线性和非线性的方式评估当前关键帧和候选关键帧的sim3,挑选出回环候选帧
    校正回环correct_loop
        获取当前关键帧的共视关键帧
        获取回环校正前的共视关键帧的Sim3s_nw
        计算回环校正后的共视关键帧的Sim3s_nw
        校正共视关键帧中的lm的位置信息
        校正共视关键帧的位姿信息
        处理回环融合带来的重复lm(replace_duplicated_landmarks)
            用回环候选关键中的lm替换当前帧中的lm
            使用match::fuse检测重复的关键点
        获取新的连接关系,进行图优化sim3
            优化的变量只有关键帧位姿,优化完成后使用优化的结果调整landmark
        添加回环边
        最后进行loop BA

问题

  1. 搞清楚线性和非线性sim3;

转载于:https://www.cnblogs.com/hardjet/p/11564400.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

第五篇 openvslam建图与优化模块梳理 的相关文章

  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient简介与使用

    文章目录 mqttclient简介与使用优势 xff1a 在线代码生成工具占用资源大小整体框架支持的平台版本问题版权和许可linux平台下测试使用安装cmake xff1a 测试程序编译 amp 运行编译成动态库libmqttclient
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient代码生产工具介绍

    文章目录 mqttclient代码生产工具介绍连接参数配置订阅主题相关的代码配置发布消息相关的代码配置生成代码 mqttclient代码生产工具介绍 mqttclient代码生产工具主要是用于配置MQTT的参数 xff0c 并且生成相应的代
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient配置及裁剪工具

    文章目录 mqttclient配置及裁剪工具salof相关的配置使用mqttclient裁剪配置工具 mqttclient配置及裁剪工具 MQTT TOPIC LEN MAX 配置客户端支持最大的主题名长度 xff0c 主题是支持通配符的
  • 一个高性能、高稳定性的跨平台MQTT客户端——mqttclient设计与实现方式

    文章目录 mqttclient设计与实现方式设计思想API接口MQTT客户端的核心结构mqttclient实现申请一个mqtt客户端释放已申请的mqtt客户端设置MQTT客户端的信息连接服务器订阅报文取消订阅发布报文内部线程核心的处理函数发
  • mqtt连接百度天工物接入平台

    文章目录 mqtt连接到百度天工物接入百度天工物接入简介使用百度天工物接入创建项目创建策略创建身份创建用户测试连接 MQTT软件测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行测试代码使
  • mqttclient连接到OneNET云平台

    文章目录 mqttclient连接到OneNET云平台使用OneNET测试连接手动安装相关的依赖包拉取mqttclient仓库简单介绍mqttclient仓库文件夹编译运行代码使用到的API mqttclient连接到OneNET云平台 有
  • 2022年最新《谷粒学院开发教程》:1 - 构建工程篇

    资料资料资料地址代码地址 后台管理系统目录前台展示系统目录1 构建工程篇7 渲染前台篇2 前后交互篇8 前台登录篇3 文件上传篇9 前台课程篇4 课程管理篇10 前台支付篇5 章节管理篇11 统计分析篇6 微服务治理12 项目完结篇 目录
  • MQTT移植到stm32开发板——使用RT-Thread操作系统

    文章目录 mqttclientENV介绍env工具下载安装通过env移植MQTT客户端打开 env 控制台打开env并更新软件包列表移植MQTT客户端 编写自己的代码 xff1a 连接参数配置订阅主题相关的代码配置发布消息相关的代码配置生成
  • MQTT移植到stm32开发板——使用TencentOS tiny操作系统

    mqttclient 一个高性能 高稳定性的跨平台MQTT客户端 一个高性能 高稳定性的跨平台MQTT客户端 xff0c 基于socket API之上开发 xff0c 可以在嵌入式设备 xff08 FreeRTOS LiteOS RT Th
  • MQTT移植到stm32开发板——使用FreeRTOS操作系统

    mqttclient 一个高性能 高稳定性的跨平台MQTT客户端 一个高性能 高稳定性的跨平台MQTT客户端 xff0c 基于socket API之上开发 xff0c 可以在嵌入式设备 xff08 FreeRTOS LiteOS RT Th
  • 深入了解C++多态的原理及实现方式

    文章目录 前言关于多态函数承载方式虚函数方式 前言 需要深入了解C C 43 43 语言的基础之上再看此文章 关于多态 具有多种形态 xff0c 调用同一个方法会随上下文不同而产生不同的结果 xff0c 多态有静态多态与动态多态两种 函数承
  • select、poll、epoll的原理与区别

    文章目录 前言同步I O异步I O阻塞I O非阻塞I O多路复用I Oselectselect整个处理过程如下select函数原型 xff1a select的缺点 pollepollepoll的原理epoll的操作模式epoll的函数epo
  • MQTT连接到阿里云物联

    连接到阿里云物联 既然懂得专门连接百度天工物接入 xff0c 那么连接阿里云物联其实也是一样的 xff0c 因为都是基于MQTT协议进行通信的 xff0c 首先打开阿里云物联 xff1a https iot console aliyun c
  • Ubuntu20 安装微信

    1 安装deepin wine span class token function git span clone span class token string 34 https gitee com wszqkzqk deepin wine
  • 如果让你设计哈希表.....

    先确定选题 xff0c 待写
  • STM32进阶之串口环形缓冲区实现

    如需转载请说明出处 xff1a STM32进阶之串口环形缓冲区实现 队列的概念 在此之前 xff0c 我们来回顾一下队列的基本概念 xff1a 队列 Queue xff1a 是一种先进先出 First In First Out 简称 FIF
  • 在ROS中实现基于darknet_ros的目标检测

    最近用自己的渣渣笔记本电脑跑了一下yolo目标检测在ROS中的实现 xff0c 实现了用摄像头进行目标检测的任务 以下为笔记 xff0c 防止遗忘 1 使用的环境和平台 Ubuntu 16 04 LTS 43 ROS 43 Yolo 2 实
  • 01 FreeRTOS任务实例

    FreeRTOS任务实例 一 简要说明1 官方例程下载 二 学习任务的创建1 创建一个任务2 任务中传递参数3 不同优先级的任务 三 任务的延时1 使用阻塞式延时2 精确的任务定时3 低优先级任务无延时 xff0c 高优先级延时 一 简要说
  • opencv 读取相机图像+ros发布图像

    usr bin python2 coding 61 utf 8 import cv2 import numpy as np from std msgs msg import Header from sensor msgs msg impor
  • 无人机小知识:Pitch Yaw Roll的经典解释

    无人机的一个最基本的基础知识就是对Pitch Yaw Roll三个方向的辨别 查了下网上很多资料 xff0c 都采用的下面的几张图进行说明 xff0c 我觉得很直观 xff0c 记录一下 xff0c 当做备忘录 机体坐标系 xff1a 固定

随机推荐

  • 编译警告:warning: Clock skew detected. Your build may be incomplete.

    在编译darknet ros程序时 xff0c 遇到如下警告 xff1a make 2 Warning File 39 darknet ros darknet ros CMakeFiles darknet ros lib dir depen
  • Yolo v4系列学习(四)Yolo v4移植ROS

    目录 1 建立名为catkin ws的工作空间2 下载darknet ros包3 下载Yolo v4源码4 开始编译5 漫长的解决Bug的过程6 配置Yolo v4 43 ROS7 开始使用Yolo v4 43 ROS8 调参参考网址 1
  • C++(14):make_unique

    C 43 43 14增加了make unique xff0c 用于创建unique ptr对象 xff1a include lt iostream gt include lt memory gt using namespace std in
  • Git:修改commit内容

    在提交code xff0c 使用git commit编写注释时 xff0c 如果发现注释的内容不太准确 xff0c 需要修改怎么办 xff1f 比如 xff0c 当前写的注释是 xff1a this is fix for XXX 在git
  • ros安装详细教程+问题解决

    官方英文连接 xff1a melodic Installation Ubuntu ROS Wiki 如果一下命令有疑问 xff1a 见上方官方文档 xff0c 也很简洁 ROS有许多版本 xff0c ubuntu20 04对应的版本Noet
  • 激光slam 理论详解(一)

    什么是slam 技术 slam Simultaneous Localization and Mapping 叫即时定位与建图 xff0c 它主要的作用是让机器人在未知的环境中 xff0c 完成定位 xff08 Localization xf
  • gazebo模型下载以及配置

    最近在学习ROS xff0c 主要是为了结合SLAM仿真使用 启动gazebo命令 roscore 在另一个终端执行 gazebo 就可以进入清爽的gazebo界面 xff08 如果屏幕出现黑屏并不是安装错误可以稍微等待一会 xff09 x
  • ROS中在一个包里引用其他包内的自定义消息或服务

    假设我们要在a package中引用b package里自定义的my message msg 方法1 可直接通过添加依赖的方式解决 首先在创建包时添加b package catkin create pkg std msgs roscpp r
  • 第三篇 视觉里程计(VO)的初始化过程以及openvslam中的相关实现详解

    视觉里程计 xff08 Visual Odometry VO xff09 xff0c 通过使用相机提供的连续帧图像信息 xff08 以及局部地图 xff0c 先不考虑 xff09 来估计相邻帧的相机运动 xff0c 将这些相对运行转换为以第
  • ROS : 参数服务器之动态调参(dynamic_reconfigure)

    另外参考链接 xff1a ROS动态参数配置 xff1a dynparam命令行工具的使用 xff08 示例 43 代码 xff09 肥肥胖胖是太阳的博客 CSDN博客 参数服务器实现的功能 xff1a 修改参数后 xff0c 不需要重新编
  • ROS中static_transform_publisher工具的使用

    static transform publisher的功能是发布两个坐标系之间的静态坐标变换 xff0c 这两个坐标系不会发生相对位置变化 命令格式为 xff1a static transform publisher x y z yaw p
  • Docker 下载redis

    首先去docker hub 获取下载命令Docker Hub 如图 xff1a docker pull redis 为最新版本 也可以 指定版本列如 xff1a docker pull redis 6 2 6 bullseye 下载成功 r
  • VSCode 如何查看git提交的历史记录或逐行记录

    下载两个插件就行了 Git History GitLens 安装成功之后 xff0c 任意选择一个文件 xff0c 你鼠标点击哪一行代码 xff0c 后面都会提示谁在什么时候做了什么 xff0c 鼠标悬浮提示上便会直接显示作者 xff0c
  • 电池、电机、螺旋桨搭配

    电池 电机 螺旋桨搭配 span class hljs number 1 span 电机 span class hljs number 1 span 电机KV值 xff1a 大KV配小桨 xff0c 小KV配大桨 KV值是每1V的电压下电机
  • 为什么指针变量做形参可以改变实参的数据

    形参不能传任何东西给实参 xff0c 实参传过去的东西都是一个副本 下面以一个交换数据的被调函数片段为例 在指针变量由实参传递给形参时传过去的实际是指针变量的值 xff0c 即一个地址 xff0c 在 t 61 p1 p1 61 p2 p2
  • 敲线性表代码时遇到的问题(C++)【exit,return】

    1 xff1a exit OVERFLOW exit简介 为C 43 43 的退出函数 xff0c 声明于stdlib h中 xff0c 对于C 43 43 其标准的头文件为cstdlib 声明为 void exit int value e
  • /etc目录详解

    Linux etc目录详解 etc目录 包含很多文件 许多网络配置文件也在 etc 中 etc rc or etc rc d or etc rc d 启动 或改变运行级时运行的scripts或scripts的目录 etc passwd 用户
  • Tomcat 8.0 Mac 安装与配置

    工具 原料 1 xff0c JDK xff1a 版本为jdk 8u40 macosx x64 dmg 下载地址http www oracle com technetwork java javase downloads jdk8 downlo
  • 2011届移动开发者大会

    2011年11月4号星期五 xff0c 早晨八点我们就早早的来到了会场 xff0c 因为有了上次云计算大会的经验 xff0c 所以我们早早的就来了 xff0c 因为人很多我们必须才能找到一个比较好的位置 由于来的太早工作人员很多都没有就位
  • 第五篇 openvslam建图与优化模块梳理

    建图模块 mapping module在初始化系统的时候进行实例化 xff0c 在构建实例的时候会实例化local map cleaner和local bundle adjuster 系统启动的时候会在另外一个线程中启动该模块 code s