摘要:
依赖:指针是一个变量,指向本体;引用只是一个别名(本体的另一个名字),绑定在主体上 可变:引用只能在定义时被初始化一次,且“从一而终”;指针可以修改,“见异思迁”; 可空:引用不能为空;指针可以为空; 大小:sizeof 引用,得到的是所指向变量的大小;sizeof 指针,得到的是指针的大小; 自增 阅读全文
摘要:
切换g++版本 https://askubuntu.com/questions/372248/downloaded-g-4-8-from-the-ppa-but-cant-set-it-as-default 解压缩.7z sudo apt-get install p7zip-full 7z x PA 阅读全文
摘要:
类似SuperPoint的方法 阅读全文
摘要:
要理解mmdetection的训练流程,首先得先理清楚mmcv中的runner和hook的作用。参考 https://zhuanlan.zhihu.com/p/369826931 训练/验证调用关系: tools/train.py -> api/train.py -> runner.run() -> 阅读全文
摘要:
在2D信息转换为3D信息过程中,对极几何(epipolar geometry)是必经的一步。 一. 对极约束 基础矩阵F、本质矩阵E以及单应矩阵H F矩阵有7个自由度(尺度不变性和奇异值约束可以去掉两个自由度); 求解: 8点法 - 可以求解满足尺度不变性的F矩阵(直接线性变换DLT),但是无法满足 阅读全文
摘要:
DBoW算法用于解决Place Recognition问题,ORB-SLAM,VINS-Mono等SLAM系统中的闭环检测模块均采用了该算法。来源于西班牙的Juan D. Tardos课题组。 主要是基于词袋模型(BoW)https://en.wikipedia.org/wiki/Bag-of-wo 阅读全文
摘要:
OKVIS代码结构: okvis_apps: your own app okvis_ceres: backend main code, estimator, error term; okvis_common: interface need to be derived, parameterReader 阅读全文
摘要:
二进制描述子设计原则体现在三个部分: ORB基于BRIEF; BRISK是用于OKVIS的描述子 FREAK的pattern设计基于人眼的视网膜 参考文献: 1. https://gilscvblog.com/category/descriptors/ 阅读全文
摘要:
最近几个月忙于博士毕业,找工作一直没有继续更新博客,希望以这一篇开始,每个月能够继续有几篇总结博客。 首先review一下比较著名的vio系统 EKF: mainly ETH ASL R.Siegwart work EKF: MSCKF->MSCKF2.0->SR-ISWR observabilit 阅读全文
摘要:
VINS中的FeatureManager负责管理 阅读全文
摘要:
使用Ceres Solver库处理后端优化问题,首先系统的优化函数为 阅读全文
摘要:
首先通过imu预积分陀螺仪和视觉特征匹配分解Fundamental矩阵获取rotationMatrix之间的约束关系,联立方程组可以求得外参旋转矩阵; 接下来会检测当前frame_count是否达到WINDOW_SIZE,确保有足够的frame参与初始化; 1. 保证imu充分运动,只需要考察线加速 阅读全文
摘要:
首先通过vins_estimator mode监听几个Topic(频率2000Hz),将imu数据,feature数据,raw_image数据(用于回环检测)通过各自的回调函数封装起来 然后开启处理measurement的线程 process()函数中,首先将获取的传感器数据imu_buf feat 阅读全文
摘要:
通常的边缘化是将联合概率分布分解为边缘概率分布和条件概率分布的过程,这样可以将Sliding Window中较旧的状态边缘化出Sliding Window,同时保留其信息。并且保证了对应H海塞矩阵的稀疏,从而实现计算资源和计算精度的平衡。VINS中也可以将最旧的状态边缘化,但是在一些退化的运动下(例 阅读全文
摘要:
和单目纯视觉的初始化只需要获取R,t和feature的深度不同,VIO的初始化话通常需要标定出所有的关键参数,包括速度,重力方向,feature深度,以及相机IMU外参$R_{c}^{b}$和$p_{c}^{b}$。 一. 外参旋转矩阵初始化 在Feature Detection and Track 阅读全文
摘要:
首先根据最大后验估计(Maximum a posteriori estimation,MAP)构建非线性优化的目标函数。 初始化过程通过线性求解直接会给出一个状态的初值,而非线性优化的过程关键在于求解增量方程,并不断迭代到最优点,需要在初值以及后续的迭代点附近线性化(泰勒展开保留一阶后平方构建高斯牛 阅读全文
摘要:
IMU的数据频率一般远高于视觉,在视觉两帧k,k+1之间通常会有>10组IMU数据。IMU的数据通过积分,可以获取当前位姿(p位置,q四元数表达的姿态)、瞬时速度等参数。 在VIO中,如果参考世界坐标系对IMU进行积分,积分项中包含相对于世界坐标系的瞬时旋转矩阵,这样有几个问题: 1. 相对世界坐标 阅读全文
摘要:
1. 首先标定加速度计,这是imu加速度计xyz三个轴在标定过程中的读数: 标定结果: 2. 利用加速度计的标定结果,标定陀螺仪,结果: 也可以使用港科大开源的一个工具: https://github.com/gaowenliang/imu_utils 阅读全文
摘要:
系统入口是feature_tracker_node.cpp文件中的main函数 1. 首先创建feature_tracker节点,从配置文件中读取信息(parameters.cpp),包括: ROS中发布订阅的话题名称; 图像尺寸; 特征跟踪参数; 是否需要加上鱼眼mask来去除边缘噪点; 该con 阅读全文
摘要:
VINS-Mono和VINS-Mobile是香港科技大学沈劭劼团队开源的单目视觉惯导SLAM方案。是基于优化和滑动窗口的VIO,使用IMU预积分构建紧耦合框架。并且具备自动初始化,在线外参标定,重定位,闭环检测,以及全局位姿图优化功能。 方案最大的贡献是构建了效果很好的融合算法,视觉闭环等模块倒是使 阅读全文
摘要:
消息类型: 1. Twist - 线速度角速度 通常被用于发送到/cmd_vel话题,被base controller节点监听,控制机器人运动 linear.x指向机器人前方,linear.y指向左方,linear.z垂直向上满足右手系,平面移动机器人常常linear.y和linear.z均为0 a 阅读全文
摘要:
Ceres Solver是谷歌2010就开始用于解决优化问题的C++库,2014年开源.在Google地图,Tango项目,以及著名的SLAM系统OKVIS和Cartographer的优化模块中均使用了Ceres Solver. 有关为何SLAM问题可以建模为最小二乘问题,进而使用最优化方法来求解, 阅读全文
摘要:
目前的研究方向可以总结为在滤波算法中实现高精度,在优化算法中追求实时性.当加入IMU后,研究方向分为松耦合和紧耦合,松耦合分别单独计算出IMU测量得到的状态和视觉里程计得到的状态然后融合,紧耦合则将IMU测量和视觉约束信息放在一个非线性优化函数中去优化.紧耦合的框架使得IMU数据可以对视觉里程计进行 阅读全文
摘要:
SIFT特征点相对于ORB计算速度较慢,在没有GPU加速情况下,无法满足视觉里程计的实时性要求,或者无法运行在手机平台上,但是效果更好,精度更高。在应用时可以择优选取,了解其本质原理的动机是为了自己使用时,可以对其进行修改,针对自己的应用场景优化算法。 有足够的时间,可以去看D. Lowe的论文,理 阅读全文
摘要:
虽然按照作者的推荐使用的是OpenCV 2.4.8,但编译依然通不过,一直有错误: 因为lsd_slam是2014年出的,用的ros编译系统不是catkin而是rosbuild,有一些不理解的地方. 后面找到了在lsd_slam_viewer的CMakeLists.txt中使用了main_stitc 阅读全文
摘要:
环境:Ubuntu 14.04 + ROS indigo + ORB-SLAM2 (Thinkpad T460s) 1. 安装ORB-SLAM: Pangolin Pangolin有一些依赖库,按照提示安装好 OpenCV 2.4.8版本,2.4.11版本均可以用,3.2版本没有测试,应该也行 注意 阅读全文
摘要:
使用自定义的消息类型,实现service方式的节点间双向通信 在package目录下创建msg和srv目录,存放package需要使用的.msg和.srv文件. 在ROS中,message被设计为一种称为"language-neutral interface definition language 阅读全文
摘要:
ROS系统起源于2007年斯坦福大学人工智能实验室的项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,2008年之后就由Willow Garage来进行推动。 ROS是开源的,是用于机器人的一种后操作系统,或者说次级操作系统。 阅读全文
摘要:
1. OOP:概述 2. 定义基类和派生类 3. 虚函数 4. 抽象基类 5. 访问控制与继承 6. 继承中的类作用域 7. 构造函数与拷贝控制 8. 容器与继承 阅读全文
摘要:
1. 基础概念 重载的运算符是具有特殊名字的函数:(重载运算符函数,运算符函数。重载运算符) 依次包含返回类型,函数名(operator=),参数列表,函数体。 只有重载的函数调用运算符operator()才能有默认实参。 关于参数的数量,一般来说,一元运算符有一个参数,二元有两个,三元有三个; 但 阅读全文
摘要:
跟踪就是在连续视频帧中定位物体,通常的跟踪算法包括以下几类: 1. Dense Optical Flow 稠密光流 2. Sparse Optical Flow 稀疏光流 最典型的如KLT算法(Kanade-Lucas-Tomshi) 3. Kalman Filter 4. Meanshift an 阅读全文
摘要:
该可视化模块提供了坐标系变化,3D动画等功能 最简单的显示坐标系 其中spin()函数开启一个event loop永远循环,spinOnce(int time = 1, bool redraw = true)表示event loop循环time时间。通常将与视图的交互放在一个循环中: 3D姿态通常通 阅读全文
摘要:
#include #include #include #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/flann/flann.hpp" using namespace ... 阅读全文
摘要:
一. 通过对极约束并行计算F和H矩阵初始化 VO初始化目的是为了获得准确的帧间相对位姿,并通过三角化恢复出初始地图点。初始化方法要求适用于不同的场景(特别是平面场景),并且不要进行人为的干涉,例如选取视差大(large parallax)的场景(视差大代表相机移动会带来明显的图像变化,通常距离相机距 阅读全文
摘要:
ORB-SLAM中优化使用g2o库,先复习一下g2o的用法,上类图 其中SparseOptimizer就是我们需要维护的优化求解器,他是一个优化图,也是一个超图(包含若干顶点和一元二元多元边),怎样定义图的顶点(优化变量_estimate)和边(误差项_error)是用户需要考虑的问题,可以从g2o 阅读全文
摘要:
EPnP在ORB-SLAM中主要用于Tracking线程中的重定位Relocalization模块,需要通过当前关键帧Bow与候选帧匹配上的3D地图点,迅速建立当前相机的初始姿态。 PnP问题解决了已知世界参考系下地图点以及相机参考系下投影点位置时3D-2D相机位姿估计问题,不需要使用对极约束(存在 阅读全文
摘要:
主要参考这篇论文 Horn B K P. Closed-form solution of absolute orientation using unit quaternions[J]. JOSA A, 1987, 4(4): 629-642. 在单目闭环检测时,会将当前关键帧地图点和闭环关键帧地图点 阅读全文
摘要:
构造函数 主要分两部分,回环检测,以及GlobalBundleAdjustment LoopClosing中的关键帧都是LocalMapping中送过来的:送过来一帧,就检查一帧。 因此我们需要在KeyFrameDataBase中寻找与mlpLoopKeyFrameQueue相似的闭环候选帧。主要过 阅读全文
摘要:
LocalMapping作用是将Tracking中送来的关键帧放在mlNewKeyFrame列表中;处理新关键帧,地图点检查剔除,生成新地图点,Local BA,关键帧剔除。主要工作在于维护局部地图,也就是SLAM中的Mapping。 1. 处理新关键帧:ProcessNewKeyFrame() 做 阅读全文
摘要:
该类负责特征点与特征点之间,地图点与特征点之间通过投影关系、词袋模型或者Sim3位姿匹配。用来辅助完成单目初始化,三角化恢复新的地图点,tracking,relocalization以及loop closing,因此比较重要。 该类提供的API是: 1. 几个重载的SearchByProjectio 阅读全文
摘要:
该类中主要调用OpenCV中的函数,提取图像中特征点(关键点及其描述,描述子,以及图像金字塔) 参考TUM1.yaml文件中的参数,每一帧图像共提取1000个特征点,分布在金字塔8层中,层间尺度比例1.2,计算下来金字塔0层大约有217个特征点,7层大约有50个特征点。这样有一个比较直观的概念。 提 阅读全文
摘要:
关键帧数据库通过预先训练好的词典,维护一个向量std::vector<list<KeyFrame*> > mvInvertedFile; 该向量中mvInvertedFile[i]表示包含了第i个WordId的所有关键帧; 我们需要知道关键帧对应的vBowVec向量是一个map: 该类的主要作用是在 阅读全文