课后习题(1"/>
[高翔]SLAM十四讲第二版——课后习题(1
[高翔]SLAM十四讲2
- 第1讲 预备知识
- 第2讲 初始SLAM
- 第3讲 三维空间刚体运动
- 第4讲 李群与李代数
- 第5讲 相机与图像
- 第6讲 非线性优化
- 实验部分
- ch3-visualizeGeometry
- ch5 imageBasics
- ch5 rgbd
- ch5 stereo
- 后记
开始学习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的方式进行引用 。
参考:.html
5.C++11标准的新特性?
1.引入auto和decltype关键字,在编译期就推导出变量或者表达式的类型
2.新增右值引用
3.在变量名后面加上初始化列表来进行对象的初始化
…
参考:
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的库),应该如何安装它?
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
.html
第2讲 初始SLAM
3.g++命令有哪些参数?怎么填写参数可以更改生成的程序文件名?
-c:只进行预处理、编译、汇编,生成.o文件
-S:只进行预处理和编译,生成.s文件。
-E:只进行预处理,不自动生成文件,可将结果重定向。
-o:进行预处理、编译、汇编、链接。
更改生成的程序文件名:g++ '要编译的文件' -o '希望生成的文件名'
默认参数下将生成a.out
6. 如果忘了把库链接到可执行程序上,编译会报错吗?什么样的错?
在链接时发现找不到某个函数的实现文件,会报错:undefined reference to …
7. * 阅读《cmake 实践》,了解 cmake 的其他语法。
cmake手册
第3讲 三维空间刚体运动
1. 验证旋转矩阵是正交矩阵。
参考:
旋转矩阵 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= e1Te1′e2Te1′e3Te1′e1Te2′e2Te2′e3Te2′e1Te3′e2Te3′e3Te3′ ,表示单位正交基 ( 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}) (e1′e2′e3′)
故旋转矩阵的逆R^-1表示单位正交基 ( e 1 ′ e 2 ′ e 3 ′ ) (\begin{matrix} e^{_{1}^{'}} & e^{_{2}^{'}} & e^{_{3}^{'}} \end{matrix}) (e1′e2′e3′)经过一次旋转变成了 ( 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} [e1′e2′e3′] [ a 1 ′ a 2 ′ a 3 ′ ] \begin{bmatrix} a_{1}^{'}\\ a_{2}^{'}\\ a_{3}^{'} \end{bmatrix} a1′a2′a3′ = [ 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} e1′Te2′Te3′T
可得 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} R−1= e1′Te1e2′Te1e3′Te1e1′Te2e2′Te2e3′Te2e1′Te3e2′Te3e3′Te3
单位正交基转置不影响向量之间点积的值,故有 R − 1 = R T R^{-1} = R^{T} R−1=RT
进而由 R R T = R R − 1 = E RR^{T}=RR^{-1}=E RRT=RR−1=E,可证旋转矩阵为正交矩阵。
2.寻找罗德里格斯公式的推导过程并加以理解。
参考1
参考2 空间几何-向量在另外一个向量上的投影计算
参考3 一个向量乘它的转置,其几何意义是什么? - 半个冯博士的回答 - 知乎
3. 验证四元数旋转某个点后,结果是个虚四元数(实部为0),所以仍然对应到一个三维空间点。
参考1
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分解法,也仅仅适合方阵。
雅克比迭代法属于一种数值求解法,需要计算方程的雅克比矩阵以及设计迭代策略。
原文链接:
第4讲 李群与李代数
1. 验证SO(3)、SE(3)和Sim(3)关于乘法成群。
参考
首先,成群需要满足的四条性质:
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)={R∈R3×3∣RRT=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 ) R1R2∈SO(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×4∣R∈SO(3),t∈R3};
同样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 ] T1∗T2=[R10t1 1]∗[R20t2 1]=[R1R2+t1 ∗00∗R2+1∗0R1t2 +t1 ∗10∗t2 +1∗1]=[R1R20R1t2 +t1 1]
已知 R 1 R 2 ∈ S O ( 3 ) R_{1}R_{2} \in SO(3) R1R2∈SO(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 ) T1T2∈SE(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,S2∈Sim(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} S1∗S1=[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 = a2b3−a3b2a3b1−a1b3a1b2−a2b1 ∈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,ϕ3∈R3
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,b∈R。则:
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,ξ3∈R6
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ρ1∈R6
3.2.2双线性:
再假设 a , b ∈ R a,b \in \mathbb{R} a,b∈R。则:
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 ^= 0a3−a2−a30a1a2−a10
证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找到某个库,需要哪些先决条件?
文档:
第5讲 相机与图像
参考:视觉SLAM十四讲CH5代码解析及课后习题详解
视觉SLAM十四讲(第二版)第5讲习题解答 - Philip.cjh的文章
《视觉SLAM十四讲 第二版》笔记及课后习题(第五讲)
1. *寻找一个相机(你手机或笔记本的摄像头即可),标定它的内参。你可能会用到标定板,或者自己打印一张标定用的棋盘格。
本文采用的是传入图片&棋盘格方式
参考:
/
OpenCV官方提供的棋盘格:.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 为例,需要标定哪些参数?(参照.)
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的文章 - 知乎
更多推荐
[高翔]SLAM十四讲第二版——课后习题(1
发布评论