ORB-SLAM2 ---- Tracking::TrackWithMotionModel函数

news2024/9/23 3:24:08

目录

1.函数作用

2.步骤 

3.code 

4.函数解释 

4.1 更新上一帧的位姿;对于双目或RGB-D相机,还会根据深度值生成临时地图点

4.2 根据之前估计的速度,用恒速模型得到当前帧的初始位姿。

4.3 用上一帧地图点进行投影匹配,如果匹配点不够,则扩大搜索半径再来一次 

4.4 利用3D-2D投影关系,优化当前帧位姿 

4.5 剔除地图点中外点


1.函数作用

        用最近的普通帧来跟踪当前的普通帧。根据恒速模型设定当前帧的初始位姿,通过投影的方式在参考帧中找当前帧特征点的匹配点,优化每个特征点所对应3D点的投影误差即可得到位姿。

2.步骤 

 * @brief 根据恒定速度模型用上一帧地图点来对当前帧进行跟踪
 * Step 1:更新上一帧的位姿;对于双目或RGB-D相机,还会根据深度值生成临时地图点
 * Step 2:根据上一帧特征点对应地图点进行投影匹配
 * Step 3:优化当前帧位姿
 * Step 4:剔除地图点中外点
 * @return 如果匹配数大于10,认为跟踪成功,返回true

3.code 

bool Tracking::TrackWithMotionModel()
{
    // 最小距离 < 0.9*次小距离 匹配成功,检查旋转
    ORBmatcher matcher(0.9,true);

    // Update last frame pose according to its reference keyframe
    // Create "visual odometry" points
    // Step 1:更新上一帧的位姿;对于双目或RGB-D相机,还会根据深度值生成临时地图点
    UpdateLastFrame();

    // Step 2:根据之前估计的速度,用恒速模型得到当前帧的初始位姿。
    mCurrentFrame.SetPose(mVelocity*mLastFrame.mTcw);
    
    // 清空当前帧的地图点
    fill(mCurrentFrame.mvpMapPoints.begin(),mCurrentFrame.mvpMapPoints.end(),static_cast<MapPoint*>(NULL));

    // Project points seen in previous frame
    // 设置特征匹配过程中的搜索半径
    int th;
    if(mSensor!=System::STEREO)
        th=15;//单目
    else
        th=7;//双目

    // Step 3:用上一帧地图点进行投影匹配,如果匹配点不够,则扩大搜索半径再来一次
    int nmatches = matcher.SearchByProjection(mCurrentFrame,mLastFrame,th,mSensor==System::MONOCULAR);

    // If few matches, uses a wider window search
    // 如果匹配点太少,则扩大搜索半径再来一次
    if(nmatches<20)
    {
        fill(mCurrentFrame.mvpMapPoints.begin(),mCurrentFrame.mvpMapPoints.end(),static_cast<MapPoint*>(NULL));
        nmatches = matcher.SearchByProjection(mCurrentFrame,mLastFrame,2*th,mSensor==System::MONOCULAR); // 2*th
    }

    // 如果还是不能够获得足够的匹配点,那么就认为跟踪失败
    if(nmatches<20)
        return false;

    // Optimize frame pose with all matches
    // Step 4:利用3D-2D投影关系,优化当前帧位姿
    Optimizer::PoseOptimization(&mCurrentFrame);

    // Discard outliers
    // Step 5:剔除地图点中外点
    int nmatchesMap = 0;
    for(int i =0; i<mCurrentFrame.N; i++)
    {
        if(mCurrentFrame.mvpMapPoints[i])
        {
            if(mCurrentFrame.mvbOutlier[i])
            {
                // 如果优化后判断某个地图点是外点,清除它的所有关系
                MapPoint* pMP = mCurrentFrame.mvpMapPoints[i];

                mCurrentFrame.mvpMapPoints[i]=static_cast<MapPoint*>(NULL);
                mCurrentFrame.mvbOutlier[i]=false;
                pMP->mbTrackInView = false;
                pMP->mnLastFrameSeen = mCurrentFrame.mnId;
                nmatches--;
            }
            else if(mCurrentFrame.mvpMapPoints[i]->Observations()>0)
                // 累加成功匹配到的地图点数目
                nmatchesMap++;
        }
    }    

    if(mbOnlyTracking)
    {
        // 纯定位模式下:如果成功追踪的地图点非常少,那么这里的mbVO标志就会置位
        mbVO = nmatchesMap<10;
        return nmatches>20;
    }

    // Step 6:匹配超过10个点就认为跟踪成功
    return nmatchesMap>=10;
}

4.函数解释 

4.1 更新上一帧的位姿;对于双目或RGB-D相机,还会根据深度值生成临时地图点

ORB-SLAM2 ---- Tracking::UpdateLastFrame函数解析icon-default.png?t=M85Bhttps://blog.csdn.net/qq_41694024/article/details/128192577        通过这一步,我们计算了LastFrame的位姿并且对于双目或RGB-D相机来说,我们新增了一些地图点。

4.2 根据之前估计的速度,用恒速模型得到当前帧的初始位姿。

         当前帧本身是没有位姿的,恒速模型设置当前帧的位姿为速度mVelocity * 上一帧的位姿得到当前帧的初始位姿。

        我们看速度mVelocity 的更新:

                // 更新恒速运动模型 TrackWithMotionModel 中的mVelocity
                cv::Mat LastTwc = cv::Mat::eye(4,4,CV_32F);
                mLastFrame.GetRotationInverse().copyTo(LastTwc.rowRange(0,3).colRange(0,3));
                mLastFrame.GetCameraCenter().copyTo(LastTwc.rowRange(0,3).col(3));
                // mVelocity = Tcl = Tcw * Twl,表示上一帧到当前帧的变换, 其中 Twl = LastTwc
                mVelocity = mCurrentFrame.mTcw*LastTwc; 
            }

        它其实是上一帧到当前帧的变换,它不断在更新,因此“上一帧到当前帧的变换”mVelocity (lastFrame的上一帧到lastFrame的变换) * 上一帧的位姿(lastFrame的位姿),即我们假设相同两帧的变化幅度不大,用LastFrame的LastFrame到LastFrame的变换来代替LastFrame到CurrentFrame的变化矩阵,但这仅仅是个初始值。

        随后清空当前帧CurrentFrame的地图点,根据相机类型选择匹配半径。

4.3 用上一帧地图点进行投影匹配,如果匹配点不够,则扩大搜索半径再来一次 

        我们用上一帧地图点进行投影匹配,如果匹配点不够,则扩大搜索半径再来一次。

        如果匹配点太少,则扩大搜索半径再来一次。

        如果还是不能够获得足够的匹配点,那么就认为跟踪失败。

4.4 利用3D-2D投影关系,优化当前帧位姿 

4.5 剔除地图点中外点

        如果我们经过优化后确定当前地图点是外点,则清除它的所有关系:

        ①将当前帧的地地图点mvpMapPoints[i]的内存清空

        ②设置当前地图点的外点的标记mvbOutlier为NULL。属于外点的特征点标记,在 Optimizer::PoseOptimization 使用了。

        ③将标记mbTrackInView设置为false

mbTrackInView==false的点有几种:
 a 已经和当前帧经过匹配(TrackReferenceKeyFrame,TrackWithMotionModel)但在优化过程中认为是外点
b 已经和当前帧经过匹配且为内点,这类点也不需要再进行投影 
c 不在当前相机视野中的点(即未通过isInFrustum判断)

        ④将标记mnLastFrameSeen设置为false

mnLastFrameSeen==mCurrentFrame.mnId的点有几种:
a 已经和当前帧经过匹配(TrackReferenceKeyFrame,TrackWithMotionModel)但在优化过程中认为是外点
b 已经和当前帧经过匹配且为内点,这类点也不需要再进行投影

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

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

相关文章

JDK版本对应其major.minor version,看这一篇就够啦(附java历史版本下载地址)

文章目录前言JDK版本对应其major versionJDK历史版本下载地址前言 今天博主在学习SpringBoot&#xff0c;启动项目时遇到这样一个问题 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.10.1:compile (default-compile) on project springbo…

[附源码]JAVA毕业设计企业信息安全评价系统(系统+LW)

[附源码]JAVA毕业设计企业信息安全评价系统&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

[附源码]Python计算机毕业设计Django小区疫情事件处理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

Git学习笔记 Git Gitee GitHub GitLab

目录 Git GitHub Gitee码云 GitLab Git 概述 何为版本控制 为什么需要版本控制 集中式版本控制工具 分布式版本控制工具 Git和代码托管中心 Git命令 git init命令 git config git status 查看 git 状态 git rm --cached xx git commit -m “备注” xx git reflo…

PHP代码审计系列(二)

PHP代码审计系列&#xff08;二&#xff09; 本系列将收集多个PHP代码安全审计项目从易到难&#xff0c;并加入个人详细的源码解读。此系列将进行持续更新。 strcmp比较字符串 源码如下 <?php $flag "flag"; if (isset($_GET[a])) { if (strcmp($_GET[a], …

DBCO-PEG3-Maleimide,Mal-PEG3-DBCO,二苯并环辛炔-三聚乙二醇-马来酰亚胺

​ 中英文名&#xff1a; CAS号&#xff1a;N/A| 英文名&#xff1a;DBCO-PEG3-Maleimide&#xff0c;Mal-PEG3-DBCO |中文名&#xff1a;二苯并环辛炔-三聚乙二醇-马来酰亚胺物理参数&#xff1a; CASNumber&#xff1a;N/A Molecular formula&#xff1a;C34H38N4O8 Molecul…

[附源码]计算机毕业设计绿色生鲜Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

一键免密登录云平台!ZStack Cloud 4.5.0等你来解锁……

近日&#xff0c;ZStack Cloud 4.5.0发布&#xff0c;新增支持多种标准单点登录&#xff08;SSO&#xff09;协议。云平台现可对接OIDC/OAuth2/CAS三种协议的统一身份认证系统&#xff0c;使认证系统中的用户可一键免密登录云平台&#xff0c;大大提高了云平台的访问效率和安全…

在 Git Bash 中为 vim 设置 Dracula 配色

因为本人一直习惯了用 Jetbrains 家的产品&#xff0c;而且一直独钟 Dracula 配色&#xff0c;因此想要在 Git Bash 中为 vim 配一款 Dracula 配色。本博客将详细介绍如何为 vim 配置暗系主题 Dracula。 一、安装 Dracula 在 Dracula 的官网其实已经给出了关于如何在 vim 中配…

Pygame入门

目录一、初始化pygame环境&#xff08;一&#xff09;在pycharm中新建一个工程&#xff08;二&#xff09;安装pygame&#xff08;三&#xff09;测试安装是否成功二、pygame基础&#xff08;一&#xff09;pygame初始化&#xff08;二&#xff09;设置显示界面&#xff08;三&…

[附源码]计算机毕业设计JAVA在线二手车交易信息管理系统

[附源码]计算机毕业设计JAVA在线二手车交易信息管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; S…

《PyInstaller打包实战指南》第二十二节 单文件模式打包Playwright

第二十二节 单文件模式打包Playwright 打包示例源码下载: 请看文章末尾 版本信息: playwright==1.28.0 pyinstaller==5.3 打包系统: Windows 10 打包前我们要先运行下代码,确保没有报错: # belle.py from playwright.sync_api import sync_playwrightwith sync_playw…

【Android】 android | as | android studio 安装与使用

一、说明 1、本文重点介绍android studio的使用&#xff0c;做Android应用开发 2、主要包括&#xff1a; 下载&#xff0c;安装&#xff0c;sdk配置&#xff0c;工具使用说明 二、下载Android Studio与配置 1、下载链接 https://developer.android.google.cn/studio 2、安装 参…

特征工程特征预处理归一化与标准化、鸢尾花种类预测代码实现

一、特征预处理 特征工程目的&#xff1a;把数据转换成机器更容易识别的数据 scikit-learn&#xff1a;提供几个常见的实用程序函数和转换器类&#xff0c;以将原始特征向量更改为更适合下游估计器的表示形式。即通过一些转换函数将特征数据转换成更加适合算法模型的特征数据…

IDEA基本配置

1.设置maven 1.在File->settings->搜索maven 2.Mavan home directory--设置maven安装包的bin文件夹所在的位置 3.User settings file--设置setting文件所在的位置 4.Local repository--设置本地仓库 2.IDEA 设置代码行宽度 1.在File->settings->Editor->Code St…

深度学习训练营之彩色图片分类

深度学习训练营原文链接环境介绍前置工作设置GPU导入数据归一化操作图片可视化构建CNN网络进行编译模型训练结果可视化图片展示对图片的内容进行辨别模型的精度评估原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&…

我为什么选择博客园!

过去一段时间我尝试了很多平台&#xff0c;说下感受。但是最后我还是选择了博客园。 1. 开始写csdn的原因&#xff1a; 积累一些东西&#xff0c;从而为自己的简历以及工作加分。 分享知识。 梳理知识和记录&#xff0c;因为好多东西做过&#xff0c;再问就忘了。尤其是面试…

深度学习-扩张卷积(dilated convolution)

1. 前言 扩张卷积&#xff08;DilatedConvolution&#xff09;也被称为空洞卷积或者膨胀卷积&#xff0c;是在标准的卷积核中注入空洞&#xff0c;以此来增加模型的感受野&#xff08;receptionfield&#xff09;\color{blue}{扩张卷积&#xff08;Dilated Convolution&#xf…

IOS内测记录:在自有App中运行小程序游戏

作为FinClip的老用户&#xff0c;很早就向官方提出了希望支持微信小游戏的建议。现如今&#xff0c;官方也把小游戏支持提上了日程&#xff0c;近期开启了公测通道。团队用小游戏进行了测试&#xff0c;在这里记录分享一下测试情况。 实现效果将微信小游戏搬到自己的APP中使用…

python用于NLP的seq2seq模型实例:用Keras实现神经网络机器翻译

在本文中&#xff0c;我们将看到如何创建语言翻译模型&#xff0c;这也是神经机器翻译的非常著名的应用。 最近我们被客户要求撰写关于NLP的研究报告&#xff0c;包括一些图形和统计输出。我们将使用seq2seq通过Python的Keras库创建我们的语言翻译模型。 假定您对循环神经网络…