从零编写一个双目视觉SLAM系统(一):一个滑窗的PnP里程计

2023-05-16

    最近在尝试用光流法写一个基本的双目视觉SLAM,希望通过这个项目把SLAM的各个模块都自己实现一遍,以此加深对SLAM各个模块的理解。
    目前刚完成了一个通过求解相邻帧PnP问题的双目视觉里程计,基本有了一个粗糙的效果,后续还需要把Bundle Adjustment、边缘化、回环检测和位姿图优化加上去。回环检测暂时设想用ORB来做。
    在这里把这个初步的里程计的思路记录一下。
代码链接

1.前端

    前端维护了一个大小为N的滑动窗口,我的代码里默认N=10。滑窗中记录了左相机位姿和一系列特征点。当接收到一对新的双目图像时,首先对上一帧左图像到当前帧左图像进行光流跟踪,去除外点后计算平均视差,如果平均视差太小,丢掉当前帧,继续接受下一帧。

1.1 特征点跟踪

    这里使用KLT光流对特征点进行跟踪,相比于利用描述子对特征点进行匹配,该方法可以节省大量运算时间。这里的特征点跟踪分成两类:

1.1.1 左右图像的光流跟踪

    对左右图像的光流跟踪主要是为了获取特征点的深度。得到深度的公式为:
d e p t h = B f x d depth=\frac{Bf_x}{d} depth=dBfx
    其中 B B B为左右相机的基线长度, f x f_x fx为焦距, d d d为视差。这里要稍微关注一下左右图像光流跟踪时去除外点的方法。因为光流跟踪会出现一些错误跟踪的点,如果不去掉错误跟踪的点,会给求解位姿带来很大的误差。我在上一篇博客里写了2种去除外点的方法,后来我又想了一种比较简单的方法,即通过比较匹配点在y坐标上的差值来去除外点。因为对于标定好的双目图像而言,正确匹配的特征点在y坐标上相差极小,因此我们可以设置一个阈值,把超出阈值的去掉。

1.1.2 左相机相邻帧光流跟踪

    这个好像没什么好讲的,就是用一个cv::findFundamentalMat去除外点。

1.2 初始化3D结构

    当接收到的图像数达到窗口大小N时,进行初始化3D结构,本质上就是求解PnP问题来计算各帧的位姿。这里我想了两种方案:
    a.选择窗口里的某一帧 l l l,并把 l l l帧的参考系作为世界坐标系,计算 l l l帧观测到的所有特征点的3D位置,然后求解窗口中其他帧的位姿。这里 l l l帧需要跟其他帧都有一定数目的共视点,共视点太少会导致求解的结果有比较大的误差。而且在求解时选择solvePnP还是solvePnPRansac也需要推敲,在我的实验里,用solvePnP求解离 l l l帧较远帧的时候会出现较大误差,而选择solvePnPRansac则能基本恢复整个3D结构。
    考虑这个方法时我考虑的是尽可能减少误差的累积,因为如果是相邻两两帧求解位姿会带来一定程度的误差累积。然而实验结果也不算太理想,有极个别位姿在y轴上有些浮动,由于我用的是KITTI数据集,图像是车子在马路上跑拍摄的,正前方为车子的Z轴方向,左右为X轴,上下为Y轴方向,理论上在y轴上的浮动应该极小才对。
    b.相邻两两帧求解位姿,用这个方法求出来的位姿会比上面的方法要平滑,但是我总感觉这样两两帧求解位姿对于后面的位姿会有较大的误差。具体误差情况怎么样还没量化分析,之后做Bundle Adjustment可以对比一下这2个方法的结果。

1.3 滑动窗口

solvePnP for adjacent frames

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

从零编写一个双目视觉SLAM系统(一):一个滑窗的PnP里程计 的相关文章

  • No rule to make target

    No rule to make target 引言 解决方法 引言 报错 No rule to make target Thirdparty g2o lib libg2o so needed by lib libygz SLAM so 停止
  • LIO-SAM:在高斯牛顿法求解过程中用SO3代替欧拉角

    LIO SAM发表于IROS2020 是一个效果非常好的惯性 激光紧耦合里程计 我打算给我们的机器人搞一个激光里程计 于是打算把LIO SAM改一改搞过来 修改过程中发现一个问题 在里程计求解 mapOptimization的LMOptim
  • Sophus使用记录

    sophus库是一个基于Eigen的C 李群李代数库 可以用来方便地进行李群李代数的运算 头文件 主要用到以下两个头文件 include
  • 视觉SLAM实践入门——(20)视觉里程计之直接法

    多层直接法的过程 1 读图 随机取点并计算深度 2 创建图像金字塔 相机内参也需要缩放 并计算对应点的像素坐标 3 应用单层直接法 使用G N L M等方法 或者使用g2o ceres库 进行优化 源码中有一些地方会引起段错误 修改方法见下
  • 经典坐标变换案例代码剖析

    题目 设有小萝卜一号和小萝卜二号位于世界坐标系中 记世界坐标系为W 小萝卜们的坐标系为R1和 R2 小萝卜一号的位姿为q2 0 35 0 2 0 3 0 1 T t1 0 3 0 1 0 1 T 小萝卜二号的位姿为q2 0 5 0 4 0
  • 【SLAM】libQGLViewer:VS 2019 + Qt 5.14.2 + Win 10 配置

    libQGLViewer 2 7 2 VS 2019 Qt 5 14 2 Win 10 配置 注意 这次配置没有完全成功 编译25个成功 一个失败 失败的是 qglviewerplugin qglviewerplugin 是一个可选控件 不
  • [SLAM四元数基础系列一] 四元数定义 Hamilton vs JPL

    四元数定义 Hamilton vs JPL 简介 四种区分方式 Hamilton vs JPL 引用 不管是卡尔曼滤波或者BA优化形式的SLAM或者VIO系统中 都需要用到单位四元数 Quaternion 来表示旋转 主要是单位四元数表示旋
  • 关于GPS、惯导、视觉里程计的几个定义

    1 首先写几个定义 惯性导航系统 Inertial Navigation System INS 全球定位卫星系统 Global Navigation Satellite System GNSS GNSS 包括全球定位系统 Global Po
  • PnP 问题

    欢迎访问我的博客首页 PnP 问题 1 DLT 2 P3P 3 G2O 求解 PnP 3 1 单目 3 2 双目 4 自定义顶点与边优化内参 4 1 二元边 4 2 三元边 4 3 总结 5 参考 PnP Perspective n Poi
  • Lego-LOAM IMU坐标系变换的详细记录

    Lego LOAM IMU坐标系变换的详细记录 0 基础知识 1 IMU 重力加速度消除 2 相机坐标系 camera 到初始坐标系 camera init 的转换 最近看了Lego LOAM 的IMU部分 没看懂IMU的坐标系变换 看其它
  • 高斯牛顿法求非线性最小二乘的步骤和c++代码实现

    slam图优化的本质是一个非线性优化问题 Gauss Newton求解步骤 1 线性化误差函数 2 构建线性系统 3 求解线性系统 4 更新解 并不断迭代直至收敛 一个简单的代码实现 一维参数xy 高维变为对应的矩阵即可 include
  • Ubuntu20.04安装各种库----简洁版

    目录 Eigen3 Sophus Pangolin Ceres g2o 建议先装anaconda再装ros python opencv啥该有的都有了 下面仅仅安装ros没有的库 Eigen3 作用 线性代数开源库 提供了有关线性代数 矩阵和
  • SLAM--三角测量SVD分解法、最小二乘法及R t矩阵的判断

    目录 一 三角测量 方法一 SVD分解法的推导 方法二 最小二乘法求解 二 ORB SLAM2 三角测量源码 三 利用Eigen源码实现三角测量 方法一 SVD分解法 方法二 最小二乘法求解 速度最快 方法三 利用OpenCV自带函数 四
  • Ceres Solver从零开始手把手教学使用

    目录 一 简介 二 安装 三 介绍 四 Hello Word 五 导数 1 数值导数 2解析求导 六 实践 Powell函数 一 简介 笔者已经半年没有更新新的内容了 最近学习视觉SLAM的过程中发现自己之前学习的库基础不够扎实 Ceres
  • 舒尔补-边际概率-条件概率

    margin求边际概率的时候喜欢通过舒尔补的形式去操作信息矩阵 如p b c 求积分p a b c da 从上图可知 边缘概率直接看协方差矩阵比较方便 边际概率的方差就是取对应联合分布中相应的协方差块 信息矩阵是由舒尔补的形式计算 此形式也
  • Ubuntu18.04安装pcl(过程/坑记录式教程)

    Ubuntu18 04安装pcl 1 下载pcl 2 安装依赖项 3 编译 4 安装 5 网上教程说要安装QT5和VTK 但按照本文的 本文记录了安装时出现的问题 出错的安装命令也记录了 建议浏览一遍再参考 不要错用了错误的指令 1 下载p
  • 视觉SLAM漫谈

    视觉SLAM漫谈 1 前言 开始做SLAM 机器人同时定位与建图 研究已经近一年了 从一年级开始对这个方向产生兴趣 到现在为止 也算是对这个领域有了大致的了解 然而越了解 越觉得这个方向难度很大 总体来讲有以下几个原因 入门资料很少 虽然国
  • 3.Open3D教程——点云数据操作

    点云数据 本教程阐述了基本的点云用法 随需要的文件链接 1 显示点云 import open3d as o3d import numpy as np print Load a ply point cloud print it and ren
  • “查找给定二进制文件中的所有代码相当于停止问题。”真的吗?

    刚刚在读书关于模拟器的高票问题和声明 事实证明 找到所有 给定二进制文件中的代码是等效的 停止问题 真的很让我印象深刻 这肯定不是真的吗 这不就是一个很大的依赖图吗 如果您能进一步了解此声明 我将不胜感激 我不同意拉斯曼的观点 停止问题表明
  • Todesk突然高速通道使用已结束

    今天使用Todesk直接报出如下错误 好像对于海外用户需要付费购买海外会员 大家有没有什么可以替换的远程控制软件的吗 能分享一下吗

随机推荐

  • PX4项目学习::(四)中间件::通信:uORB

    PX4代码学习系列博客 4 uORB相关 灰信网 xff08 软件开发博客聚合 xff09 freesion com
  • PX4项目学习::(五)项目启动流程(从上电开始)

    PX4的启动流程 初学c语言对RTOS不是很熟悉的同学对main函数都有着不一般的执着 xff0c 阅读代码时总是会去找程序的main函数 xff0c 然后从入口处开始阅读 实际上我们接触的所有软件程序 xff0c 使用到的main函数都不
  • PX4项目学习::(六)项目的配置与编译(Cmake)

    一 简介 在讲解编程之前 xff0c 我得交代两个重要的东西 xff0c 因为这两个东西存在于px4的源码系统当中 xff0c 非常重要 xff0c 它们就是make和Cmake 首先谈谈何为make 熟悉linux系统的朋友对make肯定
  • PX4项目学习::(一)项目架构::软件简明架构

    1 软件构架 PX4软件架构由两个层次组成 xff1a 一是飞行控制栈 flight stack xff0c 即自驾仪的软件解决方案 xff0c 二是中间件 xff0c 一种可以支持任意类型自主机器人的通用机器人中间件 2 1 中间件 中间
  • PX4项目学习::(四)中间件::驱动框架

    驱动框架 PX4的代码库使用一个轻量级的 xff0c 统一的驱动抽象层 xff1a DriverFramework POSIX和 QuRT的驱动写入这个驱动框架当中 旧的NuttX驱动是基于设备 架构的 xff0c 以后将会移植到驱动框架之
  • PX4项目学习::(四)中间件::任务管理与调度

    目录 1 PX4模块运行方式2 PX任务启动方式Task工作队列 参考文献 1 PX4模块运行方式 PX4项目采用两种方式运行 Tasks Work queue tasks Tasks 模块在自己的任务中运行 xff0c 具有自己的堆栈和进
  • PX4项目学习::(五)项目启动流程(纯代码讲解)

    PX4启动流程 xff0c 分为4步 xff1a 1 start xff1a 上电之后程序入口为Firmware NuttX nuttx arch arm src stm32 stm32 start c中的 start函数 xff0c 负责
  • 无人机原理::(一)模型框架与控制系统框架详解

    0 完整框图 1 无人机软件框图 上图为PX4固件框架总览 xff0c 蓝色方块是指飞控系统中的各个模块 下面分别介绍各个模块的作用 xff1a Mavlink模块最为常用 xff0c 可以调整为off board模式以配合机载电脑 xff
  • 基础理论知识

    序 xff1a 综述 机器人专业需要学习什么理论知识 robinvista的博客 CSDN博客 零 基础中的基础 数学 力学 运动学 一 动力学建模与仿真 1 机器人 机器人学基础 蒋志宏 微信读书 2 无人机 全权的两本书 B站有课 3
  • 面试流程总结

    一 HR简单了解情况 xff08 会来了解一般就没啥多说的 xff0c 就是了解下你的意象 xff0c 除非你自己不想去 xff09 二 技术面 一般分两面 xff0c 有些公司急缺人 xff0c 或者一些小公司及其它情况也有可能 面一次
  • 8款设计师常用漂亮的HTML CSS表格样式

    原来的地址 xff1a http www laozuo org 2040 html 我们在布局网站的时候以前都可能直接用TABLE设计 xff0c 如今都更流行使用CSS设计 xff0c 这样对于网站结构更加友好和轻便 下面老左整理的8款设
  • Apollo车辆控制模块::框架与流程

    self drive car 学习笔记 第11课 xff1a 控制理论 鸿 H的博客 CSDN博客 智能驾驶进阶8 控制 次言的博客 CSDN博客 一 框架图 控制输入 xff1a 主要来源于规划模块以及反馈阶段信息 xff08 如loca
  • rt-thread源码分析篇十五:rt_application_init函数分析

    一 rt application init函数调用 二 函数分析 span class token keyword void span span class token function rt application init span s
  • USB 协议整理 八:STM32官方USB库

    https blog csdn net asher zhou article details 105519209 https blog csdn net zcshoucsdn article details 78936456 本章摘取 ST
  • 常用SDK整合

    databuilding SDK官方地址 xff1a https developer android google cn topic libraries data binding
  • 机会留给有准备的人

    通过这次考试 xff0c 发现自己很多不足 xff0c 关上书完全是空白 xff0c 努力吧 xff0c 还有机会
  • 精致代码(C算法——进制问题10-->16)

    xff08 精致算法 xff09 开发思维 十进制转十六进制 蓝桥练习题 xff1a 十进制转十六进制 资源限制 时间限制 xff1a 1 0s 内存限制 xff1a 512 0MB 问题描述 十六进制数是在程序设计时经常要使用到的一种整数
  • C语言多线程同步 -- 信号量semaphore.h

    多线程读文件使用fopen xff0c 出现BUG xff0c 然后寻找同步方法 xff0c 找到这个 信号量 首先需要用sem init 初始化sem t型变量 xff0c 并设置初始信号量 比如设置为1 每次调用sem wait sem
  • 错误管理记录机制(一)

    当执行configure aprutil时 xff0c 提示 xff1a sed 不是内部或外部命令 xff0c 也不是可运行的程序或批处理文件 这是因为 configure aprutil bat 文件中使用了 Linux 下的 sed
  • 从零编写一个双目视觉SLAM系统(一):一个滑窗的PnP里程计

    最近在尝试用光流法写一个基本的双目视觉SLAM xff0c 希望通过这个项目把SLAM的各个模块都自己实现一遍 xff0c 以此加深对SLAM各个模块的理解 目前刚完成了一个通过求解相邻帧PnP问题的双目视觉里程计 xff0c 基本有了一个