## 初识SLAM

flowchart LR
	sensor(传感器数据)
	frontEnd(前端视觉里程计)
	backEnd(后端非线性优化)
	mapping(建图)
	loopClosing(回环检测)
	sensor-->frontEnd-->backEnd-->mapping
	sensor-->loopClosing-->backEnd
  

步骤:

  1. 传感器数据读取

  2. 视觉里程计(Visual Odometry, VO)。估计相邻图像间相机的运动,以及局部地图的样子。主要用到图像特征提取和匹配

  3. 后端优化(Optimization)。接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。需要消除噪声问题,用到滤波和非线性优化算法

  4. 回环检测(Loop Closing)。判断机器人是否打到过先前位置,检测到回环提交给后端处理。SLAM时会出现累计误差需要回环检测消除

  5. 建图(Mapping)。根据估计的轨迹,建立任务对应的地图

VIO:视觉惯性里程计,视觉里程计+IMU

数学问题表述

用$x$表示机器人位置,离散时刻位置记为$x_1,\ldots,x_k$,构成轨迹,每个时刻传感器会测量到一部分路标点一共有N个,用$y_1,\ldots,y_N$表示

  • 运动:考察从$k-1$时刻到$k$时刻,机器人的位置$x$的变化
  • 观测:描述机器人在$k$时刻处于$x_k$位置处探测到了路标$y_i$

运动方程:

$$ x_k=f(x_{k-1},u_k,w_k) $$

$u_k$为运动传感器读数或者输出,$w_k$为噪声

观测方程:

$$ z_{k,j}=h(y_j,x_k,v_{k,j}) $$

机器人在$x_k$位置看到路标$y_j$产生了观测数据$z_{k,j}$,$v_{k,j}$为噪声

三维空间刚体运动

矩阵变换

欧式变换

$$ \left [ e_1,e_2,e_3 \right ]\begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} = \left [ e_1' ,e_2',e_3' \right ]\begin{bmatrix} a_1' \\ a_2' \\ a_3' \end{bmatrix} $$

不同坐标系下向量$a$的坐标,两边乘$\begin{bmatrix} {e_1}^{T} \\ {e_2}^{T} \\ {e_3}^{T} \end{bmatrix}$可得到

$$ \begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} = \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} \begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} \triangleq Ra' $$

矩阵$R$为 旋转矩$\Leftrightarrow$阵行列式为1的正交矩阵,定义

$$ \mathrm{SO}(n)=\left \{\boldsymbol{R}\in \mathbb{R}^{n\times n}|\boldsymbol{RR}^T=I,\det(\boldsymbol{R})=1\right \} $$ $$ \boldsymbol R^{-1}a=\boldsymbol R^Ta $$

特殊正交群(Special Orthogonal Group)

加上平移向量

$$ \boldsymbol{a'= Ra+ t} $$

变换

$$ \boldsymbol{b= R_1a+ t_1,\space c= R_2b+ t_2} $$

a到c变换为

$$ \boldsymbol{c=R_2( R_1a+ t_1)+ t_2} $$

变换后会很不方便,使用齐次坐标和变换矩阵

$$ \begin{bmatrix} \boldsymbol a' \\ 1 \end{bmatrix} = \begin{bmatrix} \boldsymbol {R} & \boldsymbol{t} \\ 0^T & 1 \end{bmatrix} \begin{bmatrix} \boldsymbol a \\ 1 \end{bmatrix} \triangleq \boldsymbol{T} \begin{bmatrix} \boldsymbol a \\ 1 \end{bmatrix} $$

$\boldsymbol T$为变换矩阵

$$ \mathrm{SE}(3)= \left \{T= \begin{bmatrix} R & t\\ 0^T & 1 \end{bmatrix} \in \mathbb{R}^{4\times 4} | R \in \mathrm{SO}(3), t\in \mathbb{R}^3 \right \} $$ $$ T^{-1}=\begin{bmatrix} R^T & -R^Tt\\ 0^T & 1 \end{bmatrix} $$

特殊欧氏群(Special Euclidean Group)

Eigen库

旋转向量和欧拉角

矩阵冗余

旋转轴用单位向量$n$表示,角度用$\theta$表示

和矩阵变换的关系:罗德里格斯公式(Rodrigues’s Formula)

$$ \boldsymbol R=\cos \theta \boldsymbol I + (1-\cos \theta)\boldsymbol n\boldsymbol n^T+\sin \theta \boldsymbol n^\wedge $$

$n^\wedge$是向量到反对称矩阵的转换符

$$ \boldsymbol a\times \boldsymbol b= \begin{Vmatrix} e_1 & e_2 & e_3 \\ a_1 & a_2 & a_3 \\ b_1 & b_2 & b_3 \end{Vmatrix} = \begin{bmatrix} a_2b_3-a_3b_2 \\ a_3b_1-a_1b_3 \\ a_1b_2-a_2b_1 \end{bmatrix} = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} \boldsymbol b \triangleq \boldsymbol a^\wedge \boldsymbol b $$ $$ \boldsymbol a^\wedge = \begin{bmatrix} 0 & -a_3 & a_2 \\ a_3 & 0 & -a_1 \\ -a_2 & a_1 & 0 \end{bmatrix} $$

罗德里格斯公式两边取迹(矩阵对角线元素之和)

$$ \begin{align*} \mathrm{tr}(\boldsymbol R)= & \cos\theta \space\mathrm{tr}(\boldsymbol I) + (1-\cos\theta)\space \mathrm{tr}(\boldsymbol n \boldsymbol n^T)+\sin\theta \space \mathrm{tr}(\boldsymbol n^\wedge) \\ \space = & 3\cos\theta + (1-\cos\theta)\\ = & 1+2\cos\theta \end{align*} $$

转轴$n$旋转$n$方向的向量结果不变

$$ \boldsymbol R\boldsymbol n= \boldsymbol n $$

转轴$\boldsymbol n$是矩阵$\boldsymbol R$特征值1对应的特征向量,求解方程归一化得到$\boldsymbol n$

欧拉角

  • yaw:偏航角,物体绕z轴旋转
  • pitch:俯仰角,绕y轴旋转的
  • roll:滚转角,绕x轴旋转

欧拉角的转动是按轴顺序来的

RPY角(xyz顺序)和Euler角(zyx)

万向锁

四元数

旋转矩阵冗余,欧拉角和旋转向量紧凑但是有奇异性

四元数有一个实部三个虚部

$$ q=q_0+q_1i+q_2j+q_3k $$

满足

$$ \begin{cases} i^2=j^2=k^2=-1 \\ ij=k, ji=-k \\ jk=i, kj=-i \\ ki=j, ik=-j \end{cases} $$

用标量和向量表示四元数

$$ q=[s,v]^T,\quad s=q_0\in\mathbb{R},\quad v=[q_1,q_2,q_3]^T\in\mathbb{R^3} $$

$s$为四元数实部,$v$为四元数虚部,如果一个四元数的虚部为0,称之为实四元数。反 之,若它的实部为0,则称之为虚四元数

乘以$i$意味着旋转180°,$ij=k$

坐标轴记忆,从xyz都为正的象限看向原点,xyz轴呈逆时针顺序

运算

$$ q_a=s_a +x_ai + y_aj + z_ak, \quad q_b=s_b+x_bi+y_bj+z_bk $$
  • 加法减法
$$ q_a\pm q_b=[s_a\pm s_b, v_a\pm v_b]^T $$
  • 乘法

每项分别相乘然后相加,总共16项,虚部乘法转换要按照运算关系

$$ \begin{align*} q_aq_b=&s_as_b-x_ax_b-y_ay_b-z_az_b\\ +&(s_ax_b+x_as_b+y_az_b-z_ay_b)i\\ +&(s_ay_b-x_az_b+y_as_b+z_ax_b)j\\ +&(s_az_b+x_ay_b-y_ax_b+z_as_b)k \end{align*} $$ $$ q_aq_b=[s_as_b-v_a^Tv_b,s_av_b+s_bv_a+v_a\times v_b]^T $$

乘法不具备交换律

  • 模长
$$ \| q_a\|=\sqrt{s_a^2+x_a^2+y_a^2+z_a^2} $$

四元数乘积的模长等于模长的乘积

$$ \|q_aq_b\|=\|q_a\|\|q_b\| $$
  • 共轭

把虚部向量取反

$$ q_a^*=[s_a,-v_a]^T $$ $$ q^*q=qq^*=[s_a+v^Tv,0]^T $$

得到实四元数

$$ q^{-1}=q^*/\|q\|^2 $$ $$ q^{-1}q=qq^{-1}=1 $$

四元数为单位四元数,其逆和共轭是一个量

$$ q_I^{-1}=q_I^{*} $$

乘积的逆具有类似矩阵的性质

$$ (q_aq_b)^{-1}=q_b^{-1}q_a^{-1} $$
  • 数乘
$$ kq=[ks,kv]^T $$

表示旋转

点用四元数描述

$$ p=[0,x,y,z]^T=[0,v]^T $$

旋转后的点为

$$ p'=qpq^{-1} $$

然后把$p'$虚部取出来

其他旋转转换到四元数

四元素乘法写成矩阵乘法

$$ q^+=\begin{bmatrix} s & -v^T\\ v & sI+v^\wedge \end{bmatrix}, \quad q^{\oplus}=\begin{bmatrix} s & -v^T\\ v & sI-v^\wedge \end{bmatrix} $$ $$ q_1^+q_2=\begin{bmatrix} s & -v^T\\ v & sI+v^\wedge \end{bmatrix} \begin{bmatrix} s_2\\ v_2 \end{bmatrix} = \begin{bmatrix} -v_1^Tv_2+s_1s_2\\ s_1v_2+s_2v_1+v_1^\wedge v_2 \end{bmatrix} = q_1q_2 $$

可以证明

$$ q_1q_2=q_1^+q_2=q_2^\oplus q_1 $$ $$ \begin{align*} p'=&qpq^{-1}=q^+p^+q^{-1}\\ =&q^+{q^{-1}}^\oplus p \end{align*} $$

带入矩阵计算

$$ q^+{(q^{-1})}^\oplus=\begin{bmatrix} s & -v^T \\ v & sI+v^\wedge \end{bmatrix} \begin{bmatrix} s & v^T \\ -v & sI+v^\wedge \end{bmatrix}= \begin{bmatrix} 1 & 0 \\ 0^T & vv^T+s^2I+2sv^\wedge+(v^\wedge)^2 \end{bmatrix} $$ $$ R=vv^T+s^2I+2sv^\wedge+(v^\wedge)^2 $$

两边求迹

$$ \begin{align*} \mathrm{tr}(R)&=\mathrm{tr}\left (vv^T+s^2I+2sv^\wedge+(v^\wedge)^2\right)\\ &=v_1^2+v_2^2+v_3s^2+3s^2-2(v_1^2+v_2^2+v_3^2)\\ &=(1-s^2)+3s^2-2(1-s^2)\\ &=4s^2-1 \end{align*} $$ $$ \begin{align*} \theta&=\arccos\left(\frac{\mathrm{tr}(R-1)}{2}\right)\\ &=\arccos(2s^2-1) \end{align*} $$ $$ \begin{cases} \theta=2\arccos s\\ [n_1,n_2,n_3]^T=[q_1,q_2,q_3]^T/\sin\frac{\theta}{2} \end{cases} $$

3D变换

  • 相似变换

$R$部分缩放

$$ T_s=\begin{bmatrix} sR &t\\ 0^T & 1 \end{bmatrix} $$
  • 仿射

$R$矩阵不再正交,只要求可逆

$$ T_s=\begin{bmatrix} A &t\\ 0^T & 1 \end{bmatrix} $$
  • 射影
$$ T_s=\begin{bmatrix} A &t\\ a^T & 1 \end{bmatrix} $$

$A$可逆,$a^T$缩放,$t$平移

Pangolin基于OpenGL的绘图库

李群与李代数

基础

$$ \mathrm{SO}(3)=\left \{\mathbf{R}\in \mathbb{R}^{3\times 3}|RR^T=I,\det(R)=1\right \} $$ $$ \mathrm{SE}(3)= \left \{T= \begin{bmatrix} R & t\\ 0^T & 1 \end{bmatrix} \in \mathbb{R}^{4\times 4} | R \in \mathrm{SO}(3), t\in \mathbb{R}^3 \right \} $$

对加法不封闭

$$ R_1+R_2\notin \mathrm{SO}(3),\quad T_1+T_2\notin\mathrm{SE}(3) $$

乘法是封闭的

$$ R_1R_2\in \mathrm{SO}(3),\quad T_1T_2\in\mathrm{SE}(3) $$

群(Group)是一种集合加上运算的代数结构,集合记为$A$,群记作$G=(A,\cdot)$,满足:

  1. 封闭性:$\forall a_1,a_2\in A,\quad a_1\cdot a_2\in A$
  2. 结合律:$\forall a_1,a_2,a_3\in A,\quad (a_1\cdot a_2)\cdot a_3=a_1\cdot (a_2\cdot a_3)$
  3. 幺元:$\exists a_0\in A,\quad \mathrm{s.t.}\quad \forall a\in A, \quad a_0\cdot a=a\cdot a_0=a$
  4. 逆:$\forall a\in A, \quad \exists a^{-1}\in A, \quad \mathrm{s.t.} \quad a\cdot a^{-1}=a_0$

李群是指具有连续性质的群,整数$\mathbb{Z}$没有

李代数

对于旋转矩阵

$$ RR^T=I $$

$R$随时间变化,则

$$ R(t)R(t)^T=I $$

等式两边求导,得到:

$$ \dot{R}(t)R(t)^T+R(t)\dot{R}(t)^T=0 $$ $$ \dot{R}(t)R(t)^T=-(R(t)\dot{R}(t)^T)^T $$

$\dot{R(t)}R(t)^T$是一个反对称矩阵,所以存在一个向量和反对称矩阵对应

$$ a^\wedge=A=\begin{bmatrix} 0 & -a_3 & a_2\\ a_3 & 0 & -a_1\\ -a_2 & a_1 & 0 \end{bmatrix},\quad A^{\vee}=a $$

设这个三维向量为$\phi(t)\in \mathbb{R}^3$,则

$$ \dot{R}(t)R(t)^T=\phi(t)^\wedge $$

两边右乘$R(t)$得到

$$ \dot{R}(t)=\phi(t)^\wedge R(t)=\begin{bmatrix} 0 & -\phi_3 & \phi_2\\ \phi_3 & 0 & -\phi_1\\ -\phi_2 & \phi_1 & 0 \end{bmatrix} R(t) $$

$R(t)$在$t=0$附近的一阶泰勒展开

$$ \textit{\textbf{text}} \begin{align*} R(t)&\approx R(t_0)+\dot{R}(t_0)(t-t_0)\\ &=I+\phi(t_0)^\wedge(t) \end{align*} $$

$\phi$反映了$R$的导数性质,故称它在$\mathrm{SO}(3)$原点附近的正切空间(Tangent Space)上,在$t_0$附近,有

$$ \dot{R}(t)=\phi(t_0)^\wedge R(t)=\phi_0^\wedge R(t) $$

解微分方程,类似于$f'(x)=kf(x)$,得到

$$ R(t)=e^{\phi_0^\wedge t} $$

总结:

  1. 给定某时刻的$R$就能求得一个$\phi$,$\phi$是对应到$\mathrm{SO}(3)$上的李代数$\mathfrak{so}(3)$
  2. 引出李群与李代数间的指数/对数映射

李代数定义

李代数由一个集合$\mathbb{V}$,一个数域$\mathbb{F}$和一个二元运算$[,]$组成,如果它们满足以下几条性质,则称$(\mathbb{V},\mathbb{F},[,])$为一个李代数,记作$\mathfrak{g}$。

  1. 封闭性 $\forall X,Y\in\mathbb{V},[X,Y]\in\mathbb{V}$
  2. 双线性 $\forall X,Y,Z\in\mathbb{V},a,b\in\mathbb{F}$,有
$$ [aX+bY,Z]=a[X,Z]+b[Y,Z],\quad [Z,aX+bY]=a[Z,X]+b[Z,Y] $$
  1. 自反性 $\forall X\in\mathbb{V},[X,X]=0$
  2. 雅可比等价 $\forall X,Y,Z\in\mathbb{V},[X,[Y,Z]]+[Z,[X,Y]]+[Y,[Z,X]]=0$
$$ \mathfrak{se}(3)=\left \{ \xi =\begin{bmatrix} \rho\\ \phi \end{bmatrix} \in \mathbb{R}^6, \rho\in\mathbb{R}^3, \phi\in\mathfrak{se}(3),\xi^\wedge=\ \begin{bmatrix} \phi^\wedge & \rho\\ 0^T & 0 \end{bmatrix} \in \mathbb{R}^{4\times 4} \right \} $$

二元运算被称为李括号

李代数$\mathfrak{so}(3)$

$$ \mathit{\Phi}=\phi^\wedge=\begin{bmatrix} 0 & -\phi_3 & \phi_2\\ \phi_3 & 0 & -\phi_1\\ -\phi_2 & \phi_1 & 0 \end{bmatrix}\in\mathbb{R}^{3\times 3} $$

李括号的定义

$$ [\phi_1,\phi_2]=(\mathit{\Phi}_1\mathit{\Phi}_2-\mathit{\Phi}_2\mathit{\Phi}_1)^{\wedge} $$

六维向量,前三维平移(和矩阵不一样),记作$\rho$,后三维为旋转,记作$\phi$,对于$\xi^\wedge$,扩展了反对称的用法

$$ \xi^\wedge=\ \begin{bmatrix} \phi^\wedge & \rho\\ 0^T & 0 \end{bmatrix} \in \mathbb{R}^{4\times 4} $$ $$ [\xi_1,\xi_2]=(\xi_1^\wedge\xi_2^\wedge-\xi_2^\wedge\xi_1^\wedge) $$

指数与对数映射

$\mathfrak{so}(3)$上的指数映射

任意矩阵的指数映射可以泰勒展开,在收敛的情况下仍然是一个矩阵

$$ \exp(A)=\sum^\infty_{n=0}\frac{1}{n!}A^n $$ $$ \exp(\phi^\wedge)=\sum^\infty_{n=0}\frac{1}{n!}(\phi^\wedge)^n $$

用向量定义$\phi$,有$\phi=\theta a,\space\|a\|=1$

$$ a^\wedge a^\wedge=\begin{bmatrix} -a_2^2-a_3^2 & a_1a_2 & a_1a_3\\ a_1a_2 & -a_1^2-a_3^2 & a_2a_3\\ a_1a_3 & a_2a_3 & -a_1^2-a_2^2 \end{bmatrix}=aa^T-I $$ $$ a^\wedge a^\wedge a^\wedge =a^\wedge(aa^T-I)=-a^\wedge $$

由此可以得到$a^\wedge$的n次的结果

$$ \begin{align*} \exp(\phi^\wedge)&=\sum^\infty_{n=0}\frac{1}{n!}(\theta a^\wedge)^n\\ &=I+\theta a^\wedge-a^\wedge a^\wedge + \theta a^\wedge + \frac{1}{2!}\theta^2 a^\wedge a^\wedge +\frac{1}{3!} (a^\wedge)^3 +\frac{1}{4!} (a^\wedge)^4 + \ldots\\ &=aa^T- a^\wedge a^\wedge +\theta a^\wedge + \frac{1}{2!}\theta^2 a^\wedge a^\wedge -\frac{1}{3!} a^\wedge -\frac{1}{4!} (a^\wedge)^2\\ &=aa^T+\sideset{}{}{\underbrace{\left( \theta - \frac{1}{3!}\theta^3+\frac{1}{5!}\theta^5+\ldots \right )}}_{\sin \theta}a^\wedge-\sideset{}{}{\underbrace{\left( 1 - \frac{1}{2!}\theta^2+\frac{1}{4!}\theta^4+\ldots \right )}}_{\cos \theta}a^\wedge a^\wedge\\ &=a^\wedge a^\wedge + I+\sin\theta a^\wedge - \cos\theta a^\wedge a^\wedge\\ &=(1-\cos\theta)a^\wedge a^\wedge+I+\sin\theta a^\wedge\\ &=\cos\theta+(1-\cos\theta)aa^T+\sin\theta a^\wedge \end{align*} $$

最后得到:

$$ \exp(\theta a^\wedge)=\cos\theta+(1-\cos\theta)aa^T+\sin\theta a^\wedge $$

和罗德公式一样

$\mbox{SE}(3)$上的指数映射

$$ \begin{align*} \exp{\xi^\wedge}&=\begin{bmatrix} \sum_{n=0}^{\infty}\frac{1}{n!}(\phi^\wedge)^n & \sum_{n=0}^{\infty}\frac{1}{(n+1)!}(\phi^\wedge)^n\rho\\ 0^T & 1 \end{bmatrix} \\ &\triangleq\begin{bmatrix} R & J\rho\\ 0^T & 1 \end{bmatrix} = T \end{align*} $$

同样的展开方式求得

$$ J=\frac{\sin\theta}{\theta}I+\left(1-\frac{\sin\theta}{\theta}\right)aa^T+\frac{1-\cos\theta}{\theta}a^\wedge $$

最后总结李群和李代数的关系

李代数求导和扰动模型

Sophus

相机与图像

相机模型

透镜产生畸变,根据模型计算内参

针孔相机模型

$X$为物体大小,$X'$为图像大小

$$ \frac{Z}{f}=-\frac{X}{X'}=-\frac{Y}{Y'} $$

所以得到

$$ \begin{cases} X'=f\frac{X}{Z}\\ Y'=f\frac{Y}{Z} \end{cases} $$

像素坐标:

$$ [u,v]^T $$

原点定义为图像的左上角,和成像平面多了缩放和原点的平移

所以得到

$$ \begin{cases} u=\alpha X'+c_x\\ v=\beta Y' + c_y \end{cases} $$ $$ \begin{cases} u=f_x \frac{X}{Z}+c_x\\ v=f_y \frac{Y}{Z} + c_y \end{cases} $$

改成齐次坐标变换

$$ \begin{pmatrix} u\\ v\\ 1 \end{pmatrix}=\frac{1}{Z}\begin{pmatrix} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} X\\ Y\\ Z \end{pmatrix}\triangleq\frac{1}{Z}KP $$ $$ Z\begin{pmatrix} u\\ v\\ 1 \end{pmatrix}=\begin{pmatrix} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} X\\ Y\\ Z \end{pmatrix}\triangleq KP $$

$K$为内参矩阵,一般出厂后是固定的,标定方法有单目棋盘格张正友标定法

相机的外参$R,t$为相机的旋转平移量,$P=RP_w+t$

投影过程可以看成把世界坐标点转换到相机坐标系,再去掉相机z轴方向的数值

畸变

透镜形状引起的畸变称为径向畸变,分为桶形畸变和枕形畸变

畸变.png

切向畸变来源为透镜和成像平面不平行

径向畸变多项式关系:

$$ \begin{align} x_\text{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6)\\ y_\text{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6) \end{align} $$

对于切向畸变,用另外的参数纠正:

$$ \begin{align} x_\text{distorted}=x + 2p_1xy+p_2(r^2+2x^2)\\ y_\text{distorted}=x + 2p_2xy+p_1(r^2+2y^2) \end{align} $$
  1. 三维空间归一化坐标为$[x,y]^T$
  2. 径向畸变和切向畸变
$$ \begin{cases} x_\text{distorted}=x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2)\\ y_\text{distorted}=y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2p_2xy \end{cases} $$
  1. 通过内参矩阵变换到像素平面
$$ \begin{cases} u=f_xx_\text{distorted}+c_x\\ v=f_yy_\text{distorted}+c_y \end{cases} $$

双目相机模型

$$ \frac{z-f}{z}=\frac{b-u_L+u_R}{b} $$ $$ z=\frac{fb}{d},\quad d\triangleq u_L-u_R $$

$d$为视差,成像物体在中间,所以两边图像要看上去一样其中一张需要水平翻转,同一物体在两张图片中的横坐标差值(左右相机横放),视差越大距离越近,基线大的测得的最大距离越远,小的能够测量近处距离

RGB-D相机模型

  • 红外结构光

  • 飞行时间法(Time-of-flight,ToF)

实例

图像去畸变

opencv自带cv::Undistort()

每个点用公式计算一遍,颜色换算过去,但是要保证每个像素都有颜色,就必须使用去畸变后的每个图像位置去映射之前的图像中的像素

1image_undistort.at<uchar>(v, u) = image.at<uchar>((int) v_distorted, (int) u_distorted);

双目视觉

cv::StereoSGBM把左右图转为深度图,然后根据深度信息和两张原图拉伸成立体点云

RGB-D

非线性优化

状态估计问题

批量状态估计与最大后验估计

运动方程和观测方程

$$ \begin{cases} x_k=f(x_{k-1},u_k)+w_k\\ z_{k,j}=h(y_i,x_k)+v_{k,j} \end{cases} $$

$x_k$为相机位姿,用$\text{SE}(3)$描述

观测方程可以表示成:

$$ sz_{k,j}=K(R_ky_j+t_k) $$

$K$为相机内参,$s$为像素点距离(物体到镜头),被观测的物体发生$R_k$旋转和$t_k$平移

假设噪声$w_k,v_{k,j}$满足零均值高斯分布

$$ w_k\sim\mathcal{N}(0,R_k),v_k\sim\mathcal{N}(0,Q_{k,j}) $$

$\mathcal{N}$表示高斯分布,$0$表示零均值,$R_k,Q_{k,j}$表示协方差矩阵,在有噪声情况根据$z$和$u$推断位姿$x$和地图$y$,构成状态估计问题

两种方式:

  1. 用当前时刻估计来估计后来的数据,增量/渐进滤波器,扩展卡尔曼滤波(EKF)
  2. 批量一次性处理数据

折中方法:滑动窗口估计

考虑从$1$到$N$的所有时刻,假设有$M$个路标点。所有时刻机器人位姿和路标为

$$ x=\{x_1,\ldots,x_N\},\quad y=\{y_1,\ldots,y_M\} $$

用不带下标的$u$表示所有时刻输入,$z$表示所有时刻的观测数据,对机器人状态估计。已知输入数据$u$和观测数据$z$的条件下,求状态$x,y$的条件概率分布:

$$ P(x,y|z,u) $$

当输入数据不变,变为重建三维空间结构的问题,$P(x,y|z)$,Structure from Motion(SfM)

根据贝叶斯法则:

$$ P(x,y|z,u)=\frac{P(z,u|x,y)P(x,y)}{P(z,u)}\propto \sideset{}{}{\underbrace{P(z,u|x,y)}}_{似然} \space \sideset{}{}{\underbrace{P(x,y)}}_{先验} $$

未完

视觉里程计

特征点法

提取图像里面一些特别的地方

  • 角点:Harris、FAST、GFTT
  • 局部特征:SIFT、SURF、ORB(人工设计的特征点)

SIFT(尺度不变特征变换,Scale-Invariant Feature Transform)

ORB(Oriented FAST and Rotated BRIEF)

FAST关键点

  1. 选取像素$p$,假设亮度为$I_p$
  2. 设置阈值$T$(比如,$I_p$的20%)
  3. 以像素$p$为中心,选取半径为3的圆上16个像素点
  4. 假如选取的圆上有连续的$N$个点的亮度大于$I_p+T$或小于$I_p-T$,那么像素$p$可以被认为是特征点($N$ 通常取 12,即为 FAST-12。其他常用的$N$取值为 9 和 11,它们分别被称为 FAST-9 和 FAST-11)
  5. 循环以上四步,对每一个像素执行相同的操作

FAST-12算法更高效的排除不是角点的像素,在邻域圆上第1,5,9,13的像素,只有4个中有3个同时大于$I_p+T$或小于$I_p-T$,当前像素才有可能是角点

BRIEF描述子

特征匹配

  • 暴力匹配
  • 快速近似最临近(FLANN)

ORB特征

2D-2D:对极几何

对极约束

oFHq2R.png

如果特征点匹配正确,$O_1,p_1,P,O_2,p_2$为同一平面上,称为极平面(Epipolar plane),和像平面的交点$e_1,e_2$称为极点(Epipoles),$O_1O_2$称为基线(Baseline),$l_1,l_2$为极线(Epipolar line)

$$ P=[X,Y,Z]^T $$

两个像素点的位置为

$$ s_1p_1=KP,\quad s_2p_2=K(RP+t) $$

$s_1p_1$和$p_1$构成投影关系,齐次坐标意义下是相等的,成为尺度意义下的相等

$$ sp\simeq p $$

投影关系写作

$$ p_1\simeq KP,\quad p_2\simeq K(RP+t) $$

$$ x_1=K^{-1}p_1,\quad x_2=K^{-1}p_2 $$

带入上个公式

$$ x_2\simeq Rx_1+t $$

两边左乘$t^\wedge$,相当于两边和$t$外积

$$ t^\wedge x_2 = t^\wedge Rx_1 $$

两边左乘$x_2^T$

$$ x_2^Tt^\wedge x_2\simeq x_2^Tt^\wedge Rx_1 $$

左边$t^\wedge x_2$是和$t$和$x_2$垂直的向量,再做内积得到0,

$$ x_2^Tt^\wedge Rx_1=0 $$

代入$p_1,p_2$

$$ p_2^TK^{-T}t^\wedge RK^{-1}p_1=0 $$

称为对极约束,几何意义为$O_1,P,O_2$三者共面,把中间部分记为两个矩阵:基础矩阵(Fundamental Matrix)$F$和本质矩阵(Essential Matrix)$E$,简化为

$$ E=t^\wedge R,\quad F=K^{-T}EK^{-1}, \quad x_2^TEx_1=p_2^TFp_1=0 $$

位姿估计两步:

  1. 根据配对的像素点求出$E$或者$F$
  2. 根据$E$或者$F$求出$R,t$

本质矩阵

八点法求解$E$,$x_1=[u_1,v_1,1]^T,x_2=[u_2,v_2,1]^T$

$$ (u_2,v_2,1)\begin{pmatrix} e_1 & e_2 & e_3 \\ e_4 & e_5 & e_6 \\ e_7 & e_8 & e_9 \end{pmatrix}\begin{pmatrix} u_1 \\ v_1 \\ 1 \end{pmatrix} = 0 $$ $$ u_2u_1e_1+u_2v_1e_2+u_2e_3+u_1v_2e_4+v_1v_2e_5+v_2e_6+u_1e_7+v_1e_8+e_9=0 $$ $$ \left [u_2u_1,u_2v_1,u_2,u_1v_2,v_1v_2,v_2,u_1,v_1,1\right ]\cdot e=0 $$

放到方程组里面

$$ \begin{pmatrix} u_2^2u_1^2&u_2^2v_1^2&u_2^2&u_1^2v_2^2&v_1^2v_2^2&v_2^2&u_1^2&v_1^2&1\\ u_2^2u_1^2&u_2^2v_1^2&u_2^2&u_1^2v_2^2&v_1^2v_2^2&v_2^2&u_1^2&v_1^2&1\\ \vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots&\vdots\\ u_2^8u_1^8&u_2^8v_1^8&u_2^8&u_1^8v_2^8&v_1^8v_2^8&v_2^8&u_1^8&v_1^8&1 \end{pmatrix} = \begin{pmatrix} e_1\\ e_2\\ e_3\\ e_4\\ e_5\\ e_6\\ e_7\\ e_8 \end{pmatrix} = 0 $$

如果系数矩阵是满秩的(即秩为 8),那么它的零空间维数为 1

一个矩阵A列秩A的线性独立的纵列的极大数,通常表示为r(A),rk(A)或rank A,通常把满秩矩阵叫做可逆矩阵,det(A)≠0,不满秩的矩阵叫做奇异矩阵,det(A)=0

经过奇异值分解(SVD)

$$ E=U\Sigma V^T $$

$U,V$为正交矩阵,$\Sigma$为奇异值矩阵

奇异值分解(SVD)https://zhuanlan.zhihu.com/p/29846048

根据$E$的内在性质,$\Sigma=\text{diag}(\sigma,\sigma,0)$,在 SVD分解中,对于任意一个 E,存在两个可能的 $t,R$ 与它对应:

$$ \begin{align} t_1^\wedge=UR_Z(\frac{\pi}{2})\Sigma U^T, \quad R_1=UR_Z^T(\frac{\pi}{2})V^T\\ t_2^\wedge=UR_Z(-\frac{\pi}{2})\Sigma U^T, \quad R_2=UR_Z^T(-\frac{\pi}{2})V^T \end{align} $$

diag代表根据对角元素创建矩阵

$R_Z(\frac{\pi}{2})$表示沿 $Z$ 轴旋转 $90\degree$ 得到的旋转矩阵。由于$-E$和$E$等价,所以对任意一$t$取负号得到同样结果,因此,从$E$分解到$t,R$时存在4个可能的解

okR8gO.png

单应矩阵

场景中的特征点都落在同一平面(比如墙壁和地面等),平面方程满足

$$ n^TP+d=0 $$

$n$是平面法向量,$P$是世界坐标原点到P的向量,点积为负,加上原点到平面距离为0,整理后得到

$$ -\frac{n^TP}{d}=1 $$

代入运动方程:

$$ s_1p_1=KP,\quad s_2p_2=K(RP+t) $$ $$ \begin{align} p_2 &\simeq K(RP+t)\\ &\simeq K\left(RP+t\cdot\left(-\frac{n^TP}{d}\right)\right)\\ &\simeq K\left(R-\frac{tn^T}{d}\right)P\\ &\simeq K\left(R-\frac{tn^T}{d}\right)K^{-1}p_1 \end{align} $$

得到$p_1$和$p_2$之间的变换,记作$H$

$$ p_2\simeq Hp_1 $$

类似用矩阵元素方式表示

$$ \begin{pmatrix} u_2 \\ v_2 \\ 1 \end{pmatrix} = k\begin{pmatrix} h_1 & h_2 & h_3 \\ h_4 & h_5 & h_6 \\ h_7 & h_8 & h_9 \end{pmatrix}\begin{pmatrix} u_1 \\ v_1 \\ 1 \end{pmatrix} $$ $$ \begin{align} u_2=k(h_1u_1+h_2v_1+h_3)\\ v_2=k(h_4u_1+h_5v_1+h_6)\\ 1=k(h_7u_1+h_8v_1+h_9)\\ \end{align} $$

最后

$$ \begin{align} u_2=\frac{h_1u_1+h_2v_1+h_3}{h_7u_1+h_8v_1+h_9}\\ v_2=\frac{h_4u_1+h_5v_1+h_6}{h_7u_1+h_8v_1+h_9} \end{align} $$

通常乘以非零因子使得$h_9=1$,整理得:

$$ \begin{align} h_1u_1+h_2v_1+h_3-h_7u_1u_2-h_8v_1u_2=u_2\\ h_4u_1+h_5v_1+h_6-h_7u_1v_2-h_8v_1v_2=v_2 \end{align} $$

通过4对匹配特征点解线性方程组

$$ \begin{pmatrix} u_1^1 & v_1^1 & 1 & 0 & 0 & 0 & -u_1^1u_2^1 & -v_1^1u_2^1\\ 0 & 0 & 0 & u_1^1 & v_1^1 & 1 & -u_1^1v_2^1 & -v_1^1v_2^1\\ u_1^2 & v_1^2 & 1 & 0 & 0 & 0 & -u_1^2u_2^2 & -v_1^2u_2^2\\ 0 & 0 & 0 & u_1^2 & v_1^2 & 1 & -u_1^2v_2^2 & -v_1^2v_2^2\\ u_1^3 & v_1^3 & 1 & 0 & 0 & 0 & -u_1^3u_2^3 & -v_1^3u_2^3\\ 0 & 0 & 0 & u_1^3 & v_1^3 & 1 & -u_1^3v_2^3 & -v_1^3v_2^3\\ u_1^4 & v_1^4 & 1 & 0 & 0 & 0 & -u_1^4u_2^4 & -v_1^4u_2^4\\ 0 & 0 & 0 & u_1^4 & v_1^4 & 1 & -u_1^4v_2^4 & -v_1^4v_2^4 \end{pmatrix}\begin{pmatrix} h_1\\ h_2\\ h_3\\ h_4\\ h_5\\ h_6\\ h_7\\ h_8\\ \end{pmatrix}= \begin{pmatrix} u_2^1\\ v_2^1\\ u_2^2\\ v_2^2\\ u_2^3\\ v_2^3\\ u_2^4\\ v_2^4 \end{pmatrix} $$