【读书笔记】《视觉SLAM十四讲(高翔著)》 第6讲

【读书笔记】《视觉SLAM十四讲(高翔著)》 第6讲_第1张图片

文章目录

    • PART1 读书笔记
    • PART2 实践部分

PART1 读书笔记





【读书笔记】《视觉SLAM十四讲(高翔著)》 第6讲_第2张图片
6.2.3 列文伯格-马夸尔特方法 (书P113)
信任区域概念的引入

ρ用于衡量“实际”和“预计”之间的差距

LM算法的步骤,设定信赖区域的半径;

书P114式(6.25):利用拉格朗日乘子,求在约束条件下的函数的极值点。拉格朗日乘子参考高等数学教材,以下是从中摘录的部分相关内容:
【读书笔记】《视觉SLAM十四讲(高翔著)》 第6讲_第3张图片
仿照书P111对式(6.20)的做法,对式(6.25)展开、求导,得到式(6.26)→据此可求△x。
6.2.4 小结
·良好初值的重要性
·矩阵的稀疏形式使得实时求解优化问题成为可能。具体见第10讲。

PART2 实践部分

6.3.2 安装Ceres
在安装的过程中(20190615)先后出现以下问题:

按照书P116发送指令:sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev libgoogle-glog-dev libgtest-dev,出现以下问题:
E: Unable to locate package libcxsparse3.1.2
E: Unable to locate package libcxsparse3.1.2
E: Couldn’t find any package by regex ‘libcxsparse3.1.2’
原因:
Linux系统版本与依赖项版本不对应的问题,libcxsparse3.1.2对应的是Ubuntu 14.04,而 ibcxsparse3.1.4对应的是Ubuntu 16.04。本人电脑:Ubuntu 16.04。
解决办法:
将安装命令:sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev libgoogle-glog-dev libgtest-dev
改为:sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.4 libgflags-dev libgoogle-glog-dev libgtest-dev
也即将libcxsparse3.1.2改为libcxsparse3.1.4
——以上参考于网址:https://blog.csdn.net/Robot_Starscream/article/details/88698483

在Ceres库目录下,使用cmake编译,出现报错:error: no type named ‘Literal……,原因如下:
是因为ceres-solver和eigen3这个版本不兼容,需要重新配置一个版本。
版本在:https://pan.baidu.com/s/1pNt9xoB
解压后执行命令:
cd eigen-eigen-ce5a455b34c0
mkdir build
cd build
cmake …
make
sudo make install
再编译ceres-solver、之后再安装ceres(sudo make install)就ok了。

——以上参考于网址:https://blog.csdn.net/sunyoop/article/details/79032174

6.3.3 使用Ceres拟合曲线
参照书P117代码,对其简要分析:
9-23:代价函数的计算模型
27-33:定义变量并初始化;
27:要估计参数的a b c真实值;
28:要生成的数据的个数;
29:噪声值,用于决定随机生成的噪声的大小;
30:随机数产生器,用于生成噪声;
31:定义数组并初始化归零,用于存储a b c的估计值。
33:定义两个变量,用于存储生成的100个数值
35-44:生成两组数值,并输出显示
38-39:按顺序生成x
40-41:随机生成y
43:输出生成的数值
47:创建一个变量
48:for循环,循环次数=刚才生成数值的个数
50-57:调用AddResidualBlock函数,向问题中添加误差项
61-63:配置求解器并将配置信息存储在变量options中
65:定义变量
66:计时1
67:执行优化
68:计时2
69:所花费的时间=计时2-计时1
70:输出所花费的时间
73-76:输出优化结果

6.4.1 图优化理论简介
图优化:顶点和边
顶点:要优化的变量。例如,相机的位姿节点,路标点,这些是优化算法的输出,是所求的结果。
边:误差项。例如,运动模型(编码器输出的信息)、相机模型(相机输出的图像信息),这些是优化算法的输入,是已知的、含有误差和不确定性的信息。

6.4.2 g2o的编译与安装
①安装依赖项
按照书P122下方的指令,来实现对依赖项的安装。但是有以下注意点:
· Ubuntu 14.04对应libcxsparse3.1.2,而Ubuntu 16.04对应libcxsparse3.1.4,这一点要对应好,不然会报错;
· Ubuntu16.04安装g2o时出现报错:E: 无法定位软件包 libcholmod-dev,解决办法:输入sudo apt-get install libcholmod然后按Tab键,Tab键就是自动补充命令,当你记不住完整命令的时候,你按下它,他会自动搜索你电脑上Ubuntu系统对应版本的依赖包型号!我在这里出来的是libcholmod3.0.6,然后安装就好。
②编译、安装g2o
在安装包路径下:
mkdir build
cd build
cmake …(注意是2个英文句号)
make
sudo make install
安装完毕之后g2o的头文件位于/usr/local/include/g2o下,库文件位于/usr/local/lib/下。

6.4.3 使用g2o拟合曲线
根据书P124例程,对代码进行如下解说:
15-51:从 g2o 派生出了用于曲线拟合的图优化顶点和边:CurveFittingVertex(16行)和 CurveFittingEdge(35行)
20-23:顶点的重置函数:setToOriginImpl。
25-28:顶点的更新函数:oplusImpl。书P127对该函数的解释:
【读书笔记】《视觉SLAM十四讲(高翔著)》 第6讲_第4张图片
在这里插入图片描述
30-31:存盘和读盘函数:read, write。由于我们并不想进行读写操作,就留空了。
41-46:边的误差计算函数:computeError。该函数需要取出边所连接的顶点的当前估计值,根据曲线模型,与它的观测值进行比较。这和最小二乘问题中的误差模型是一致的。
47-48:存盘和读盘函数:read, write。由于我们并不想进行读写操作,就留空了。
55-72:和书P118 27-44行代码一致:
55:要估计参数a b c的真值;
56:要生成的数据的个数;
57:噪声值,用于决定随机生成的噪声的大小;
58:随机数产生器,用于生成噪声;
59:定义数组并初始化归零,用于存储a b c的估计值。
61:定义两个变量,用于存储生成的100个数值
64-72:生成两组数值,并输出显示
67:按顺序生成x
68-70:随机生成y
71:输出生成的数值

76-87:构建图优化,其中81 83 84分别对应3种方法
90-93:向图中增加顶点。
95-105:向图中增加边。把100个数值都包含进去。
108-114:执行优化,这部分发核心语句是110 111,其余语句是为了计算优化所花费的时间。
117-118:输出优化值。

你可能感兴趣的:(SLAM学习笔记)