自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 ZooKeeper源码阅读(五)---服务端集群流程

从本文开始正式开始学习zk中核心集群的实现原理。1、单机调试集群方法首先创建三个zoodata目录,并将默认zoo.cfg文件拷贝进去单独配置每个cfg文件:dataDir[持久化文件与myid文件保存的地址,每个配置文件均不同],clientPort[客户端接口端口,单机测试保证均不相同],server[集群服务地址,配置相同],最后在各自的dataDir目录下创建myid文件[内容为0,1,2编号,与cfg里server.编号 相同]。之后就可以idea配置不同的启动参数,进行..

2021-09-22 19:33:11 210

原创 ZooKeeper源码阅读(四)---服务端单机流程

本章我们先来看看单机服务端处理流程,最后再去学习集群模式1、服务启动服务端入口类为QuorumPeerMain,下面为启动流程 1、main.initializeAndRun(args); 2、initializeAndRun(){ if (args.length == 1 && config.isDistributed()) { runFromConfig(config); } else ...

2021-09-22 12:44:42 271

原创 ZooKeeper源码阅读(三)---客户端watch机制

上一章中我们讨论了zkcli的普通请求流程,这次我们使用 get -w / 命令,看看上一章被忽略的流程1、zkWatchManager 首先我们回顾一下zkcli连接的建立,最终的io都是通过clientCnxn对象完成,下面是它的构造函数: public ClientCnxn( String chrootPath, HostProvider hostProvider, int sessionTimeout, ...

2021-09-19 22:05:13 216

原创 ZooKeeper源码阅读(二)---客户端流程

由于zk客户端流程对于zk单机服务或者集群基本一致,所以先从zk客户端源码开始学习。1、客户端启动首先我们启动一个单机的server,然后给ZookeeperMain打上断点进入调试//成员变量 private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperMain.class);//当前支持解析的command命令如ls等 static final Map<String, String>.

2021-09-19 19:44:24 215

原创 ZooKeeper源码阅读(一)---编译、启动、调试

打算开个新坑,深入完整阅读一个工业级项目源码阅读本文最好有一定的zookeeper使用经验一、源码下载首先下载zookeeper的源码,建议直接从apache主页下载Source Release包获得源码工程。ps:网上有不少教程从github/zookeeper拉取代码编译,本人使用这种方法均不能直接成功,有不少坑待解决,而从apache主页下载的包可以直接build成功,仅供参考。二、项目编译 本文编译于2021.9.19的apache-zoo...

2021-09-19 11:48:52 584

原创 openMVG::sfm::SfM_Data数据结构形式总结

因为项目中需要用到openMVG::sfm::SfM_Data,这里总结一下它的具体数据结构形式。首先来看结构体定义:struct SfM_Data{ /// Considered views Views views; /// Considered poses (indexed by view.id_pose) Poses poses; /// Cons...

2019-03-15 17:32:43 1543

原创 win10+vs2015+libtiff编译流程

需要在win平台上使用libtiff,网上搜了很多教程都是比较老的方法,这里提供一个现在可以很简便的方法。按照惯例下载源码在这里:http://download.osgeo.org/libtiff/选一个比较新的版本,我使用的是tiff-4.0.10。解压后你会发现已经提供了cmakelist.txt这样就可以按照cmake编译的方式编译这个库了:vs工程内批生成就可以...

2019-03-09 15:55:03 2239

原创 win10+vs2015+openMVG编译与MSB3073问题解决

首先下载源码:https://github.com/openMVG/openMVG看看官方给的win编译步骤:注意需要使用上面第一个这个命令下载源码,不然cmake过程会出错接着打开cmake-gui,勾选附加库(如果你编译过这些第三方库)并修改install目录(默认会安装到c盘)最后进入到vs里(注意需要右键点击以管理员方式打开vs,不然生成install时会出错MSB...

2019-03-09 10:47:09 849

原创 python入门知识点

人生苦短,我用python。废话不多说,记录一下python基础知识点。lambda函数lambda 参数 :返回值map函数map(function,参数序列) 将制定序列中所有元素作为参数调用制定函数filter函数filter(function,参数序列) 将制定序列中所有元素作为参数调用制定函数,调用结果为true的作为返回reduce函数r...

2019-03-07 23:42:17 217

原创 DBoW3库的使用

之前我们有讲过DBoW3库的编译与安装,这篇我们来谈谈DBoW3库的使用。在这之前建议先看看视觉词袋与DBoW库的原理,这个博主写的不错:https://blog.csdn.net/qq_24893115/article/details/52629248一、使用词典我们知道离线视觉词典实际就是将特征描述子集合聚类。训练离线词典://输入特征描述子集合std::ve...

2019-03-05 20:17:35 7270 6

原创 常用算法思想(三)——动态规划

作为一个程序员,动态规划是要会的,不然怎么找工作呢(哈哈)。动态规划作为普通程序员面试时的一个必考点也是一个难点,早就听闻它的大名,但是我们不用太过高看它,慢慢分析学起来也是很容易的~1、什么是动态规划?动态规划是求解决策过程最优化的数学方法。把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。可以看到动态规划问题有几个特...

2019-03-05 01:34:26 431

原创 c++编程基础(四)——内存管理

c++作为c的扩展相比于java这种语言更接近底层,不可避免的需要对内存进行管理,这既是一个优点更是一个缺点。给了程序员更多的内存管理手段可以写出效率更高的程序,但对内存处理时需要注意的更多,因为出错的概率会更大。这篇我们简单介绍下c++的内存管理。在c++中内存主要分为5个存储区:栈(Stack):局部变量,函数参数等存储在该区,由编译器自动分配和释放.栈属于计算机系统的数据结构,进...

2019-03-05 00:12:28 271

原创 win10+vs2015+DBoW3编译以及加载&LNK2019问题解决

之前一直编译的是orb-slam2内自带的DBow2,现在重新学习一下DBoW3的使用(更快的速度以及更好的封装)。首先从编译开始:下载DBoW3源码:https://github.com/rmsalinas/DBow3首先解压后在目录里新建一个build目录:打开cmake输入源码地址(解压后的目录)与build目录(刚才建的):首先点击configure,然后指定一...

2019-02-27 15:56:14 1652

原创 常用算法思想(二)——回溯法

回溯法思路的简单描述是:把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所有可行解或者最优解。求解步骤1)针对所给问题,定义问题的解空间;2)确定易于搜索的解空间结构;3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。常用的剪枝函数:用约束函数在扩展结点处剪去不满足约束的子树;用限界函数剪去得不到最优解的子...

2019-02-27 09:53:33 296

原创 c++并发编程(七)—— 线程中断

有些线程是作为长时间工作的,其运行函数内部都会有个无限循环,但是某些时候我们希望能够主动停止线程:如人为停止或某一条件满足后退出。这里我们首先看看一个简单的思路:要想从一个线程终止另外一个线程,我们可以设置一个flag,这两个线程均可以访问的到,于是需要被中断的线程只需要检测这个flag的状态是否被改变,并由此作出是否中断的决定。这里是一个例子:class thread_class ...

2019-02-26 10:52:14 7015

原创 c++并发编程(六)—— 基于锁的并发数据结构设计

在我们进行并发编程的时候,如果多线程使用到了数据结构,那么程序设计过程中需要保证此数据结构的正确同步。有两种方法:1、选择单独的互斥元与外部锁来保护数据2、设计一个可以同时访问的数据结构其中前几节我们涉及到了第一种方法,现在我们重点描述下第二种方法。使用锁和条件变量的线程安全队列template&lt;typename T&gt;class threadsafe_queue...

2019-02-25 20:18:12 491

原创 浅析C++中STL容器与其数据结构

如果写c++程序那么STL容器是不可避免要使用的,而正确合理地使用这些容器才能够简化我们的程序、提高运行的效率,所以这篇我们就来简单介绍下STL容器内部的故事。一、顺序容器顺序容器:是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。...

2019-02-24 17:21:35 1779

原创 ORB-SLAM2源码学习(八)——图优化g2o

首先,ORBSLAM2里的优化都是基于图优化的,使用的第三方库为g2o,这里先介绍一下g2o简要使用流程,然后再来看看ORBSLAM2里的几个优化函数。一、g2og2o是一个图优化求解库,它将优化问题表现为图的形式:包含顶点和边。在slam问题里,BA中参与优化的参数有位姿和地图点坐标,在g2o中,我们将这些需要进行优化的变量设置为顶点,一般一张图像的位姿为一个顶点,这张图像上所能观察...

2019-02-23 16:59:53 2204

原创 ORB-SLAM2源码学习(七)——DBoW2词袋模型

 ORB-SLAM2里使用词袋模型来做重定向与回环检测,使用的是第三方库DBoW2。首先,有一个离线词袋ORBvoc.txt文件(ORB-SLAM2作者提供了一个他们训练好的词典),一般这个称之为词典,为了快速查询,以空间换时间建立了一个d层的K叉树来保存词典,树的叶子节点包含了每个单词及在词典里的权重。词典的加载//在System对象的初始化中 mpVocabulary...

2019-02-23 11:05:03 3147

原创 常用算法思想(一)——分治法

“分而治之”( Divide and conquer)方法(又称“分治术”) ,是有效算法设计中普遍采用的一种技术。所谓“分而治之” 就是把一个复杂的算法问题按一定的“分解”方法分为等价的规模较小的若干部分,然后逐个解决,分别找出各部分的解,把各部分的解组成整个问题的解,这种朴素的思想来源于人们生活与工作的经验,也完全适合于技术领域。诸如软件的体系结构设计、模块化设计都是分而治之的具体表现。...

2019-02-22 18:50:23 2044

原创 ORB-SLAM2源码学习(六)——数据存储与数据结构

看过了具体代码流程后,我们来看看ORB-SLAM2里主要的数据结构组织方式。作为slam系统,ORB-SLAM2里也为常规的数据储存结构。一、system作为系统对象主要保存了://包含所有的mappoints与keyframesMap* mpMap;//回环检测和重定位的词袋索引KeyFrameDatabase* mpKeyFrameDatabase;二、Map存...

2019-02-21 17:04:16 1071

原创 c++并发编程(五)—— 原子类型与原子操作 atomic

 原子操作是一个不可分割的操作,标准c++中通过原子类型来获得原子操作。从一个简单的例子来看看使用原子类型的作用:std::atomic&lt;int&gt; sum = 0; //int sum = 0;void fun(){ for (int i = 0; i&lt;100000; ++i) sum ++; //使用原子类型对sum的...

2019-02-20 16:14:12 1934

原创 c++并发编程(四)——同步并发操作 condition_variable&future

c++标准库提供条件变量以及期值等工具来等待事件以及简化操作的同步。std::this_thread::sleep_for(std::chrono::milliseconds(100)); //当前线程休眠100毫秒使用std::condition_variable条件变量等待数据int data_num = 10; std::queue&lt;int&gt;...

2019-02-18 20:04:49 390

原创 C++错误:C4996

使用vs2015编译出现错误:error C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.原因:...

2019-02-18 16:26:02 7392

原创 c++并发编程(三)——在线程间共享数据 mutex

c++标准提供的保护共享数据的最基本机制是互斥元(mutex)。std::mutex my_mutex;void fun() { my_mutex.lock(); //互斥元加锁 do_something(); my_mutex.unlock(); //互斥元解锁}void fun2() { std::lock_guard&lt;std::mu...

2019-02-18 15:10:05 460

原创 c++并发编程(二)——管理线程 thread类

启动线程同上节所讲,线程是通过构造std::thread对象来开始的:void do_some_work();std::thread my_thread(do_some_work);使用可调用类型:#include&lt;iostream&gt;#include&lt;thread&gt;class func {public: void operator()() ...

2019-02-17 20:03:38 343 2

原创 c++并发编程(一)—— hello,thread

前言之前一直使用pthread作为c++的线程库,现在有空了来了解一下c++标准线程库。为什么需要并发?为了划分关注点而使用并发 为了性能的提升使用c++标准库的并发支持c++11标准发布带来了标准c++线程库,包含了用于管理线程&lt;thread&gt;、保护共享数据&lt;mutex&gt;、线程间同步操作&lt;future、condition_variable&gt;...

2019-02-17 13:38:29 250

原创 VSLAM基础(十一)————李群与李代数

slam里一般涉及到的数学知识也就大学本科学过的那些,除了这次我们要接触的李群与李代数,不过在slam里也只是用到了这个数学工具一部分内容,理清思路后也是很清楚。李群是具有连续(光滑)性质的群;它既是群也是流形;直观上看,一个刚体能够连续的在空间中运动,故SO(3)和SE(3)都是李群。(注:SO(3)是特殊正交群 SE(3)是特殊欧式群,由于旋转矩阵R是3乘3的维度,但自由度的约束只有3个自...

2019-02-16 19:40:40 761

原创 ORB-SLAM2源码学习(五)——回环检测LoopClosing.cc

同局部构图模块一样回环检测模块同样是存在一个线程函数run;void LoopClosing::Run(){ mbFinished =false; while(1) { // Check if there are keyframes in the queue // Loopclosing中的关键帧是LocalMapping发送过...

2019-02-15 00:13:01 1196

原创 ORB-SLAM2源码学习(四)——局部建图LocalMapping.cc

 LocalMapping线程具体为一个run线程函数,其主要流程为:插入关键帧 剔除不合格MapPoints 生成新MapPoints并局部BA 删除冗余关键帧 当前帧加入闭环队列中void LocalMapping::Run(){ mbFinished = false; while(1) { // Tracking will s...

2019-02-14 22:47:37 1012

原创 c++中char转换为string类型

写程序遇到一个Bug如下:char x = 'a';string str(x); //这里报错了当时就有点蒙了,查了下string的构造函数:string(); string (const string&amp; str);string (const string&amp; str, size_t pos, size_t len = npos);s...

2019-02-14 19:07:50 64198 9

原创 ORB-SLAM2源码学习(三)——跟踪Tracking.cc

作为ORB-SLAM2里三大线程中的第一个,Tracking线程接收传感器(摄像头)传来的每一帧,并将处理的关键帧传递给LocalMapping线程。Tracking线程其实是系统里的主线程,通过反复调用Track函数进行。Tracking模块主要完成了以下几件事情:单目地图的初始化 当前帧的位姿估计 当前帧的局部地图跟踪 生成候选关键帧一、Tracking构造函数之前有讲...

2019-02-14 16:44:44 1043

原创 ORB-SLAM2源码学习(二)——单目初始化Initializer.cc

在Tracking模块里,单目第一步流程为MonocularInitialization,而这个函数主要涉及到的是Initializer.cc。一、Initializer.h// THIS IS THE INITIALIZER FOR MONOCULAR SLAM. NOT USED IN THE STEREO OR RGBD CASE./** * @brief 单目SLAM初始化...

2019-02-13 19:42:13 625

原创 ORB-SLAM2源码学习(一)——系统结构及System.cc

开始阅读学习ORB-SLAM2的源码了,在这里做个学习记录,另外也是督促自己的学习的更加深入。前言首先ORB-SLAM2作为一个完整的slam系统,作者即提供了论文也有对应的源码,它的github主页:https://github.com/raulmur/ORB_SLAM2系统包括了单目、双目、rgbd的实现,这里我主要学习单目slam系统,就以单目slam的流程来学习。另外感...

2019-02-13 17:50:28 1754

原创 VSLAM基础(十)————卡尔曼滤波

在vslam中对于观测数据估计位姿进行优化的方式是我们之前有讲到的BA,那么卡尔曼滤波KF是什么呢?在BA方法没有被普遍使用的时候,基于KF的优化方法是主流,这里我们也来了解一下,虽然在如今的主流视觉slam方法里不再使用KF的方法,但是有IMU等多传感器融合的slam系统里KF仍然占有一席之地。一、卡尔曼滤波EF首先来引用两篇博客:https://www.jianshu.com/p/...

2019-02-07 16:12:32 771 2

原创 c++编程基础(三)——vscode编程环境

 相信大多数人学习c++从vs开始,作为宇宙第一ide(严肃脸)毫不过分的讲它该有的功能都有了,还有更多(相信我你用到的功能只占小部分)的功能我们并不会用上。而且vs占用的资源越来越大————vs2017只是简单装装编写c++的功能也有11G+,更令人不适的一点是每次启动vs需要等待好久(没有进度条的呦),有时我们只是想写个小的程序不过百行(小的脚本,算法题啥的),这时使用vs就有点大材小用的感觉...

2019-02-06 14:00:49 747

原创 c++编程基础(二)——Makefile与cmake入门

   在上一篇我们讲了c++编译的过程,如果对g++命令了解过你会知道每次我们想要编译一个程序,就需要每次都写一大段命令行来指定我们想要的编译情形(多文件编译,不同的文件编译顺序,库的加载,编译结果的类型等等),类似于这种:上图是win下cl编译器的命令行(这也是vs帮我们隐藏住的细节,g++也是类似)那么每次都让我们写这一大段未免太麻烦了,于是可以很快想到——我们把这段写...

2019-02-06 12:45:43 8942 1

原创 c++编程基础(一)——一文带你了解c++源码到可执行文件的编译过程

前言  作为一个非科班出身的程序员,开始学习c++当然是从使用宇宙第一IDE——vs开始:创建个工程,写个HelloWorld.cpp,点击那个绿色的三角。OK,一个简单的程序就写好了,也不过如此嘛,这就是我最初的想法,当然那时埋下的隐患,也让我慢慢尝到了苦果,尤其是当你需要重新编译第三方库的时候,各种问题层出不穷(众所周知相比于其他主流语言java、python之流,c++加载第三方库到目前...

2019-02-05 17:50:29 610

原创 VSLAM基础(九)————LK光流法与直接法

到目前slam前端部分基本快结束了~在这里再补上光流法与直接法。我们之前介绍的都是基于特征点并计算描述子匹配的思路找到同名像点,然后通过射影几何的方法计算相机姿态。这种方法大体上已经很完善了,当然还是存在一些问题:特征点的提取、描述、匹配仍是slam里最耗时的部分;在一些特征稀疏的场景下(如白墙),可能找不到足够的匹配点;于是,人们希望找到其他的方法来克服这种问题,有了以下的思路:一、...

2019-02-05 13:42:24 2039 1

原创 VSLAM基础(八)————相机内参数理解

前面的章节有说过在vslam里相机的参数是已知的,也就是我们在相机模型那一篇里描述的相机内参与几个畸变参数。在我们使用安装好一个相机后,它的内参与畸变参数基本是不会变化的,也就是说我们可以提前求出这些系数,这就是相机标定的过程。当然单目相机标定也有了很多成熟的方法,这不是本篇的重点,感兴趣的可以参考一下这篇文章:https://blog.csdn.net/lxy_2011/article/...

2019-02-04 20:13:22 974

空空如也

空空如也

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

TA关注的人

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