- 博客(20)
- 收藏
- 关注
原创 梯度下降、牛顿法、高斯牛顿&L-M算法比较
本文梳理一下常见的几种优化算法:梯度下降法,牛顿法、高斯-牛顿法和L-M算法,优化算法根据阶次可以分为一阶方法(梯度下降法),和二阶方法(牛顿法等等),不同优化算法的收敛速度,鲁棒性都有所不同。一般来讲,二阶方法要比一阶方法有更快的收敛速度。梯度下降法梯度下降法是一种简洁直观的寻找极小值的迭代算法,它总是沿着负梯度方向进行搜索,直到梯度为0才收敛。它的迭代公式为:xk+1=xk−αf′(xk...
2019-05-30 14:28:46 8784
原创 s-msckf代码笔记(二)
二、VIOVIO中IMU的状态向量为:xI=(GIqTbgTGvITbaTGpITCIqTIpCT)T\textbf x_I=\begin{pmatrix}{}_G^I\textbf q^T & \textbf b_g^T & {}^G\textbf v_I^T & \textbf b_a^T & {}^G\textbf p_...
2019-05-10 10:59:05 2430 2
原创 LSD_SLAM代码笔记
Lsd_slam的主函数位于main_live_odometry.cpp中,其中主要的SLAM功能由slamNode.Loop();执行。Slam.Loop()主要为一个读取新图像并处理的死循环,由newImageCallback处理图像。newImageCallback执行slam的随机初始化和图像跟踪。1 随机初始化随机初始化函数为SlamSystem::randomInit1.1 ...
2019-05-06 15:18:20 1118
原创 从零编写一个双目视觉SLAM系统(一):一个滑窗的PnP里程计
最近在尝试用光流法写一个基本的双目视觉SLAM,希望通过这个项目把SLAM的各个模块都自己实现一遍,以此加深对SLAM各个模块的理解。 目前刚完成了一个通过求解相邻帧PnP问题的双目视觉里程计,基本有了一个粗糙的效果,后续还需要把Bundle Adjustment、边缘化、回环检测和位姿图优化加上去。回环检测暂时设想用ORB来做。 在这里把这个初步的里程计的思路记录一下。...
2019-04-04 16:14:32 4019 2
原创 利用光流做双目立体匹配的2种去除外点的方法
利用光流跟踪可以对左右图像的特征点进行快速匹配,相比于利用描述子(Descriptor)进行匹配,使用光流跟踪速度更快,然而,使用光流法进行跟踪会返回一些错误跟踪的点,如下图中圈红圈的部分。最近看了一些开源代码,发现了2种用于去除外点的方法。1.基于RANSAC算法估计左右图像的基础矩阵该方法可以用cv::findFundamentalMat实现,且十分高效。可以看到第一幅图中红圈...
2019-03-27 20:08:46 2131
原创 s-msckf代码笔记(一)
s-msckf主要由image_processor跟msckf_vio两个节点组成。Image_processor中主要的算法位于ImageProcessor::stereoCallback()。一、前端图像处理image_processor::stereoCallback()接收双目图像数据,首先构建图像金字塔,用于光流跟踪、双目匹配,保存在curr_cam1_pyramid_,curr_...
2019-03-18 17:34:51 3163 3
原创 用BFS(广度优先搜索)对16线激光雷达点云进行聚类分析
广度优先搜索(BFS)是一种可以用于连通性分析的算法,也可以用于迷宫问题的求解。最近看点云处理的相关算法,发现BFS也可以用于点云的聚类,于是用16线激光雷达点云做了下实验。 不过首先需要对激光雷达点云进行有序排列,将点云数据根据行列存入一个点云变量中。16线激光雷达的扫描范围为360度,一共16条扫描线。横向角度分辨率为0.2度,纵向为2度。于是一条扫描线上的激光点数目最多为:...
2019-02-21 14:38:39 3990 5
原创 LOAM代码笔记(二)
LaserOdometryLaserOdometry的继承关系为:BasicLaserOdometry——>LaserOdometry LaserOdometry接收上一个节点发布的角点、平面点、_cornerPointsLessSharp、_surfacePointsLessFlat和完整的点云,将它们分别存储在_cornerPointsSharp,_surfPointsFla...
2019-01-02 21:55:20 3120 6
原创 LOAM代码笔记(一)
LOAM主要由四个节点组成,分别为:multiScanRegistration、laserOdometry、laserMapping和transformMaintenance。其中,核心算法封装在BasicScanRegistration、BasicLaserOdomotry、BasicLaserMapping和BasicTransformMaintenance中,这几个类的实现不涉及RO...
2019-01-02 16:55:01 4675 7
原创 多线程版的LOAM
SLAM相关的开源包好像都比较喜欢基于ROS框架开发,而在实际项目中,用到ROS的还不是很多,这给SLAM算法的集成就带来了一些麻烦。这段时间刚好在看LOAM,就顺便把LOAM改了一下,让它不依靠ROS也能运行。LOAM的核心算法在几个以Basic开头的cpp文件中,这几个文件都是没有调用ROS的功能的,所以只要把它的数据流搞明白了,把LOAM从ROS框架下剥离开来也不是很难。我主要把原版LO...
2018-12-29 15:33:32 1048 3
原创 基于LK光流的Structure from Motion实现
这两天试着写了个Structure from Motion的实现,巩固一下对sfm细节的掌握,本来以为sfm应该挺简单的,但最后写完发现代码还是不少。最后在Kitti数据集上跑了一下,基本能够还原运动过程和特征点的位置,由于没有进行BA优化,所以总体的准确度还有一定的提升空间。理论推导部分Structure from Motion是单目视觉运动估计的一种常用方法,主要通过对极几何和求...
2018-12-17 17:16:33 1352 2
原创 GTSAM学习(一):自定义Factor
开始上手折腾GTSAM,GTSAM是一个基于因子图模型非常完整的优化库,在多传感器融合领域有非常重要的意义。GTSAM里有许多已经定义好的因子比如IMUFactor, 相机投影因子等等,但是当需要用到GTSAM没有的因时,也可以自定义。 每次学一个优化库,我都会从一个曲线拟合的例子开始。曲线方程为:f(x)=emx+cf(x) = e^{mx+c}f(x)=emx+c,令m,c的真...
2018-12-06 14:11:17 8459 6
原创 VINS源码笔记(一)
这段时间在看VINS,写一下总结。VINS需要在ROS框架下运行,而自己用的是Mac,不能很好的支持VINS,于是在把代码搞熟之后自己发挥动手能力在Mac下把VINS搭建了一遍,效果如下。VINS在ros框架下进行开发,主要由3个节点构成:feature_tracker, vins_estimator和pose_graph。对应代码位于同名文件夹下,其中config文件夹主要包含了不同dem...
2018-12-04 18:59:13 1571 6
原创 C++和STL笔记
C++变量和基本变量类型const限定符const对象在定义时必须初始化,默认情况下const变量仅在文件内有效。如需多个文件共享,则要加extern关键字。const的引用const int ci = 1024;const int &r1 = ci;允许常量引用绑定非常量对象,常量引用可以直接赋值,常量引用不能给非常量引用赋值。int i = 42;const int...
2018-11-29 17:38:41 284
原创 Pangolin学习
之前一直在用OpenCV的Viz模块做三维显示,看了一些Pangolin的效果还是觉得Pangolin比较适合用于SLAM中的三维显示。刚在MAC下装了Pangolin,编译了几个demo,有的能运行,有的不能运行,把学习过程和遇到的问题在这里记录一下。CMakeLists.txt里面必须指定C++11才能成功编译,否则会报错。我加了2条:set(CMAKE_BUILD_TYPE “Rele...
2018-11-29 10:58:07 6216 5
原创 排序算法总结
排序算法汇总 排序算法有冒泡排序、选择排序、插入排序、归并排序和快速排序。最近写了一下,在这里做一下总结。 冒泡排序是最简单的排序算法之一,重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。void bubbleSort(int A...
2018-11-27 20:23:12 190
原创 单应矩阵
单应矩阵描述了图像中2个平面上的像素点的转换关系。一个世界坐标系下的三维点到图像平面的变换可以表示为:Zc(uv1)=KT(XwYwZw1)Z_c\begin{pmatrix}u \\v \\1\end{pmatrix} = KT\begin{pmatrix}X_w \\Y_w \\Z_w \\1\end{pmatrix} Zc⎝⎛uv1⎠⎞=KT⎝⎜⎜⎛Xw...
2018-11-19 17:08:55 253
原创 Ceres解析求导:一个曲线拟合的例子
假设有一组观测数据{xi,yi}\left\{x_i,y_i\right\}{xi,yi},由以下公式得到,nwn_wnw为噪声。f(x)=emx+cf(x) = e^{mx + c}f(x)=emx+cy=f(x)+nwy = f(x) + n_wy=f(x)+nw其中m=0.3,c=0.1m = 0.3,c = 0.1m=0.3,c=0.1。现在我们根据得到的观测数据,...
2018-11-15 20:25:04 1416
原创 逆深度参数化(Inverse Depth Parametrization)
参数化 在Bundle Ajustment中,参数空间通常呈现出高维度、非线性的特点。其中对于3D特征点的优化占据了大量的运算量。 3D特征点最常用的参数化方式为:Xi=(xi,yi,zi)TX_i = (x_i,y_i,z_i)^TXi=(xi,yi,zi)T 或者齐次式:Xi=(xi,yi,zi,1)TX_i = (x_i,y_i,z_i,1)^TXi=...
2018-11-05 08:20:09 5712 2
翻译 预处理共轭梯度法(PCG)
开始读研了,研究方向是SLAM。SLAM中很重要的一部分是位姿估计,需要用到一些优化算法对位姿进行优化。预处理共轭梯度法PCG(Preconditioned Conjugate Gradient)是一种SLAM中常用的位姿优化算法,从共轭梯度法(Conjugate Gradient)衍生而来,用于快速计算最优值。直接法假设有一个线性方程: Ax=bAx=b\textbf{A}\t...
2018-09-19 22:44:59 20831 5
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人