自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 VINS-Fusion源码逐行解析:processImage函数最后剩下的几个函数predictPtsInNextFrame()、failureDetection()等

vins-fusion的主要函数到这里也就基本讲完了,跟一遍下来自己熟悉的同时也希望能给大家带来一些方便,之后会继续给大家带来一些slam的相关内容,有什么问题或建议大家可以关注并私信我,博主能解答的一定尽全力解答。接着看下清空状态的函数clearState(),该函数作用是重置整个状态,清空缓冲区、重置各种变量和标志位,确保系统处于初始状态或者清空所有运行状态以备新的运行使用。今天这讲写完后,vins-fusion也基本完成一遍流程,讲完了。

2024-07-16 18:47:49 85

原创 VINS-Fusion源码逐行解析:对外点操作的一系列函数outliersRejection()、reprojectionError()、removeOutliers()

首先outliersRejection()函数,函数作用是对所有特征点进行遍历,通过计算累计的重投影误差,根据设定的阈值来将不符合要求的特征点给个标签removeIndex,然后分单双目情况,单目是同一特征点在不同帧中的观测来计算重投影误差,双目是将右目当作单目,同一特征点在不同帧中的重投影误差,还有就是同一特征点在左右目中的重投影误差一同累计。计算重投影误差的函数为reprojectionError()当初始化完位姿,优化完位姿、设定位姿等等操作做完后,接下来就是清算了,将外点删除掉。

2024-07-15 23:23:22 117

原创 VINS-Fusion源码逐行解析:updateLatestStates()函数与slideWindow()

该函数的预测过程是基于已有的IMU数据来进行的,利用了加速度计和陀螺仪传感器的数据来进行状态(包括位置、姿态、速度等)的预测。这个函数的主要作用是更新估计器的最新状态。当滑动窗口的大小达到预设的最大值时,它负责移除最老的帧或最新的帧,以便腾出空间用于新加入的帧。边缘化最新帧:当滑动窗口已满且需要边缘化最新帧时,将最新帧的数据复制到倒数第二帧的位置,并处理IMU预积分信息,然后调用。边缘化最老帧:当滑动窗口已满且需要边缘化最老帧时,将窗口中的每一帧数据向前移动一位,并处理IMU预积分信息,然后调用。

2024-07-15 21:26:38 345

原创 VINS-Fusion源码逐行解析:优化函数optimization()

最后,如果帧数没达到窗口滑动优化的数量,就不进行边缘化操作了,如果达到了,那么说明我们要删去某帧的信息了在优化中,于是我们丢弃最早帧的位姿和速度偏置的参数块,并建立新的边缘化信息,如果使用imu就把imu因子也存进去,还有所有特征点在当前滑窗中第一帧投影信息,都放进去,接着调用preMarginalize()函数和marginalize()完成边缘化,记录一下时间,就将更新一下边缘化信息,当前帧变为前一帧通过addr_shift映射,的构建和添加是为了减少计算复杂度,同时保留必要的信息。

2024-07-13 16:16:21 538

原创 VINS-Fusion源码逐行解析:三角化函数triangulate()和triangulatePoint()

该函数使用两种方法来计算特征点深度,第一种是双目或多帧三角化,第二种是svd分解来计算深度第二个方法的目的是提供一种冗余机制,以确保即使第一个方法未能提供可靠的深度估计,也能通过SVD提供一个合理的估计值。SVD方法通过最小化重投影误差来估计深度,具有较强的鲁棒性,特别是在噪声存在的情况下。我们再来看一下三角化计算点深度的函数,三角化函数都是老朋友了,大家都看过很多遍了,看完这个明天开始看优化函数。

2024-07-12 23:34:20 182

原创 VINS-Fusion源码逐行解析:除单目+imu模式外的位姿初始化函数initFramePoseByPnP()及其内部函数

通过之前看processImage函数,我们发现只有单目+imu模式的位姿初始化函数用的是sfm那种,也就是initialStructure()函数,而除了这个模式外的别的模式,如双目+imu、仅双目、和不是初始化过程中位姿初始化函数都使用initFramePoseByPnP()

2024-07-12 22:22:12 150

原创 VINS-Fusion源码逐行解析:函数VisualIMUAlignment()及其内部一系列imu和视觉融合函数

在这里笔者理解的视觉与imu信息相融合就是通过构建和求解线性系统,将IMU数据和视觉数据结合起来,利用视觉信息的准确性,优化IMU的陀螺仪偏置和重力向量g,同时调整视觉信息中的尺度因子s。上一个函数单目+imu模式初始化函数initialStructure()的末尾有一个函数VisualIMUAlignment()是将imu与视觉融合的函数,我们来看一下和内部函数。首先是VisualIMUAlignment()函数,比较简单,调用两个函数。按顺序是 solveGyroscopeBias()函数。

2024-07-08 23:44:50 226

原创 VINS-Fusion源码逐行解析:单目+imu模式初始化函数initialStructure()及imu与视觉融合函数visualInitialAlign()

通俗的讲就是使用imu数据是要有足够的运动。首先,我们检测imu的激励,这里讲一下imu激励是什么,在使用惯性测量单元(IMU)进行传感和数据收集过程中,通过设备的运动来激发IMU传感器,从而产生有效的测量数据。方法得到的位姿,而对于非关键帧,则使用PnP算法求解位姿,最后我们获得了帧容器中存的所有帧的位姿,区别只是关键帧和非关键帧位姿获取方式不同,最后,通过。方法进行全局结构从运动(SFM)重建,计算所有帧的位姿,之后,对所有帧遍历,通过比较时间戳来找出关键帧和非关键帧,关键帧位姿使用sfm模块的。

2024-07-08 23:33:03 789

原创 VINS-Fusion源码逐行解析:与processImage有关的一部分函数

然后对于帧id在 frame_count-2 和 frame_count-1 之间有观测数据的特征点,计算视差总和,最后通过帧数,上一次跟踪的特征点数量、长时间跟踪的特征点数量、新特征点数量和计算的视差来判断当前帧是否通过视差检测,如果返回true,则删掉最旧的一帧,如果返回false,则删掉倒数第二帧,这样可以控制优化计算量,只对当前帧之前的一部分帧进行优化,而不是全部历史帧。该函数很简单,我们往下看,到了getCorresponding函数,该函数是在两个指定的帧(

2024-07-07 00:30:30 206

原创 VINS-Fusion源码逐行解析:processImage函数

最后,如果不是初始化状态,在不使用imu的情况下 调用initFramePoseByPnP函数初始化当前帧的位姿,然后进行三角化,调用outliersRejection找到需要移除的异常值索引,接着调用removeOutlier函数对其移除,在单线程下,通过特征跟踪器根据 removeIndex 中的异常值索引移除跟踪的特征点,并会使用predictPtsInNextFrame函数预测下一帧的特征点,然后调用failureDetection函数进行故障检测,移除失败的特征点,最后更新最新状态信息,完。

2024-06-14 00:25:45 440

原创 VINS-Fusion源码逐行解析:processMeasurements()及其关于imu数据处理部分

我们等待IMU数据,通过IMUAvailable函数来判断IMU数据是否在当前时间戳可用,如果使用IMU,那么通过getIMUInterval函数将imu数据读取进开始设置的变量accVector, gyrVector中,然后没有初始化则调用initFirstIMUPose对imu信息进行初始化,最后计算完时间间隔后,调用processIMU函数来完成对IMU数据的处理,至此,有关imu数据的处理流程结束。processIMU函数处理IMU数据,得到预积分值,让我们来看一下源码。

2024-06-11 23:58:29 479

原创 VINS-Fusion源码逐行解析:inputImage函数与trackImage函数及trackImage函数中涉及的函数

看详细注释的代码即可,简单来说就是通过opencv中的calcOpticalFlowPyrLK函数来实现光流跟踪,并进行反向检验,将跟踪到的特征点进行去畸变,最终将跟踪到的特征点的信息放进featureFrame中返回,如是双目,则右目同理。该函数首先通过调用trackImage函数对输入的图像进行处理存进featureFrame,最后放进featureBuf然后调用processMeasurements()函数来处理数据。我们接着看下trackImage函数吧。

2024-06-11 18:22:16 200

原创 VINS-Fusion源码逐行解析:readParameters函数与setParameter函数

该函数非常重要,当执行时,开启了一个Estimator类内的新线程:processMeasurements();真正开始了程序的处理。readParameters函数是读取参数配置文件也就是我们提供的yaml文件的函数。setParameter函数的作用是设置估计器的参数。通过此函数,我们知道yaml文件中各个参数的作用。

2024-06-11 17:15:09 146

原创 VINS-Fusion源码逐行解析:程序入口rosNodeTest.cpp

config:存放了程序运行需要的yaml文件,需要什么相机,就用对应的配置文件就行。接下来我们看整个vins-fusion的程序入口,rosNodeTest.cpp。global_fusion:照VINS-Mono新增加的GPS等全局传感器。今天开始阅读VINS-Fusion,以专栏的形式记录一下,防止之后自己忘。docker:顾名思义,使用docker运行VINS-Fusion。loop_fusion:局部回环检测,若需要回环检测需要单独运行。vins_estimator:主要看的地方;

2024-06-09 17:10:40 153

原创 windows11如何删除映射网络驱动器的历史记录

最近在用docker做一些工作,通过映射网络驱动器可以在windows环境下查看docker文件夹,但是因为虚拟机ip地址总变,会导致对应的网络驱动器失效,手动断开连接并删除后,仍会留下历史记录,很烦。下面提供一个方法,打开win+r打开并输入。选定对应的ip地址的右键删除即可。并回车,打开注册表编辑器。再打开看就没有历史纪录了。

2024-05-30 22:40:37 263

原创 (保姆级图文详解)ubuntu下深度学习cuda+cudnn+anaconda3环境配置(看这一篇就够了)

conda create -n 环境名 python=x.x。

2024-04-09 15:06:24 2391

原创 ubuntu18.04安装opencv3.4.5并实现多版本的共存、使用

5.多版本OpenCV的使用。,下载Sources压缩包。输入命令是conf生效。

2024-04-08 23:10:50 233

原创 ubuntu创建桌面快捷方式启动软件

在ubuntu系统下,我们都知道有些软件下载完源码后,启动要在终端输入可执行文件的命令行语句来打开某个软件,很是麻烦,那么怎么像windows中双击启动应用程序呢。首先,打开终端输入 sudo gedit /usr/share/applications/myapp.desktop(myapp可以替换成你的app的名字)Exec=/path/to/myapp,改成你想要打开的app的可执行文件的绝对路径。Icon=/path/to/myapp.png,设置成你想要的图标照片的绝对路径。

2024-04-08 21:11:35 156

原创 保姆版图文详解双系统双硬盘安装ubuntu18.04,每一步都有

目录一.制作启动盘二.设置bios三.开始安装1.选择第二个install ubuntu2.选择语言 中文(简体),然后点击继续 3.选择正常安装 4. 安装类型选 其他选项(这个可以自己调整分区,建议选择这个), 千万别选选择 安装Ubuntu,与Windows Boot Manager共存(求求)5调整分区,一个t的硬盘按我这个分没问题分配/,/类似于我们windows下面的C盘分配 /boot,放启动项的 1g/temp分区存放临时文件 30g应用程序目录/usr /var分区 40g交换空间

2024-04-08 19:20:20 3050 2

原创 双系统卸载ubuntu18.04(超简单版)

然后在左上角文件中点击【文件】-【打开】-从【此电脑】中找到刚刚新创建的盘符为j的磁盘,点击【EFI】文件夹,找到【ubnutu】子文件夹,删除即可,我这是已经删除过的。最后,把刚刚创建的j盘盘符删掉就完事了,回到之前的命令行,输入remove letter = p,结束。下面的磁盘0是windows系统,磁盘1是Ubuntu系统,直接将磁盘1的分区全部右键删除卷。然后在搜索框中输入【记事本】,右键【以管理员身份运行】又一次需要重装系统,那么记录一下吧。第一步,切到windows下。

2024-04-08 17:27:21 272 3

原创 orbslam2源码解析ORBextractor.cc中各函数调用关系

ORBextractor::ORBextractor是构造函数,作用是对一些参数进行确定,如从yaml文件读取配置、初始化图像金字塔相关变量、初始化用于计算描述子的pattern、计算近似圆形的边界坐标u_max。更的有点短,写这篇的初衷是在我开始学习这段代码的时候就觉得各种函数的引用总go to很乱,想读完后梳理并总结这段代码中函数之间的关系,然后哪个函数的具体解析需要的话可以评论说一下,我单独出。今天开始更新关于orbslam2源码的内容,主要是自己的一些理解,分享给大家,有错误欢迎大家指出。

2023-11-08 18:21:39 161 1

原创 视觉slam十四讲ch6非线性优化(包含实践部分)

对于不方便直接求解的最小二乘问题,我们可以用迭代的方式,从一个初始值出发,不断地更新当前的优化变量,使目标函数下降。也就是说,在使用高斯牛顿法时,可能出现JJ^{T}为奇异矩阵或者病态(ill-condition)的情况,此时增量的稳定性较差,导致算法不收敛。一个比较好的方法是根据我们的近似模型跟实际函数之间的差异来确定:如果差异小,说明近似效果好,我们扩大近似的范围;通常假设各个时刻的输入和观测是相互独立的,这意味着各个输入之间是独立的,各个观测之间是独立的,并且输入和观测也是独立的。

2023-11-03 21:12:13 483

原创 视觉slam十四讲ch5相机与图像(包含实践部分)

ToF的原理和激光传感器十分相似,只不过激光是通过逐点扫描获取距离的,而ToF相机则可以获得整个图像的像素深度,这也正是RGB-D相机的特点。O为摄像机的光心,也是针孔模型中的针孔。在测量深度之后,RGB-D相机通常按照生产时的各相机摆放位置,自己完成深度与彩色图像素之间的配对,输出一一对应的彩色图和深度图。这个模型有很多种,有最常见的针孔模型和由于相机镜头上的透镜的存在,使得光线投影到成像平面的过程中会产生畸变的畸变模型。有的相机生产厂商会告诉你相机的内参,而有时需要你自己确定相机的内参,也就是所谓的。

2023-10-30 20:50:05 664 3

原创 视觉slam十四讲ch4李群和李代数(包含实践部分)

slam十四讲第四讲李群李代数

2023-10-12 01:14:32 620

原创 视觉slam十四讲ch3三维空间刚体运动(包含实践部分)

欧拉角的一个重大缺点是会碰到著名的万向锁问题(Gimbal Lock)在俯仰角为±90°时,第一次旋转与第三次旋转将使用同一个轴,使得系统丢失了一个自由度(由3次旋转变成了2次旋转)。这被称为奇异性问题,在其他形式的欧拉角中也同样存在。理论上可以证明,只要想用3个实数来表达三维旋转,都会不可避免地碰到奇异性问题。由于这种原理,欧拉角不适用于插值和迭代,往往只用于人机交互中。我们也很少在SLAM程序中直接使用欧拉角表达姿态,同样不会在滤波或优化中使用欧拉角表达旋转(因为它具有奇异性)。

2023-10-11 13:50:39 450

原创 视觉slam十四讲ch2初识slam(包含实践部分)

平移之后才能计算深度,以及无法确定真实尺度,这两件事情给单目SLAM的应用造成了很大的麻烦。其根本原因是通过单张图像无法确定深度。所以,为了得到这个深度人们开始使用双目相机和深度相机。

2023-10-04 17:58:41 239 1

原创 暗影精灵9解决AX211无线网卡在双系统Ubuntu18.04.06版本中无WiFi适配器的情况(绝对好使)

大家好,我是小时,今天在这里开始记录我的学习过程和遇到的问题。

2023-09-07 23:16:42 3973 20

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除