- 博客(119)
- 收藏
- 关注
原创 METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(七)
METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS(七)3.7. 最后的话我们已经讨论了许多解决非线性最小二乘问题的算法。它们都出现在任何好的程序库中,并且可以通过以下 Internet 地址上的 GAMS(可用数学软件指南)找到实现http://gams.nist.gov本手册中的示例是在 MATLAB 中计算的。这些程序在工具箱 immoptibox 中可用,可以从以下地址找到http://www.imm.dtu.dk/∼hbn/immoptibox
2022-04-30 21:50:51
507
原创 METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(六)
METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS(六)之后的两个方法都是针对无法进行解析求导情况下的处理方法,大多数情况下并不会用到3.5. L-M 方法的割线版本本手册中讨论的方法假设向量函数 f\pmb{f}fff 是可微的,即雅各比矩阵J(x)=[∂fi∂xj]\pmb{J}(\pmb{x}) = \begin{bmatrix} \frac{\partial \pmb{f}_i}{\partial \pmb{x}_j} \end{bmatr
2022-04-30 20:11:12
626
原创 METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(五)
METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS(五)3.4. 混合方法:L-M 和准牛顿法1988 年,Madsen 提出了一种混合方法,它结合了 L-M 方法(如果 F(x∗)=0\pmb{F}(\pmb{x}^∗)=0FFF(xxx∗)=0,则为二次收敛,否则为线性收敛)和准牛顿方法(即使 F(x∗)≠0\pmb{F}(\pmb{x}^∗) \neq 0FFF(xxx∗)=0,它也可以给出超线性收敛)。迭代以 L-M 方法的一系列步骤开始。如果性能表明
2022-04-30 18:44:00
685
原创 METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(四)
METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS(四)3.3. Powell 的 Dog Leg方法与列文伯格-马尔夸特方法一样,该方法使用高斯-牛顿法和最陡下降方向的组合。但是通过信赖域的半径显式控制两种方法之间的切换,参见第 2.4 节。 Powell 的名字与算法有关,因为他提出了如何找到由 (2.23) 定义的 htr\pmb{h}_{tr}hhhtr 的近似值。给定 f:Rn→Rmf: \mathbb{R}^n \to \mathbb{R}^mf:
2022-04-30 04:32:20
576
原创 METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(三)
METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS(三)3. 非线性最小二乘问题在本手册的其余部分中,我们将讨论求解非线性最小二乘问题的方法。给定一个向量函数 f:Rn→Rm with m≥nf:\mathbb{R}^n \to \mathbb{R}^m \, with \, m\geq nf:Rn→Rmwithm≥n。我们想要最小化 ∣∣f(x)∣∣||f(x)||∣∣f(x)∣∣,或者等价地找到x∗=argminx{F(x)}(3.1 a)\pm
2022-04-30 04:31:07
1605
原创 METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(二)
METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS(二)2. 下降方法所有非线性优化的方法都基于是迭代的。从一个起点 x0\pmb{x}_0xxx0开始,该方法产生一系列的向量 x1,x2,...,\pmb{x}_1,\pmb{x}_2,...,xxx1,xxx2,...,(希望能) 收敛到 x∗\pmb{x}^∗xxx∗ ,即给定函数的局部最小值,见定义1.3.。大多数方法都有强制执行下降条件的措施F(xk+1)<F(xk)(2.1)F(\pmb
2022-04-29 16:42:33
474
原创 METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 翻译(一)
METHODS FOR NON-LINEAR LEAST SQUARES PROBLEMS 一文的完整翻译,并修改了文中部分的表述错误(也可能是我理解错了,有问题欢迎指正)
2022-04-29 04:43:02
770
1
原创 ORBSLAM3论文翻译
ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM摘要本文介绍了ORB-SLAM3,这是第一个能够使用单目、双目和RGB-D相机,使用针孔和鱼眼镜头模型执行视觉、视觉-惯性和多地图SLAM的系统。第一个主要创新点是基于特征的紧耦合的视觉-惯性SLAM系统,它完全依赖于最大后验概率(MAP)估计,即使在IMU初始化阶段也是如此。其结果是,该系统在小型和大型、室内和室外环境中实时
2021-12-02 03:30:09
4234
原创 ORBSLAM2论文翻译
ORB-SLAM2: an Open-Source SLAM System forMonocular, Stereo and RGB-D Cameras摘要我们为单目、双目和RGB-D相机提供了一个完整的SLAM系统,包括地图复用、闭环矫正和重定位功能。该系统在标准CPU上实时运行,适用于各种环境,从室内小型手持式设备,到在工业环境中飞行的无人机和在城市中行驶的汽车。我们的后端基于单目和双目观测的BA,允许使用度量尺度进行精确的轨迹估计。我们的系统包括一个轻量级的纯定位模式,利用视觉里程跟踪未建图的区域
2021-11-30 00:30:27
3419
原创 第十六章:其他工具与技术(二)
枚举枚举(enum) 是一种取值受限的特殊类型,具体的参考这里enum Color{ Red, // 全局作用域 Green, Yellow;};int main(){ Color x = Red;}关于枚举,我们需要知道以下几点:分为无作用域枚举与有作用域枚举( C++11 起)两种enum class Color{ Red, // 有作用域枚举 Green, Yellow;};int main(){ Color x
2021-10-30 23:43:45
106
原创 第十六章:其他工具与技术(一)
异常处理异常处理用于处理程序在调用过程中的非正常行为:传统的处理方法:传返回值表示函数调用是否正常结束C++中的处理方法:通过关键字try/catch/throw引入异常处理机制void f1(){ throw 1;}void f2(){ f1();}void f3(){ f2();}int main(){ try{ f3(); } catch(int){ std::cout << "exc
2021-10-30 17:47:04
122
原创 第十五章:元编程(三)
减少实例化技巧最后我们来讨论一下减少实例化的技巧,首先我们需要明白我们为什么要减少实例化:提升编译速度,减少编译所需内存。减少实例化通常使用以下技巧:提取重复逻辑以减少实例个数conditional使用时避免实例化// 修改前using Res = std::conditional_t<false, std::remove_reference_t<int&>,
2021-10-30 02:49:54
162
原创 第十五章:元编程(二)
循环语句的编写方式首先我们来看一个简单的例子:计算二进制中包含 1 的个数template <int x>constexpr auto fun = (x % 2) + fun<x/2>;template<>constexpr auto fun<0> = 0;在编译期我们通常会使用递归来实现循环。此外,任何一种分支代码的编写方式都对应相应的循环代码编写方式。接下来我们再来看一个例子:使用循环处理数组并获取数组中 id=0,2,4,6… 的元
2021-10-29 23:54:51
98
原创 第十五章:元编程(一)
元编程的引入在引入元编程之前我们需要回顾下泛型编程,泛型编程是使用一套代码来处理不同的类型。但对于一些特殊的类型需要引入额外的处理逻辑,也就是在编译期引入操作程序的程序-元编程。或者更为通俗的讲,可以将元编程理解为编译期计算。我们可以使用编译期计算来辅助运行期计算,但需要在概念上着重强调两点这种辅助并不是简单地将整个运算一分为二我们需要详细分析哪些内容可以放到编译期,哪些需要放到运行期。如果某种信息需要在运行期确定,那么通常无法利用编译期计算元程序的形式通常有以下几种:模板, constexp
2021-10-29 18:26:16
340
原创 第十四章:模版(四)
数值模版参数与模版模版参数模版可以接收(编译期常量)数值作为模版参数template <int a>template <int a>template <typename T,T val>template <typename T,T val>int fun(int x){ return x + val;}(C++17)template <auto a>template <auto a>void f
2021-10-17 03:14:46
155
原创 第十四章:模版(三)
Concepts模版存在一些固有的问题:我们并没有办法对模版参数引入相应的限制参数是否可以正常工作,通常需要阅读代码进行理解编译报错的友好性较差(vector<int &>)为了解决这个问题,在C++20引入了Concepts:编译器谓词,他可以基于给定的输入,返回true或false,他可以与constraints(require从句)一起使用来限制模版参数。通常我们将constraints置于表示模版形参的尖括号后面进行限制template <typename T
2021-10-16 21:42:47
131
原创 第十四章:模版(二)
类模版与成员函数模版我们可以使用template来引入类模版;template <typename T>class B{};关于类模版,我们需要注意以下几点类模版的声明与定义需要满足翻译单元级别的一处定义原则成员函数只有在调用时才会被实例化类模版名称在模版类内或者模版成员函数内可以进行简写template <typename T>class B{public: auto fun(){ return B{}; // 编译器自动视为
2021-10-16 20:12:37
89
原创 雷达系列论文翻译(十一):LVI-SAM: Tightly-coupled Lidar-Visual-Inertial Odometryvia Smoothing and Mapping
LVI-SAM: Tightly-coupled Lidar-Visual-Inertial Odometryvia Smoothing and Mapping摘要我们提出了一个通过平滑和映射实现的紧耦合激光雷达视觉惯性里程计的框架LVI-SAM,该框架实现了实时状态估计和地图构建,具有高的精度和鲁棒性。LVI-SAM建立在因子图之上,由两个子系统组成:视觉惯性系统(VIS)和激光雷达惯性系统(LIS)。这两个子系统以紧耦合的方式设计,其中VIS利用LIS的估计来促进初始化。通过使用激光雷达
2021-10-12 01:38:44
1230
原创 第十四章:模版(一)
函数模版我们可以使用template关键字引入模版,比如template <typename T>void fun(T input){ }typename关键字可以替换为class,含义相同函数模版中包含了两对参数:函数形参/实参;模版形参/实参函数模版需要进行显式实例化,比如fun<int>(3);关于显式实例化,需要知道以下几点:实例化会使得编译器产生相应的函数(函数模版并非函数,不能调用)模版函数在编译期的两阶段处理模版语法检查
2021-10-08 20:22:02
93
原创 第十三章:类的进阶(三)
类继承的补充首先我们来讨论一下public、protected和private继承之间的区别,可以参考这里public inheritance makes public members of the base class public in the derived class, and the protected members of the base class remain protected in the derived class.protected inheritance makes
2021-09-25 03:36:32
181
原创 第十三章:类的进阶(二)
类的继承类可以通过继承或者派生来引入“是一个”的关系struct Base{};struct Derive : public Base{ };关于继承,我们需要关注以下几点通常使用public继承(struct缺省情况下使用public继承而class缺省情况下使用private继承)继承部分不是类的声明可以使用基类的指针或者引用来指向派生类的对象 int main() { Derive d; Base * ptr = &d; Base &
2021-09-18 04:43:59
120
原创 第十三章:类的进阶(一)
运算符重载概述在C++中,我们可以通过operator关键字引入重载函数来为类定义一些特殊的运算struct Str{ int val = 3;};auto operator + (Str x, Str y){ Str z; z.val = x.val + y.val; return z;}int main() { Str x; Str y; Str z = x + y; std::cout << z.val &l
2021-09-12 16:36:25
121
原创 第十二章:类(四)
字面值类字面值类是可以构造编译期常量的抽象数据类型,比如class Str{public:private: int x = 3;};constexpr Str a;关于字面值类,我们需要注意以下几点字面值类的数据成员需要是字面值类型如果不使用默认生成的构造函数,那么字面值类需要提供constexpr/consteval构造函数(小心使用consteval)class Str{public: constexpr Str(int val) :x(val
2021-09-04 18:16:51
60
原创 第十二章:类(三)
拷贝赋值与移动赋值函数根据C++对于构造和赋值的区分衍生出了两类不同的函数,构造函数和赋值函数,接下来我们关注与赋值操作相关的两个函数:拷贝赋值函数和移动赋值函数(opreator =)class Str{public: Str() = default; Str(const Str & val) = default; Str(Str&& x) noexcept = default; Str& operator = (const Str
2021-09-04 15:42:59
82
原创 第十二章:类(二)
构造函数构造函数是一类特殊的成员函数,它是在构造对象时调用的成员函数。构造函数的名称与类名相同,无返回类型,可以包含多个版本(重载)class Str{public: Str(){ std::cout << "Constructor is called " << std::endl; } Str(int input){ x = input; }private: int x;};在C++11之后
2021-09-04 02:41:36
104
原创 Extended Kalman Filter vs. Error State Kalman Filter for Aircraft Attitude Estimation 翻译
Extended Kalman Filter vs. Error State Kalman Filter for Aircraft Attitude Estimation先大致介绍一下看这篇论文的动机,最近在面试时候提到自己用到了误差卡尔曼基本都会被问到误差卡尔曼和扩展卡尔曼的区别,但答的都不是非常理想,其中一个面试官推荐了这篇论文。摘要卡尔曼滤波器 (KF) 是当状态和测量动态本质上是线性时最小化均方误差的最佳估计器,前提是过程和测量噪声过程被建模为高斯白噪声。然而,在现实世界中,人们会遇到大量
2021-09-01 03:35:31
1964
14
原创 第十二章:类(一)
结构体与对象聚合结构体是一种对基本数据结构进行扩展,并将多个对象放置在一起来视为一个整体的类型,比如struct Str{ int x; int y;};关于结构体,我们需要注意以下几点结构体的声明与定义(注意定义后面要跟分号来表示结束)struct Str; // 声明struct Str{ // 定义 int x; int y;};仅有声明的结构体是不完整的类型(incomplete type),不完整类型可以用来定义对应的指针,但不能用
2021-08-29 16:21:43
127
原创 雷达系列论文翻译(八):Scan Registration with Multi-Scale K-Means Normal Distributions Transform
Scan Registration with Multi-Scale K-Means Normal Distributions Transform这篇论文和之后的两篇论文都来自同一作者,主要是描述了对标准NDT算法的改进以提升收敛性和降低计算量。本文主要贡献是使用K-均值聚类生成高斯分布,并在不同尺度上进行配准,这个思想和多层光流法类似。同时,为了克服仅使用单个高斯分布进行评估导致的代价函数的不连续性,使用了所有聚类生成的高斯分布进行评估,由于使用了K-均值聚类方式,生成的高斯分布的数量要远小于基于固定
2021-08-28 03:55:38
374
原创 雷达系列论文翻译(九):3D Scan Registration Using the Normal Distributions Transform
3D Scan Registration Using the Normal Distributions Transform with Ground Segmentation and Point Cloud Clustering这篇论文是之后的第九篇论文的简述版,两者基本上没有区别,这里提到的贪婪聚类就是下一篇讲到的区域生长聚类方法摘要正态分布变换(NDT)扫描配准算法将环境建模为一组高斯分布,并通过将环境离散为体素来生成高斯分布。对于标准方法,NDT算法倾向于即使对于适度的初始变换误差也具有较差的
2021-08-27 03:26:32
587
原创 雷达系列论文翻译(十):Scan registration using segmented region growing NDT
Scan registration using segmentedregion growing NDT摘要正态分布变换扫(NDT)描配准算法使用矩形体素栅格划分点云,然后将每个单元内的点建模为一组高斯分布。为了配准扫描需要执行非线性优化,然而当点跨越栅格边界时,基于体素栅格的方法导致不明确的代价函数导数。在这项工作中,提出了一种分段区域增长的NDT(SRG-NDT)变体,该变体首先从扫描中去除地面点,然后使用环境中的自然特征为NDT算法生成高斯聚类。地面点的移除显著地加速了扫描配准过程,而对配准精度并没
2021-08-25 01:49:04
783
原创 雷达系列论文翻译(二):Least-Squares Rigid Motion Using SVD
Least-Squares Rigid Motion Using SVD摘要本注释总结了计算对齐两组对应点的最优的刚体变换的步骤。问题陈述令P={p1,p2,...,pn}\mathcal{P} = \{p_1,p_2,...,p_n\}P={p1,p2,...,pn}和Q={q1,q2,...,qn}\mathcal{Q}=\{q_1,q_2,...,q_n\}Q={q1,q2,...,qn}是RdR^dRd空间内的两组对应的点。我们希望找到一个刚性的变换,在最小二乘的意义上最优地对齐
2021-08-23 04:42:04
739
原创 第十一章:泛型算法与Lambda表达式(二)
bind在泛型算法中,很多算法允许通过可调用对象来自定义计算逻辑的细节,比如transform、copy_if和sort等可调用对象分为以下几种:函数指针:概念直观,但定义位置受限(不能定义在函数内部)bool MyPredict(int val){ return val > 3;}int main() { std::vector<int> x{1,2,3,4,5,6,7,8,9,10}; std::vector<int> y; s
2021-08-21 15:00:25
173
原创 第六章作业
第六章作业1设C=[c1c2c3]u=[u1u2u3]C = \begin{bmatrix} c_1 & c_2 & c_3 \end{bmatrix} \\u = \begin{bmatrix} u_1 \\ u_2 \\ u_3 \end{bmatrix}C=[c1c2c3]u=⎣⎡u1u2u3⎦⎤则CT(Cu)∧C=CT(c1u1+c2u2+c3u3)∧C=CTvuc1∧C+CTvuc2∧C+CTvuc3∧CC^T (Cu)^{\wedge}C
2021-08-18 20:06:20
105
原创 雷达系列论文翻译(七):Lio-mapping
Tightly Coupled 3D Lidar Inertial Odometry and Mapping摘要自我运动估计是大多数移动机器人应用的基本要求。通过传感器融合,我们可以弥补独立传感器的不足,并提供更可靠的估计。本文介绍了一种紧耦合的雷达-惯性测量单元融合方法。通过联合最小化激光雷达和惯性测量单元测量的代价函数,激光雷达-惯性测量单元里程计(LIO)可以在长期实验后以可接受的漂移误差表现良好,即使在激光雷达测量可能退化的挑战性情况下也是如此。此外,为了获得更可靠的激光雷达位姿估
2021-08-18 00:45:07
3279
2
原创 跟踪线程(四):跟踪局部地图
本次主要讲解的是ORBSLAM2中跟踪线程的最后一步,跟踪局部地图,这里主要是在使用前面三种跟踪方式获取到的粗糙的位姿后使用局部地图来细化当前帧的位姿,这个步骤是在每次进行跟踪时都必须使用的,对应的函数为TrackLocalMap,其中主要进行了以下几个步骤更新局部关键帧 mvpLocalKeyFrames 和局部地图点 mvpLocalMapPoints// Step 1:更新局部关键帧 mvpLocalKeyFrames 和局部地图点 mvpLocalMapPointsUpdateLocalM
2021-08-15 23:18:31
562
原创 跟踪线程(三):基于重定位进行跟踪
本次主要讲解ORBSLAM2中的基于重定位的跟踪,这种方式只有在跟踪丢失的时候会去使用,但是代码量确实三种跟踪方式中最复杂的,其中涉及到了多次试图找到符合要求的重定位关键帧,对应的函数为Relocalization,其中主要进行了以下工作计算当前帧特征点的词袋向量 // Step 1:计算当前帧特征点的词袋向量 mCurrentFrame.ComputeBoW();根据词袋来找到与当前关键帧相似的候选关键帧// Step 2:用词袋找到与当前帧相似的候选关键帧vector<Key
2021-08-15 04:07:05
385
原创 跟踪线程(二):基于匀速模型跟踪
本次主要讲解ORBSLAM2中的第二种跟踪方式,基于匀速模型跟踪,在ORBSLAM2的跟踪过程中,大部分情况下都会使用这个方式来进行跟踪,对应的函数为TrackWithMotionModel,在其中主要进行了以下工作初始化特征点匹配器并更新上一帧的位姿,对于双目或者RGBD模式还会生成临时的地图点用于增强跟踪的稳定性// 最小距离 < 0.9*次小距离 匹配成功,检查旋转ORBmatcher matcher(0.9,true);// Step 1:更新上一帧的位姿;对于双目或RGB-D相机,
2021-08-15 01:49:20
568
原创 跟踪线程(一):基于关键帧跟踪
本次我们主要讲解ORBSLAM2中跟踪模式的一种,基于参考关键帧的跟踪,这种跟踪模式主要用于没有速度信息,刚完成重定位或者恒速模型跟踪失败后进行,主要的函数为TrackReferenceKeyFrame(),其中主要进行了以下工作:将当前帧的描述子转化为BoW向量// Step 1:将当前帧的描述子转化为BoW向量mCurrentFrame.ComputeBoW();这个函数之前已经提到过在当前帧和参考关键帧之间利用DBOW加速匹配来寻找匹配关系// We perform firs
2021-08-15 01:16:07
444
原创 雷达系列论文翻译(三):The normal-distributionstransform
The normal-distributionstransform原文来自The Three-Dimensional Normal-Distributions Transform — an Efficient Representation for Registration, Surface Analysis, and Loop Detection 的第六章,其他章节内容有兴趣可以自行研究用于表示曲面的NDT第三章中讨论的距离传感器都输出点云:来自表面的一组空间采样点。此外,第5章中涉及的许多相关算
2021-08-14 18:48:01
667
原创 雷达系列论文翻译(一):Least-Squares Fitting of Two 3-D Point Sets
Least-Squares Fitting of Two 3-D Point Sets摘要两个点集{pi}\{p_i\}{pi}和{pi′}\{p_i^{'}\}{pi′};i=1,2,...,Ni = 1,2,...,Ni=1,2,...,N由pi′=Rpi+T+Nip_i^{'} = Rp_i + T + N_ipi′=Rpi+T+Ni所关联,这里RRR是旋转矩阵,TTT是平移向量,NiN_iNi是噪声向量。给定{pi}\{p_i\}{pi}和{pi′}\{p_i^{'}\}{pi′
2021-08-14 00:32:31
1893
4
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人