手撕VO篇
文章平均质量分 73
手敲视觉slam14讲ch13
全日制一起混
SLAM
展开
-
手撕 视觉slam14讲 ch13 代码 总结
运行效果。原创 2023-11-08 13:27:20 · 270 阅读 · 7 评论 -
手撕 视觉slam14讲 ch13 代码(7)后端优化 Backend::Optimize()
在上一篇 手撕(6)中的InsertKeyframe()插入关键帧的函数里,有一个 Backend::UpdateMap() 函数 ,从这里通过条件变量 map_update_ 来激活后端优化。后端在构造时,就构建了一个启动优化线程Backend::BackendLoop,并上锁,等待前端唤醒然后在前端的InsertKeyframe()插入关键帧的函数里,通过 Backend::UpdateMap() 函数 ,触发地图更新,启动优化: 其中的条件变量 map_update_ 被激活,使得B原创 2023-10-22 12:38:51 · 283 阅读 · 0 评论 -
手撕 视觉slam14讲 ch13 代码(6)正常跟踪模式 Track()
至此EstimateCurrentPose() 函数完成,返回的当前帧追踪到的特征点内点数量(tracking_inliers_),然后判断当前的跟踪状态,为下次的添加帧做准备.如果内点数大于50 ,就是 tracking good ,内点数小于50大于20, 就是tracking bad,如果小于20,就 tracking lost .更新完跟踪状态后,进入 InsertKeyframe() 函数判断要不要插入关键帧。其中我们关注其中:自定义的顶点和边。中的g2o的实现流程,原创 2023-10-17 22:58:45 · 372 阅读 · 2 评论 -
手撕 视觉slam14讲 ch13 代码(5)双目初始化 StereoInit()
实现的推导过程中可以看一下。里的SVD分解的部分。原创 2023-09-22 16:33:28 · 302 阅读 · 3 评论 -
手撕 视觉slam14讲 ch13 代码(4)VisualOdometry类和工程主函数
num_features_是每帧最多提取的特征点数量,此外还保存一个参数num_features_init_,这个参数在后面的地图初始化中会用到。在后端初始化中,主要是新开一个线程backend_thread_,然后把这个线程中运行的函数设置为Backend::BackendLoopI()函数。因为需要实例化并初始化frontend_,backend_,map_,viewer_四个对象,因此我们需要再额外写出前端、后端、显示这三个类的构造函数。原创 2023-09-13 17:24:14 · 264 阅读 · 0 评论 -
手撕 视觉slam14讲 ch13 代码(3)相机类、数据集类、参数配置类
我们首先从数据集读取入手,包括读取数据集的参数文件来获得相机的内参和外参,以及读取图片,因此,我们还需要抽象出相机类、数据集类、参数配置类。相机类最简单,我们先来实现它。原创 2023-09-11 21:13:09 · 420 阅读 · 0 评论 -
手撕 视觉slam14讲 ch13 代码(2)基本类的抽象
虚线:表示依赖关系,A指向B,则代表A依赖于B,即A类中使用了B类的属性或方法,但是不改变B的内容。这里指的是工厂类制造具体产品,显然具体产品是作为返回类型。工厂模式:抽象工厂有子类具体工厂ABC,分别用于生产对应的具体产品ABC。简单工厂模式:一个工厂类分别生产每种具体产品,缺点是对修改不封闭,新增加产品要修改工厂。至此三个基本的类抽象完毕,但是还缺一个地图类(Map)来管理frame和mappoint。常见的SLAM系统中的帧(Frame)需要包含以下信息:id,位姿,图像,左右目特征点。原创 2023-09-02 22:38:43 · 395 阅读 · 1 评论 -
手撕 视觉slam14讲 ch13 代码(1)工程框架与代码结构
开始,我们按照自己写系统的思路进行,首先确定好SLAM整体系统的流程,见下图,输入为双目图像,之后进入前端位姿估计和后端优化,中间维护一个由关键帧和地图点组成的地图。3. MapPoint(地图点类):3D点,通过三角化等方式计算出2d特征点的深度,即获得其3D位置。2. Feature(特征点类):2D点,通过对帧提取特征点,实现后续光流追踪。在学习slam一年之后开始,开始自己理思路,全手敲完成ch13的整个代码。工程框架与代码结构确定好后,我们开始进一步抽象出一些基本的类。原创 2023-09-02 18:02:22 · 271 阅读 · 0 评论