[高翔]SLAM十四讲第二版——课后习题(1-6讲)

开始学习SLAM,记录一下

第1讲 预备知识

1.有线性方程Ax=b,若已知A,b,需要求解x,该如何求解?这对A和b有哪些要求?提示:从A的维度和秩角度来分析。

在线性代数中,一个矩阵的秩是其非零子式的最高阶数,一个向量组的秩是其最大无关组所含的向量个数。
线性方程组Ax=b有解的充分必要条件是r(A|b)=r(A),等价于b能被A的列向量线性表出。

参考:【线性代数】结合 Ax=b 的通解结构,直观理解秩、线性变换、相关无关、基础解系

求解方法:
1.对A的增广矩阵(A|b)做初等行变换,化最简行阶梯型
2.判断
r(A|b)=r(A)=n,有唯一解,若A为方阵,x=A^-1b
r(A|b)=r(A)<n,有无穷多解,将所有自由变量置0求非齐次方程组特解,再求齐次方程组基础解系,得通解
r(A|b)≠r(A),无解。

2.高斯分布是什么,它的一维形式和高维形式分别是什么?

参考:一维高斯分布与多维高斯分布

在这里插入图片描述

在这里插入图片描述
3.C++中的类和STL是什么?

类是C++中的一个新的数据类型,可以是对同一类型事物进行抽象处理,也可以是一个层次结构中的不同层次节点。
STL是C++的标准模板库,编程完全依赖模板的实现。
类模板是能根据不同参数建立不同类型成员的类。类模板中的数据成员、成员函数的参数、成员函数的返回值可以取不同类型,在实例化成对象时,根据传入的参数类型,实例化成具体类型的对象。

4.C++工程是什么?

头文件就是.h后缀结尾的文件。定义了类,包括类的变量和方法,但是方法只是声明,具体语句没有写。
源文件是工程中最重要的部分。 一般源文件的开头会引用头文件,如使用#include的方式进行引用 。

参考:https://www.cnblogs.com/zhuzhenwei918/p/8568692.html

5.C++11标准的新特性?

1.引入auto和decltype关键字,在编译期就推导出变量或者表达式的类型
2.新增右值引用
3.在变量名后面加上初始化列表来进行对象的初始化

参考:https://zhuanlan.zhihu.com/p/139515439

6.Linux操作系统

1.Debian运行起来极其稳定,这使得它非常适合用于服务器。Debian平时维护三套正式的软件库和一套非免费软件库,Debian这款操作系统无疑并不适合新手用户,而是适合系统管理员和高级用户。
2.Ubuntu是Debian的一款衍生版,也是当今最受欢迎的免费操作系统之一。
3.红帽企业级Linux是第一款面向商业市场的Linux发行版。它有服务器版本,支持众多处理器架构,包括x86和x86_64。
4.CentOS是一款企业级Linux发行版,它使用红帽企业级Linux中的免费源代码重新构建而成。

7.Linux的目录结构是什么样的?有哪些基本命令?
在这里插入图片描述

Linux的目录结构

基本命令

8. 如何在Ubuntu系统中安装软件(不打开软件中心的情况下)?这些软件被安装在什么地方?如果只知道模糊的软件名称(比如想要装一个名称中含有Eigen的库),应该如何安装它?

https://zhuanlan.zhihu.com/p/270908077

1.使用apt命令安装:
1.1安装软件:sudo apt install 软件包名
1.2软件安装位置:

软件包:/var/cache/apt/archives
安装位置:/usr/share
快捷方式:/usr/share/applications
可执行文件:/usr/bin
lib文件:/usr/lib
配置文件:/etc

1.3搜索软件:sudo apt search 关键字

2.使用snap命令安装
2.1安装软件:sudo snap install 软件包名
2.2软件安装位置:/snap
2.3搜索软件:sudo snap find 关键字

3.使用dpkg命令安装deb包
3.1安装软件:sudo dpkg -i 文件名.deb
3.2软件安装位置:/opt

9.Vim

https://www.runoob.com/linux/linux-vim.html
在这里插入图片描述

第2讲 初始SLAM

3.g++命令有哪些参数?怎么填写参数可以更改生成的程序文件名?

https://blog.csdn.net/qq_29695701/article/details/95593003

-c:只进行预处理、编译、汇编,生成.o文件
-S:只进行预处理和编译,生成.s文件。
-E:只进行预处理,不自动生成文件,可将结果重定向。
-o:进行预处理、编译、汇编、链接。

更改生成的程序文件名:g++ '要编译的文件' -o '希望生成的文件名'
默认参数下将生成a.out

6. 如果忘了把库链接到可执行程序上,编译会报错吗?什么样的错?
在链接时发现找不到某个函数的实现文件,会报错:undefined reference to …

7. * 阅读《cmake 实践》,了解 cmake 的其他语法。

cmake手册

第3讲 三维空间刚体运动

1. 验证旋转矩阵是正交矩阵。

参考:https://blog.csdn.net/qq_17032807/article/details/84928910

旋转矩阵 R = [ e 1 T e 1 ′ e 1 T e 2 ′ e 1 T e 3 ′ e 2 T e 1 ′ e 2 T e 2 ′ e 2 T e 3 ′ e 3 T e 1 ′ e 3 T e 2 ′ e 3 T e 3 ′ ] R=\begin{bmatrix} e^{_{1}^{T}}e^{_{1}^{'}} & e^{_{1}^{T}}e^{_{2}^{'}} & e^{_{1}^{T}}e^{_{3}^{'}} \\ e^{_{2}^{T}}e^{_{1}^{'}} & e^{_{2}^{T}}e^{_{2}^{'}} & e^{_{2}^{T}}e^{_{3}^{'}} \\ e^{_{3}^{T}}e^{_{1}^{'}} & e^{_{3}^{T}}e^{_{2}^{'}} & e^{_{3}^{T}}e^{_{3}^{'}} \end{bmatrix} R= e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3 ,表示单位正交基 ( e 1 e 2 e 3 ) (\begin{matrix} e^{_{1}} & e^{_{2}} & e^{_{3}} \end{matrix}) (e1e2e3)经过一次旋转变成了 ( e 1 ′ e 2 ′ e 3 ′ ) (\begin{matrix} e^{_{1}^{'}} & e^{_{2}^{'}} & e^{_{3}^{'}} \end{matrix}) (e1e2e3)

故旋转矩阵的逆R^-1表示单位正交基 ( e 1 ′ e 2 ′ e 3 ′ ) (\begin{matrix} e^{_{1}^{'}} & e^{_{2}^{'}} & e^{_{3}^{'}} \end{matrix}) (e1e2e3)经过一次旋转变成了 ( e 1 e 2 e 3 ) (\begin{matrix} e^{_{1}} & e^{_{2}} & e^{_{3}} \end{matrix}) (e1e2e3)

即有 [ e 1 ′ e 2 ′ e 3 ′ ] \begin{bmatrix} e^{_{1}^{'}} & e^{_{2}^{'}} & e^{_{3}^{'}} \end{bmatrix} [e1e2e3] [ a 1 ′ a 2 ′ a 3 ′ ] \begin{bmatrix} a_{1}^{'}\\ a_{2}^{'}\\ a_{3}^{'} \end{bmatrix} a1a2a3 = [ e 1 e 2 e 3 ] \begin{bmatrix} e^{_{1}} & e^{_{2}} & e^{_{3}} \end{bmatrix} [e1e2e3] [ a 1 a 2 a 3 ] \begin{bmatrix} a_{1}\\ a_{2}\\ a_{3} \end{bmatrix} a1a2a3 ,对等式两边同乘以 [ e 1 ′ T e 2 ′ T e 3 ′ T ] \begin{bmatrix} e_{1}^{'T}\\ e_{2}^{'T}\\ e_{3}^{'T} \end{bmatrix} e1Te2Te3T

可得 R − 1 = [ e 1 ′ T e 1 e 1 ′ T e 2 e 1 ′ T e 3 e 2 ′ T e 1 e 2 ′ T e 2 e 2 ′ T e 3 e 3 ′ T e 1 e 3 ′ T e 2 e 3 ′ T e 3 ] R^{-1}=\begin{bmatrix} e_{1}^{'T}e_{1} & e_{1}^{'T}e_{2} & e_{1}^{'T}e_{3}\\ e_{2}^{'T}e_{1} & e_{2}^{'T}e_{2} & e_{2}^{'T}e_{3}\\ e_{3}^{'T}e_{1} & e_{3}^{'T}e_{2} & e_{3}^{'T}e_{3} \end{bmatrix} R1= e1Te1e2Te1e3Te1e1Te2e2Te2e3Te2e1Te3e2Te3e3Te3

单位正交基转置不影响向量之间点积的值,故有 R − 1 = R T R^{-1} = R^{T} R1=RT

进而由 R R T = R R − 1 = E RR^{T}=RR^{-1}=E RRT=RR1=E,可证旋转矩阵为正交矩阵。

2.寻找罗德里格斯公式的推导过程并加以理解。

参考1 https://zhuanlan.zhihu.com/p/388386417
参考2 空间几何-向量在另外一个向量上的投影计算
参考3 一个向量乘它的转置,其几何意义是什么? - 半个冯博士的回答 - 知乎

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 验证四元数旋转某个点后,结果是个虚四元数(实部为0),所以仍然对应到一个三维空间点。

参考1 https://zhuanlan.zhihu.com/p/388386417

在这里插入图片描述
在这里插入图片描述

4.画表总结旋转矩阵、轴角、欧拉角、四元数的关系。
在这里插入图片描述

5.假设有一个大的Eigen矩阵,想把它左上角3X3的块取出来,然后赋值为 I 3 × 3 I_{3\times 3} I3×3,请编程实现。

因为是大矩阵,所以循环遍历不是最优解,Eigen中有子矩阵操作(block)

matrix.block(i,j,p,q)  提取块大小为(p,q),起始于(i,j)

故代码为:

#include <iostream>
#include<Eigen/Dense>
using namespace std;
 
int main()
{
    
    
    Eigen::Matrix4d matrix_44 = Eigen::Matrix4d::Random();
    cout << "Here is a matrix:\n" << matrix_44 << endl;
    Eigen::Matrix3d matrix_33 = Eigen::Matrix3d::Constant(0.1);
    matrix_33 = matrix_44.block(0,0,3,3);
    cout << "左上角3×3的块取出来,并赋值给Matrix3_3\n" << matrix_33 << endl;
    return 0;
}

6. 一般线性方程Ax=b有哪几种做法?你能在Eigen中实现吗?

一般分为直接法雅克比迭代法
直接法分为:
1.直接求逆法,运算量大,仅对方阵有效,很可能没解;
2.QR分解法,一般比较常用,方程就算方程无解也会得到近似解;
3.最小二乘求解,和QR类似;
4.LU分解法,仅仅对于方阵有效;
5.cholesky分解法,也仅仅适合方阵。
雅克比迭代法属于一种数值求解法,需要计算方程的雅克比矩阵以及设计迭代策略。
原文链接:https://blog.csdn.net/qq_17032807/article/details/84928910

第4讲 李群与李代数

1. 验证SO(3)、SE(3)和Sim(3)关于乘法成群。

参考https://blog.csdn.net/qq_17032807/article/details/84942548
https://zhuanlan.zhihu.com/p/388616110

首先,成群需要满足的四条性质:
在这里插入图片描述
1.1特殊正交群 S O ( 3 ) = { R ∈ R 3 × 3 ∣ R R T = I , d e t ( R ) = 1 } SO\left ( 3 \right )=\left \{ R\in \mathbb{R}^{3\times 3}|RR^{T}=I, det\left ( R \right )=1 \right \} SO(3)={ RR3×3RRT=I,det(R)=1}
因为R是矩阵,所以SO(3)满足结合律存在幺元I存在逆 R R T = I RR^{T}=I RRT=I
因为 R 1 R 2 ( R 1 R 2 ) T = R 1 R 2 R 2 T R 1 T = R 1 ( R 2 R 2 T ) R 1 T = R 1 R 1 T = I R_{1}R_{2}\left ( R_{1}R_{2} \right )^{T}=R_{1}R_{2}R_{2}^{T}R_{1}^{T}=R_{1}\left ( R_{2}R_{2}^{T} \right )R_{1}^{T}=R_{1}R_{1}^{T}=I R1R2(R1R2)T=R1R2R2TR1T=R1(R2R2T)R1T=R1R1T=I
d e t ( R 1 R 2 ) = d e t ( R 1 ) d e t ( R 2 ) = 1 × 1 = 1 det\left ( R_{1}R_{2} \right )=det\left ( R_{1} \right )det\left ( R_{2} \right )=1\times 1=1 det(R1R2)=det(R1)det(R2)=1×1=1
所以 R 1 R 2 ∈ S O ( 3 ) R_{1}R_{2}\in SO\left ( 3 \right ) R1R2SO(3)满足封闭性,所以SO(3)关于乘法成群。

1.2特殊欧式群 S E ( 3 ) = { T = [ R t 0 T 1 ] ∈ R 4 × 4 ∣ R ∈ S O ( 3 ) , t ∈ R 3 } ; SE(3)=\left \{ T=\left [ \begin{matrix} R & t\\ 0^{T} & 1 \end{matrix} \right ]\in\mathbb{R}^{4\times 4}|R\in SO(3), t\in \mathbb{R}^{3} \right \}; SE(3)={ T=[R0Tt1]R4×4RSO(3),tR3};
同样T是矩阵,满足结合律存在幺元存在逆
因为 T 1 ∗ T 2 = [ R 1 t 1 ⃗ 0 1 ] ∗ [ R 2 t 2 ⃗ 0 1 ] = [ R 1 R 2 + t 1 ⃗ ∗ 0 R 1 t 2 ⃗ + t 1 ⃗ ∗ 1 0 ∗ R 2 + 1 ∗ 0 0 ∗ t 2 ⃗ + 1 ∗ 1 ] = [ R 1 R 2 R 1 t 2 ⃗ + t 1 ⃗ 0 1 ] T_{1}*T_{2}=\left [ \begin{matrix} R_{1} &\vec{t_{1}} \\ 0 & 1 \end{matrix} \right ]*\left [ \begin{matrix} R_{2} &\vec{t_{2}} \\ 0 & 1 \end{matrix} \right ]=\left [ \begin{matrix} R_{1}R_{2}+\vec{t_{1}}*0 &R_{1}\vec{t_{2}}+ \vec{t_{1}}*1 \\ 0*R_{2}+1*0 & 0*\vec{t_{2}}+1*1 \end{matrix} \right ]\\ =\left [ \begin{matrix} R_{1}R_{2} &R_{1} \vec{t_{2}}+\vec{t_{1}} \\ 0 & 1 \end{matrix} \right ] T1T2=[R10t1 1][R20t2 1]=[R1R2+t1 00R2+10R1t2 +t1 10t2 +11]=[R1R20R1t2 +t1 1]
已知 R 1 R 2 ∈ S O ( 3 ) R_{1}R_{2} \in SO(3) R1R2SO(3),从矩阵乘法维度我们知道 R 1 t 2 ⃗ + t 1 ⃗ ∈ R 3 × 3 R_{1} \vec{t_{2}}+ \vec{t_{1}} \in\mathbb{R}^{3\times 3} R1t2 +t1 R3×3
T 1 T 2 ∈ S E ( 3 ) T_{1}T_{2}\in SE\left ( 3 \right ) T1T2SE(3)满足封闭性,所以SE(3)关于乘法成群。

1.3相似变换群 S i m ( 3 ) = { S = [ s R t 0 1 ] ∈ R 4 × 4 } Sim(3)=\left \{ S=\left [ \begin{matrix} sR & t\\ 0 & 1 \end{matrix} \right ]\in\mathbb{R}^{4\times 4} \right \} Sim(3)={ S=[sR0t1]R4×4}
跟SE(3)的证明类似,同样假设 S 1 , S 2 ∈ S i m ( 3 ) S_{1},S_{2} \in Sim(3) S1,S2Sim(3)

S 1 ∗ S 1 = [ s R 1 t 1 ⃗ 0 1 ] [ s R 2 t 2 ⃗ 0 1 ] = [ s 2 R 1 R 2 s R 1 t 2 ⃗ + t 1 ⃗ 0 1 ] ∈ R 4 × 4 S_{1}*S_{1}=\left [ \begin{matrix} sR_{1} & \vec{t_{1}}\\ 0 & 1 \end{matrix} \right ]\left [ \begin{matrix} sR_{2} & \vec{t_{2}}\\ 0 & 1 \end{matrix} \right ]=\left [ \begin{matrix} s^{2} R_{1}R_{2}& sR_{1} \vec{t_{2}}+\vec{t_{1}} \\ 0 & 1 \end{matrix} \right ]\in\mathbb{R}^{4\times 4} S1S1=[sR10t1 1][sR20t2 1]=[s2R1R20sR1t2 +t1 1]R4×4

易证得Sim(3)也关于乘法成群。

2.验证 ( R 3 , R , × ) \left ( \mathbb{R}^{3},\mathbb{R},\times \right ) (R3,R,×)构成李代数。
在这里插入图片描述
证明:

假设 a ⃗ = ( a 1 , a 2 , a 3 ) , b ⃗ = ( b 1 , b 2 , b 3 ) , c ⃗ = ( c 1 , c 2 , c 3 ) ∈ R 3 \vec{a}=\left ( a_{1},a_{2},a_{3} \right ),\vec{b}=\left ( b_{1},b_{2},b_{3} \right ) ,\vec{c}=\left ( c_{1},c_{2},c_{3} \right ) \in \mathbb{R}^{3} a =(a1,a2,a3),b =(b1,b2,b3),c =(c1,c2,c3)R3

2.1封闭性:

a ⃗ × b ⃗ = [ i j k a 1 a 2 a 3 b 1 b 2 b 3 ] = [ a 2 b 3 − a 3 b 2 a 3 b 1 − a 1 b 3 a 1 b 2 − a 2 b 1 ] ∈ R 3 \vec{a}\times \vec{b}=\left [ \begin{matrix} i & j &k \\ a_{1} & a_{2} & a_{3}\\ b_{1} & b_{2} & b_{3} \end{matrix} \right ]=\left [ \begin{matrix} a_{2}b_{3}-a_{3}b_{2}\\ a_{3}b_{1}-a_{1}b_{3}\\ a_{1}b_{2}-a_{2}b_{1} \end{matrix} \right ] \in \mathbb{R}^{3} a ×b = ia1b1ja2b2ka3b3 = a2b3a3b2a3b1a1b3a1b2a2b1 R3

2.2双线性:

再假设 α , β ∈ R \alpha , \beta \in \mathbb{R} α,βR。则:

( α a ⃗ + β b ⃗ ) × c ⃗ = [ i j k α a 1 + β b 1 α a 2 + β b 2 α a 3 + β b 3 c 1 c 2 c 3 ] = ( α a 2 c 3 − α a 3 c 2 ) i + ( β b 2 c 3 − β b 3 c 2 ) i + ( α a 3 c 1 − α a 1 c 3 ) j + ( β b 3 c 1 − β b 1 c 3 ) j + ( α a 1 c 2 − α a 2 c 1 ) k + ( β b 1 c 2 − β b 2 c 1 ) k = α [ i j k a 1 a 2 a 3 c 1 c 2 c 3 ] + β [ i j k b 1 b 2 b 3 c 1 c 2 c 3 ] = α a ⃗ × c ⃗ + β b ⃗ × c ⃗ \left ( \alpha \vec{a}+\beta \vec{b} \right )\times \vec{c}=\left [ \begin{matrix} i & j & k\\ \alpha a_{1}+\beta b_{1} & \alpha a_{2}+\beta b_{2} & \alpha a_{3}+\beta b_{3}\\ c_{1} & c_{2} & c_{3} \end{matrix} \right ]\\ =\left ( \alpha a_{2}c_{3}-\alpha a_{3}c_{2} \right )i+\left ( \beta b_{2}c_{3}-\beta b_{3}c_{2} \right )i+(\alpha a_{3}c_{1}-\alpha a_{1}c_{3})j+\left ( \beta b_{3}c_{1}-\beta b_{1}c_{3} \right )j\\ +\left ( \alpha a_{1}c_{2}-\alpha a_{2}c_{1} \right )k+\left ( \beta b_{1}c_{2}-\beta b_{2}c_{1} \right )k\\ =\alpha\left [ \begin{matrix} i & j &k \\ a_{1} & a_{2} & a_{3}\\ c_{1} & c_{2} & c_{3} \end{matrix} \right ]+\beta \left [ \begin{matrix} i & j & k\\ b_{1} & b_{2} &b_{3} \\ c_{1} & c_{2} & c_{3} \end{matrix} \right ]=\alpha \vec{a}\times\vec{c}+\beta \vec{b} \times \vec{c} (αa +βb )×c = iαa1+βb1c1jαa2+βb2c2kαa3+βb3c3 =(αa2c3αa3c2)i+(βb2c3βb3c2)i+(αa3c1αa1c3)j+(βb3c1βb1c3)j+(αa1c2αa2c1)k+(βb1c2βb2c1)k=α ia1c1ja2c2ka3c3 +β ib1c1jb2c2kb3c3 =αa ×c +βb ×c

同样能证得 c ⃗ × ( α a ⃗ + β b ⃗ ) = α ( c ⃗ × a ⃗ ) + β ( c ⃗ × b ⃗ ) \vec{c} \times \left ( \alpha \vec{a}+\beta \vec{b} \right )=\alpha\left ( \vec{c} \times \vec{a} \right ) + \beta\left ( \vec{c} \times \vec{b} \right ) c ×(αa +βb )=α(c ×a )+β(c ×b )

2.3自反性:

a ⃗ × a ⃗ = 0 \vec{a} \times \vec{a} = 0 a ×a =0

2.4雅克比等价性

a ⃗ × ( b ⃗ × c ⃗ ) + c ⃗ × ( a ⃗ × b ⃗ ) + b ⃗ × ( c ⃗ × a ⃗ ) = 0 \vec{a} \times \left(\vec{b} \times \vec{c} \right ) +\vec{c} \times \left(\vec{a} \times \vec{b} \right ) +\vec{b} \times \left(\vec{c} \times \vec{a} \right ) =0 a ×(b ×c )+c ×(a ×b )+b ×(c ×a )=0

故可证 ( R 3 , R , × ) \left ( \mathbb{R}^{3},\mathbb{R},\times \right ) (R3,R,×)构成李代数。

3.验证so(3)和se(3)满足李代数要求的性质。

s o ( 3 ) = { ϕ ∈ R 3 , Φ = ϕ ^ ∈ R 3 × 3 } so(3)=\left \{ \phi \in \mathbb{R}^{3}, \Phi =\hat{\phi } \in \mathbb{R}^{3\times 3} \right \} so(3)={ ϕR3,Φ=ϕ^R3×3}
在这里插入图片描述

假设 ϕ 1 , ϕ 2 , ϕ 3 ∈ R 3 \phi _{1}, \phi_{2}, \phi_{3} \in \mathbb{R}^{3 } ϕ1,ϕ2,ϕ3R3

3.1.1封闭性:
[ ϕ 1 , ϕ 2 ] = [ Φ 1 Φ 2 − Φ 2 Φ 1 ] ∨ ∈ R 3 \left [ \phi_{1},\phi_{2} \right ]=\left[ \Phi_{1}\Phi_{2}-\Phi_{2}\Phi_{1}\right]^{\vee }\in \mathbb{R}^{3 } [ϕ1,ϕ2]=[Φ1Φ2Φ2Φ1]R3
3.1.2双线性:
再假设 a , b ∈ R a,b \in \mathbb{R} a,bR。则:
在这里插入图片描述

3.1.3自反性:
[ ϕ 1 , ϕ 1 ] = [ Φ 1 Φ 1 − Φ 1 Φ 1 ] ∨ = 0 \left [ \phi_{1},\phi_{1} \right ]=\left[ \Phi_{1}\Phi_{1}-\Phi_{1}\Phi_{1}\right]^{\vee }=0 [ϕ1,ϕ1]=[Φ1Φ1Φ1Φ1]=0

3.1.4雅克比等价性
在这里插入图片描述

[ ϕ 1 , [ ϕ 2 , ϕ 3 ] ] + [ ϕ 3 , [ ϕ 1 , ϕ 2 ] ] + [ ϕ 2 , [ ϕ 3 , ϕ 1 ] ] = 0 \left [ \phi_{1},\left [ \phi_{2},\phi_{3} \right ] \right ]+\left [ \phi_{3},\left [ \phi_{1},\phi_{2} \right ] \right ]+\left [ \phi_{2},\left [ \phi_{3},\phi_{1} \right ] \right ]=0 [ϕ1,[ϕ2,ϕ3]]+[ϕ3,[ϕ1,ϕ2]]+[ϕ2,[ϕ3,ϕ1]]=0

s e ( 3 ) = { ξ = [ ρ ϕ ] ∈ R 6 , ρ ∈ R 3 , ϕ ∈ s o ( 3 ) , ξ ^ = [ ϕ ^ ρ 0 0 ] ∈ R 4 × 4 } se(3)=\left \{ \xi =\left [ \begin{matrix} \rho \\ \phi \end{matrix} \right ] \in \mathbb{R}^{6},\rho \in \mathbb{R} ^{3}, \phi \in so(3),\hat{\xi }=\left [ \begin{matrix} \hat{\phi } & \rho \\ 0 & 0 \end{matrix} \right ] \in \mathbb{R}^{4 \times 4} \right \} se(3)={ ξ=[ρϕ]R6,ρR3,ϕso(3),ξ^=[ϕ^0ρ0]R4×4}
在这里插入图片描述

假设 ξ 1 , ξ 2 , ξ 3 ∈ R 6 \xi _{1}, \xi_{2}, \xi_{3} \in \mathbb{R}^{6} ξ1,ξ2,ξ3R6

3.2.1封闭性:
[ ξ 1 ^ , ξ 2 ^ ] = ( ξ 1 ^ ξ 2 ^ − ξ 2 ^ ξ 1 ^ ) ∨ = [ ϕ ^ 1 ϕ ^ 2 − ϕ ^ 2 ϕ ^ 1 ϕ ^ 1 ρ 2 − ϕ ^ 2 ρ 1 0 T 0 ] ∨ ∈ R 6 [\hat{\xi_{1}},\hat{\xi_{2}}]=(\hat{\xi_{1}}\hat{\xi_{2}}-\hat{\xi_{2}}\hat{\xi_{1}})^{\vee }=\left [ \begin{matrix} \hat{\phi}_{1}\hat{\phi}_{2}-\hat{\phi}_{2}\hat{\phi}_{1} & \hat{\phi}_{1}\rho_{2}-\hat{\phi}_{2}\rho_{1} \\ 0^{T} & 0 \end{matrix} \right ] ^{\vee } \in \mathbb{R}^{6} [ξ1^,ξ2^]=(ξ1^ξ2^ξ2^ξ1^)=[ϕ^1ϕ^2ϕ^2ϕ^10Tϕ^1ρ2ϕ^2ρ10]R6

其中 ( ϕ ^ 1 ϕ ^ 2 − ϕ ^ 2 ϕ ^ 1 ) ∨ ∈ s o ( 3 ) (\hat{\phi}_{1}\hat{\phi}_{2}-\hat{\phi}_{2}\hat{\phi}_{1})^{\vee}\in so(3) (ϕ^1ϕ^2ϕ^2ϕ^1)so(3)
ϕ ^ 1 ρ 2 − ϕ ^ 2 ρ 1 ∈ R 6 \hat{\phi}_{1}\rho_{2}-\hat{\phi}_{2}\rho_{1}\in \mathbb{R}^{6} ϕ^1ρ2ϕ^2ρ1R6

3.2.2双线性:
再假设 a , b ∈ R a,b \in \mathbb{R} a,bR。则:
在这里插入图片描述

3.2.3自反性:
[ ξ 1 ^ , ξ 1 ^ ] = ( ξ 1 ^ ξ 1 ^ − ξ 1 ^ ξ 1 ^ ) ∨ = 0 [\hat{\xi_{1}},\hat{\xi_{1}}]=(\hat{\xi_{1}}\hat{\xi_{1}}-\hat{\xi_{1}}\hat{\xi_{1}})^{\vee }=0 [ξ1^,ξ1^]=(ξ1^ξ1^ξ1^ξ1^)=0

3.2.4雅克比等价性
在这里插入图片描述

4. 验证性质(4.20)和(4.21)。
在这里插入图片描述

a ⃗ = [ a 1 a 2 a 3 ] {\vec{a}}=\left [\begin{matrix} a_{1}\\ a_{2}\\a_{3}\end{matrix} \right ] a = a1a2a3 a ⃗ ^ = [ 0 − a 3 a 2 a 3 0 − a 1 − a 2 a 1 0 ] \hat{\vec{a}}=\left [\begin{matrix} 0 & -a_{3} & a_{2}\\ a_{3} & 0 & -a_{1}\\ -a_{2} & a_{1} & 0 \end{matrix} \right ] a ^= 0a3a2a30a1a2a10

证4.20
在这里插入图片描述

证4.21
在这里插入图片描述

5.证明: R p ^ R T = ( R p ) ^ R\hat{p}R^{T}=\hat{(Rp)} Rp^RT=(Rp)^

在这里插入图片描述

6.证明SO(3)上的伴随性质: R e x p ( p ^ ) R T = e x p ( ( R p ) ^ ) Rexp(\hat{p})R^{T}=exp(\hat{(Rp)}) Rexp(p^)RT=exp((Rp)^)
在这里插入图片描述
7.仿照左扰动的推导,推导SO(3)和SE(3)在右扰动下的导数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8. 搜索cmake的find_package指令是如何运作的。它有哪些可选的参数?为了让cmake找到某个库,需要哪些先决条件?

文档:https://www.zybuluo.com/khan-lau/note/254724#cmd31-findpackage
在这里插入图片描述
https://blog.csdn.net/weixin_41855010/article/details/108318385

第5讲 相机与图像

参考:视觉SLAM十四讲CH5代码解析及课后习题详解
视觉SLAM十四讲(第二版)第5讲习题解答 - Philip.cjh的文章
《视觉SLAM十四讲 第二版》笔记及课后习题(第五讲)

1. *寻找一个相机(你手机或笔记本的摄像头即可),标定它的内参。你可能会用到标定板,或者自己打印一张标定用的棋盘格。

本文采用的是传入图片&棋盘格方式

参考:https://blog.csdn.net/weixin_51229250/article/details/120009716
https://huangwang.github.io/2019/04/28/OpenCV4-0%E7%9B%B8%E6%9C%BA%E6%A0%87%E5%AE%9A%E6%95%99%E7%A8%8B/

OpenCV官方提供的棋盘格:https://docs.opencv.org/2.4/_downloads/pattern.png
OpenCV自带的有相机标定例程:/PATH/TO/opencv-3.1.0/samples/cpp/tutorial_code/calib3d/camera_calibration

在这里插入图片描述

里面有cpp源程序
in_VID5.xml——配置文件
VID5.xml——图片路径
out_camera_data.yml——真正的输出结果在build文件夹,不是这个

1.1.查看修改配置文件in_VID5.xml
在这里插入图片描述
在这里插入图片描述

1.2.拍摄25张照片——可以用电脑展示图片,然后用手机拍摄
1.3.图片重命名xx1.xx2…,ubuntu可以直接多选重命名,nice!
1.4.修改VID5.xml
最好用绝对路径,(相对路径是相对于build文件夹的),不然容易错:
在这里插入图片描述
1.5.写CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
set (CMAKE_CXX_STANDARD 11)
project( camera_calibration )
find_package( OpenCV REQUIRED )
include_directories( ${
    
    OpenCV_INCLUDE_DIRS} )
add_executable( camera_calibration camera_calibration.cpp )
target_link_libraries( camera_calibration ${
    
    OpenCV_LIBS} )

1.6.build-cmake ..-make

1.7.运行如下命令开始标定,标定完成后将得到保存相关参数的文件。

./camera_calibration ../in_VID5.xml

标定需要一定时间,会有标定过程,标定完会显示矫正后的图片,按回车显示下一张

我的运行结果:
两次使用图片列表,两次使用电脑摄像头
不知道为什么图片列表,矫正后的图片特别扭曲
而且,拿手机拍出来的照片应该都是矫正后的,难道是因为这,才导致再次矫正会扭曲?

在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述

2. 叙述相机内参的物理意义。如果一个相机的分辨率变成两倍而其他地方不变,它的内参如何变化?

参考:相机内参的物理意义

相机的内参矩阵 K = [ f x 0 c x 0 f y c y 0 0 1 ] 相机的内参矩阵K=\left[ \begin{array} { l l l } { f _ { x } } & { 0 } & { c _ { x } } \\ { 0 } & { f _ { y } } & { c _ { y } } \\ { 0 } & { 0 } & { 1 } \end{array} \right] 相机的内参矩阵K= fx000fy0cxcy1

相机矩阵:包括焦距(fx,fy),光学中心(Cx,Cy),完全取决于相机本身,是相机的固有属性,只需要计算一次;
畸变系数:畸变数学模型的5个参数 D = (k1,k2, P1, P2, k3);
相机内参:相机矩阵和畸变系数统称为相机内参,在不考虑畸变的时候,相机矩阵也会被称为相机内参;

分辨率是指单位长度内像素点的数量,它的单位通常为像素/英寸(ppi)

如72ppi表示1英寸包含72个像素点,300ppi表示每英寸含300个像素点。分辨率决定了位图细节的精细程度,通常情况下,分辨率越高包含的像素就越高,图像就越清晰。

像素:是指在由一个数字序列表示的图像中的一个最小单位。像素仅仅只是分辨率的尺寸单位,而不是画质。

在这里插入图片描述

3. 搜索特殊的相机(鱼眼或全景)相机的标定方法。它们与普通的针孔模型有何不同?
在这里插入图片描述

4. 调研全局快门相机(global shutter)和卷帘快门相机(rolling shutter)的异同。它们在SLAM 中有何优缺点?
全局快门与卷帘式快门 - LinsonW的文章 - 知乎
卷帘快门(Rolling Shutter)与全局快门(Global Shutter)的区别
在这里插入图片描述

5. RGB-D 相机是如何标定的?以Kinect 为例,需要标定哪些参数?(参照https://github.com/code-iai/iai_kinect2.)

在这里插入图片描述

6. 除了示例程序演示的遍历图像的方式,你还能举出哪些遍历图像的方法?

遍历图像,应该就是遍历大的二维数组,示例程序中演示的是顺序访问,所以还可以随机访问,

看看别人的
在这里插入图片描述
在这里插入图片描述

第6讲 非线性优化

实验部分

ch3-visualizeGeometry

左键-平移
右键-旋转
在这里插入图片描述

ch5 imageBasics

若报错:

CMakeFiles/imageBasics.dir/imageBasics.cpp.o:在函数‘cv::String::String(char const*)’中:
...
imageBasics.cpp:(.text.startup+0x804):对‘cv::String::deallocate()’未定义的引用
collect2: error: ld returned 1 exit status
CMakeFiles/imageBasics.dir/build.make:102: recipe for target 'imageBasics' failed
make[2]: *** [imageBasics] Error 1
CMakeFiles/Makefile2:94: recipe for target 'CMakeFiles/imageBasics.dir/all' failed
make[1]: *** [CMakeFiles/imageBasics.dir/all] Error 2
Makefile:102: recipe for target 'all' failed
make: *** [all] Error 2

解决方法:CMakeLists.txt 添加 find_package(OpenCV REQUIRED)

在这里插入图片描述

ch5 rgbd

找不到sophus
解决方法:把sophus的build删了,重新cmake、make、还报错的话sudo make install
在这里插入图片描述

ch5 stereo

Opencv报错Assertion failed (size.width>0 && size.height>0)
解决方法:看看是不是图片路径错误,建议写绝对路径
在这里插入图片描述

后记

很桑心,第七讲网课的时候,高老师说课后题是随便出的,并没有好好设计,让看看拓展文档就行。

所以课后题就写到这儿了,第七章实在太难了,还是专注课内知识吧,课后题比较拓展,可以看看,不建议第一遍学习的时候做,收获不大,还费时间。

一路过来参考了这位大佬和很多人的文章,很佩服也很羡慕,希望我以后也能自己写出来。

视觉SLAM十四讲(第二版)习题解答 - Philip.cjh的文章 - 知乎

猜你喜欢

转载自blog.csdn.net/tfnmdmx/article/details/129747368