- 博客(32)
- 收藏
- 关注
原创 action通讯
从零学ROSaction通讯从零学ROS前言1.action工作机制2.自定义action3.创建客户端前言ros中常用的是topic通讯与service通讯,但是在实际情况中需要一种可以进行连续反馈任务进度或者中止任务的通讯,这就需要使用到action了。1.action工作机制action中包括服务器与客户端。里面执行内容大体如下:1.goal:目标,客户端向服务器发送要实现的目标2.cancel:客户端向服务器发送运行中止请求3.status:状态,服务器向客户端发送当前状态
2021-04-06 13:56:01 231
原创 31局部建图线程剔除关键帧
ORBSLAM231局部建图线程剔除关键帧ORBSLAM2代码代码void LocalMapping::KeyFrameCulling(){ // Check redundant keyframes (only local keyframes) // A keyframe is considered redundant if the 90% of the MapPoints it sees, are seen // in at least other 3 keyfr
2021-04-01 19:38:24 201
原创 29局部建图线程两级局部关键帧地图点融合
ORBSLAM229局部建图线程两级局部关键帧地图点融合ORBSLAM2代码代码void LocalMapping::SearchInNeighbors(){ // Retrieve neighbor keyframes int nn = 10; if(mbMonocular) nn=20; const vector<KeyFrame*> vpNeighKFs = mpCurrentKeyFrame->GetBestCovi
2021-03-31 19:37:23 204
原创 27 局部建图线程处理新关键帧、检查删除地图点、关键帧之间生成新的地图点
ORBSLAM227 局部建图线程处理新关键帧、检查删除地图点、关键帧之间生成新的地图点ORBSLAM2代码代码线程主函数在localmappin.cc中的run()函数中,与tracking线程是并行的void LocalMapping::Run(){ mbFinished = false;//标记函数,表示该线程没有结束,正在运行 while(1)//开始进行循环 { // Tracking will see that Local Mapp
2021-03-31 11:09:06 280
原创 25关键帧定义应用与选择方法、创建及插入关键帧
ORBSLAM225关键帧定义应用与选择方法、创建及插入关键帧ORBSLAM2关键帧为什么需要关键帧代码关键帧什么是关键帧?通俗来说,关键帧就是几帧普通帧里面具有代表性的一帧。为什么需要关键帧1.相近帧之间信息冗余度很高,关键帧是取局部相近帧中最有代表性的一帧,可以降低信息冗余度。2.关键帧选择时还会对图片质量、特征点质量等进行考察,在Bundle Fusion、RKD SLAM等RGB-D-SLAM相关方案中常常用普通帧的深度投影到关键帧上进行深度图优化,一定程度上关键帧是普通帧滤
2021-03-30 20:05:11 1958
原创 23局部地图跟踪创建局部关键帧与地图点
ORBSLAM2@[TOC](23局部地图跟踪创建局部关键帧与地图点)代码前面几部分是基于关键帧跟踪、重定位跟踪、基于恒速模型跟踪,只用到当前帧或几个关键帧,比较粗糙。而局部地图跟踪比较准确,它的前提是必须知道当前帧的位姿与地图点,让位姿更准确(有点后端的味道)。void Tracking::UpdateLocalMap(){ // This is for visualization mpMap->SetReferenceMapPoints(mvpLocalMapP
2021-03-30 15:09:21 446
原创 22跟踪丢失后重定位
ORBSLAM222跟踪丢失后重定位ORBSLAM2代码代码bool Tracking::Relocalization(){ // Compute Bag of Words Vector mCurrentFrame.ComputeBoW();//计算当前帧的词袋模型 // Relocalization is performed when tracking is lost // Track Lost: Query KeyFrame Database for
2021-03-30 11:23:05 374
原创 21基于恒速模型跟踪当前帧
ORBSLAM221基于恒速模型跟踪当前帧ORBSLAM2代码代码bool Tracking::TrackWithMotionModel(){ ORBmatcher matcher(0.9,true);//最优距离小于0.9*次优距离,并检查旋转 // Update last frame pose according to its reference keyframe // Create "visual odometry" points if in Localiz
2021-03-29 22:27:30 403
原创 g2o学习
g2o学习g2o是slam中常用的一种优化库,在视觉slam中主要用来优化位姿与3D点的。它主要分为以下几个步骤:1.定义一个求解器2.定义优化顶点3.定义优化边它的基本框架基本在下面的图中:注意箭头的方向以及箭头的含义。构建求解器在求解器中最终的目标是构建一个SparseOptimizer稀疏优化器。typedef g2o::BlockSolver<g2o::BlockSolverTraits<3,1>> Block;//1.构建线性求解器Block::
2021-03-29 14:34:03 211
原创 19-离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVe
ORBSLAM2ORB-SLAM离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVeORBSLAM2代码代码bool Tracking::TrackReferenceKeyFrame(){ // Compute Bag of Words vector mCurrentFrame.ComputeBoW();//如果词袋没有计算,需要计算计算词袋ComputeBow()void KeyFrame::ComputeBoW(){ if(mBow
2021-03-28 19:16:08 336
原创 18-词袋模型
ORBSLAM2提示:ORB-SLAM2词袋模型ORBSLAM2词袋模型应用词袋模型流程1.提取特征点2.对特征点描述子进行聚类,得到词袋树3.新来的一帧进行词袋遍历,得到单词,然后用频率表示词袋模型中只考虑它出现的频率。应用1.闭环检测主要就是判断图像的相似性,用帧差法缺点很多。容易受到光照、角度等影响。而词袋只关心有没有这些words以及出现了多少次。2.加速匹配缺点:需要提前训练好词袋,增加存储空间,加载较慢。但瑕不掩瑜。...
2021-03-28 14:45:00 817
原创 初始化关键帧更新共视关系,尺度归一化
ORB-SLAM2ORB-SLAM2初始化关键帧更新共视关系,尺度归一化ORB-SLAM2代码代码// Update Connections更新初始帧与当前帧的连接关系,3D点 与关键帧建立边,每个边有一个权重,权重是该关键帧与当前帧公共3D点的个数 pKFini->UpdateConnections(); pKFcur->UpdateConnections();进入UpdateConnectionsvoid KeyFrame::UpdateConnect
2021-03-28 14:25:01 311
原创 单目初始化从单应阵中恢复位姿、依据三角化检验位姿
ORB-SLAM2单目初始化从单应阵中恢复位姿、依据三角化检验位姿ORB-SLAM2代码代码//在完成评分后,开始使用单应矩阵或者基础阵进行位姿的恢复 if(RH>0.40)//在计算完评分后 选择利用那种方法来恢复位姿 return ReconstructH(vbMatchesInliersH,H,mK,R21,t21,vP3D,vbTriangulated,1.0,50); else //if(pF_HF>0.6) retur
2021-03-27 19:26:30 240
原创 卡方检验原理
ORB-SLAM2卡方检验原理ORB-SLAM2卡方检验用途步骤卡方检验某些情况在长时间进行实验,它的结果是稳定的,例如抛硬币。但是期望与实际情况是有一定差异的。利用卡方检验可以排除可疑结果(建模错误还是正常波动)。用途1.检查实际结果与期望结果之间何时存在显著差异。(1)检验拟合程度,也就是检验一组数据与指定分布的拟合程度(2)检验两个变量的独立性:检查变量之间是否存在联系’步骤1.确定要进行的检验假设与其备择假设2.求出期望E3.确定用于做决策的拒绝阈4.依据自由度
2021-03-27 19:06:17 1584
原创 单目初始化构建地图、计算地图点具有代表性的描述子、计算平均观测方向
ORB-SLAM2ORB-SLAM2-单目初始化构建地图、计算地图点具有代表性的描述子、计算平均观测方向ORB-SLAM2代码代码//在单目初始化计算位姿完成后,开始初始化构建地图 CreateInitialMapMonocular();进入这个函数中void Tracking::CreateInitialMapMonocular(){ // Create KeyFrames创建关键帧,在初始化的时候会认为当前帧与参考帧都是关键帧 KeyFr
2021-03-26 20:58:44 365
原创 单目初始化中从基础矩阵到最佳位姿及三维点
ORB-SLAM2ORB-SLAM2-单目初始化中从基础矩阵到最佳位姿及三维点ORB-SLAM2代码代码利用F矩阵来进行恢复,主要用于非平面return ReconstructF(vbMatchesInliersF,F,mK,R21,t21,vP3D,vbTriangulated,1.0,50);进入ReconstructF()函数bool Initializer::ReconstructF(vector<bool> &vbMatchesInliers, cv::
2021-03-26 16:15:10 244
原创 ROS中关键组件
从零学ROSROS中关键组件从零学ROS前言一、Launch文件前言ros中组件包括launch 、TF坐标变换、Qt工具箱、Rviz可视化、Gazebo物理仿真一、Launch文件rosrun只能启动单个节点,当节点多的时候运用launch文件来启动。launch文件:通过xml文件实现多个节点的配置与启动,同时也可以配置节点参数...
2021-03-26 11:18:40 130
原创 ROS基础4--分布式通信
从零开始学ROSROS基础4--分布式通信从零开始学ROS前言一、分布式通讯前言ROS的action通讯部分有些代码没理解,先来看分布式通讯一、分布式通讯ROS是一种分布式软件框架,节点之间是松耦合进行组合。如何实现分布式多机通讯1.设置IP地址,确保底层链路的联通首先使用ifconfig命令来查看IP地址然后,将ip地址设置到对方的host文件中使用命令sudo gedit /etc/hosts使用ping命令来看设否设置成功,测试网络是否联通ping k
2021-03-25 21:56:55 241
原创 ROS基础2
从零学ROSROS基础2从零学ROS前言一、ROS 通讯--服务编程前言上一章学得是ROS的topic部分,以及自定义消息,这章节主要记录ros的服务通讯。一、ROS 通讯–服务编程服务编程的流程(1)创建服务器(2)创建客户端(3)添加编译程序(4)运行可执行程序如何自定义服务请求与应答与topic类似首先,先在功能包下创建srv文件夹然后在package.xml下添加<build_depend>message_generate</build_d
2021-03-25 13:17:38 101
原创 ORB-SLAM2 单目初始化中随机选择点集、归一化原理、求单应阵、基础阵
ORB-SLAM2ORB-SLAM2 单目初始化中随机选择点集、归一化原理、求单应阵ORB-SLAM2一、代码一、代码在特征点提取与匹配完成后,回到Tracking.cc中 if(nmatches<100)//判断,如果特征匹配的数目小于100的话 { delete mpInitializer;//那么就删除这个初始化器。重新开始初始化 mpInitializer = static_cast<Initialize
2021-03-24 18:52:57 518 1
原创 ROS基础1
从零学ROSROS基础从零学ROS前言一、创建工作空间二、ROS通信三.分布式通信四. ROS中关键组件前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、创建工作空间工作空间主要有以下几个文件夹:src:存放源码的文件devel:用来存放一些编译完成后的可执行文件,环境变量配置的脚本等build:存放编译过程中一些
2021-03-24 15:13:44 80
原创 ORB-SLAM2-单目初始化中的特征点匹配
ORBSLAM2源码ORB-SLAM2-单目初始化中的特征点匹配ORBSLAM2源码一、代码一、代码在单目初始化完成后,下面就开始对单目初始化中的两帧进行匹配单目初始化中特征点的匹配函数在 SearchForInitialization()中;进入 SearchForInitialization()函数中//这个函数在ORBmatcher.cc这个文件中int ORBmatcher::(Frame &F1, Frame &F2, vector<cv
2021-03-23 20:47:53 307
原创 ROS常用命令
从零学ROSROS常用命令从零学ROS前言一、ROS常用的一些指令前言ORBSLAM2代码还没完全看完,想着与ROS同步进行吧,反正后面也用的到。先学习下ROS常用的一些指令。一、ROS常用的一些指令1.打印ros的环境变量$echo $ROS_PACKAGE_PATH...
2021-03-23 09:54:01 454 1
原创 ORB-SLAM2-Brief描述子方向计算
ORB-SLAM2-Brief描述子方向计算代码代码在计算完特征点的方向后,开始计算描述子Mat descriptors;//首先定义了描述子 int nkeypoints = 0;//统计金字塔中所有特征点 for (int level = 0; level < nlevels; ++level)//开始遍历每一层图像金字塔,然后将每一层金字塔上特征点进行总和 nkeypoints += (int)allKeypoints[level].size();..
2021-03-18 11:22:20 482
原创 ORBSLAM2-灰度质心法求旋转不变性
ORBSLAM2-灰度质心法求旋转不变性代码代码当使用和四叉树的策略,将ORB特征点均匀的分布在在图像中后,接下来就需要进行计算方向,因为FAST角点与Brief描述子是不具备旋转不变性的,因此用灰度质心法计算旋转不变性。const int scaledPatchSize = PATCH_SIZE*mvScaleFactor[level];//定义每层patch_size的缩放,,这边就是在前面系统构造函数中所画的圆的直径,因为在图像金字塔中,每层的图像大小是不一样的,因此计算的圆的大小也是不一..
2021-03-18 09:53:12 1186
原创 ORBSLAM2-ORB的提取与均匀分布
ORBSLAM2-ORB的提取与均匀分布一.前言二.代码一.前言二.代码ORBextractor::operator()( InputArray _image, InputArray _mask, vector<KeyPoint>& _keypoints, OutputArray _descriptors){ if(_image.empty()) return; Mat image = _ima..
2021-03-11 21:59:43 177
原创 ORBSLAM2代码2-图像金字塔
ORBSLAM2代码2,图像金字塔一.前言二.代码一.前言这一部分主要是对输入进来的图像进行构建图像金字塔,并且对每层图像的边缘进行填充,方便后续的特征点提取。图像帧Frame的构造函数还没完成。二.代码这部分代码在mono_um.cc中SLAM.TrackMonocular(im,tframe);进入TrackMonocular这个函数中,这个函数在system.cc中cv::Mat System::TrackMonocular(const cv::Mat &im, cons..
2021-03-11 19:05:19 516
原创 vio第五讲-单目BA(2)边缘化
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档vio第五讲-单目BA(2)--边缘化测试TestMarginalize()vio课程代码,个人备忘TestMarginalize()对前面所举的例子进行代码:void Problem::TestMarginalize() { // Add marg test int idx = 1; // marg 中间那个变量 int dim = 1; // marg 变量
2021-03-08 19:54:52 250
原创 VIO第五讲代码(1)-单目BA求解
VIO-单目BA求解代码部分一、pandas是什么?二、使用步骤1.引入库2.读入数据总结深蓝学院vio课程的学习记录,仅个人备忘。代码部分int main() { // 准备数据 vector<Frame> cameras; vector<Eigen::Vector3d> points; GetSimDataInWordFrame(cameras, points);//camrea中存放的是R,t的vector Eigen::Qu..
2021-03-04 22:05:35 368
原创 手写VIO第三课-LM代码
手写VIO第三课-LM代码LM代码参考文章:深蓝学院vio课程的学习记录,个人备忘。LM代码在vio第三讲的代码中,主要是对于y=exp(axx+bx+c)这个函数进行迭代优化,这里面优化变量是abc。下面是代码部分:int main(){ double a=1.0, b=2.0, c=1.0; // 真实参数值 int N = 100; // 数据点 double w_sigma= 1.;
2021-02-27 17:12:39 595
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人