- 本节直接法与上节特征点法,为视觉里程计估计位姿的两大主流方法。而在引出直接法前,先介绍光流法(二者均对灰度值 I 做文章)。
- 至此,前端VO总算结束了。学下来一个感受就是前几章的数学基础很重要,尤其是构建最小二乘的非线性优化(BA),几乎每种方法都有其一席之地。
一个在 t 时刻,位于(x , y) 处的像素,它的灰度可以写成 I ( x , y , t ) I(x,y,t) I(x,y,t),设其在(t+dt)时刻,运动到(x+dx,y+dy)处,则其灰度变为 I ( x + d x , y + d y , t + d t ) \boldsymbol{I}(x+\mathrm{d}x,y+\mathrm{d}y,t+\mathrm{d}t) I(x+dx,y+dy,t+dt)
把(t+dt)时刻的像素值进行泰勒展开 I ( x + d x , y + d y , t + d t ) ≈ I ( x , y , t ) + ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t I\left(x+\mathrm{d}x,y+\mathrm{d}y,t+\mathrm{d}t\right)\approx I\left(x,y,t\right)+\frac{\partial I}{\partial x}\mathrm{d}x+\frac{\partial I}{\partial y}\mathrm{d}y+\frac{\partial I}{\partial t}\mathrm{d}t I(x+dx,y+dy,t+dt)≈I(x,y,t)+∂x∂Idx+∂y∂Idy+∂t∂Idt由灰度不变假设可知, ∂ I ∂ x d x + ∂ I ∂ y d y + ∂ I ∂ t d t = 0 \frac{\partial\boldsymbol{I}}{\partial x}\mathrm{d}x+\frac{\partial\boldsymbol{I}}{\partial y}\mathrm{d}y+\frac{\partial\boldsymbol{I}}{\partial t}\mathrm{d}t=0 ∂x∂Idx+∂y∂Idy+∂t∂Idt=0移项、等式两边同除以dt得 ∂ I ∂ x d x d t + ∂ I ∂ y d y d t = − ∂ I ∂ t \frac{\partial\boldsymbol{I}}{\partial x}\frac{\mathrm{d}x}{\mathrm{d}t}+\frac{\partial\boldsymbol{I}}{\partial y}\frac{\mathrm{d}y}{\mathrm{d}t}=-\frac{\partial\boldsymbol{I}}{\partial t} ∂x∂Idtdx+∂y∂Idtdy=−∂t∂I其中, ∂ I ∂ x = I x , ∂ I ∂ y = I y \frac{\partial I}{\partial x}=I_x,\frac{\partial I}{\partial y}=I_y ∂x∂I=Ix,∂y∂I=Iy,分别是图像灰度值在该点处x和y方向上的梯度; d x d t = u \frac{\mathrm{d}x}{\mathrm{d}t}=u dtdx=u, d y d t = v \frac{\mathrm{d}y}{\mathrm{d}t}=v dtdy=v,分别是像素在x轴和y轴上的运动速度; ∂ I ∂ t = I t \frac{\partial I}{\partial t}=I_t ∂t∂I=It为图像灰度值对时间变化量。
把上式写成矩阵形式 [ I x I y ] [ u v ] = − I t \begin{bmatrix}I_x&&I_y\end{bmatrix}\begin{bmatrix}u\\\\v\end{bmatrix}=-\boldsymbol I_t [IxIy] uv =−It该矩阵方程是一个欠定方程组,存在自由度。根据前提2,有 w 2 {w^{2}} w2个方程,即变为超定方程。 [ I x I y ] k [ u v ] = − I t k , k = 1 , … , w 2 \begin{bmatrix}\boldsymbol{I}_x&\boldsymbol{I}_y\end{bmatrix}_k\begin{bmatrix}u\\\\v\end{bmatrix}=-\boldsymbol{I}_{tk},\quad k=1,\ldots,w^2 [IxIy]k uv =−Itk,k=1,…,w2解为 A [ u v ] = − b . [ u v ] ∗ = − ( A T A ) − 1 A T b . \begin{aligned}&A\begin{bmatrix}u\\\\v\end{bmatrix}=-b.\\\\&\begin{bmatrix}u\\\\v\end{bmatrix}^*=-\left(A^\mathrm{T}A\right)^{-1}A^\mathrm{T}b.\end{aligned} A uv =−b. uv ∗=−(ATA)−1ATb.
不需要特征点(关键点),也不用匹配,只要求有像素梯度即可。特征点法和光流法分两步:先匹配后估计位姿;直接法两步一块走,以位姿为优化变量,求最优解(目标函数为运动前后像素光度误差,也算间接匹配)。
我们的目标是求第一个相机到第二个相机的相对位姿变换。我们以第一个相机为参照系,设第二个相机的旋转和平移为R , t(对应李群为T)。同时,两相机的内参相同,记为K。 p 1 = [ u v 1 ] 1 = 1 Z 1 K P , \boldsymbol{p}_1=\begin{bmatrix}u\\\\v\\\\1\end{bmatrix}_1=\frac1{Z_1}KP, p1= uv1 1=Z11KP, p 2 = [ u v 1 ] 2 = 1 Z 2 K ( R P + t ) = 1 Z 2 K ( T P ) 1 : 3 \boldsymbol{p}_2=\begin{bmatrix}u\\\\v\\\\1\end{bmatrix}_2=\frac{1}{Z_2}\boldsymbol{K}\left(\boldsymbol{R}P+t\right)=\frac{1}{Z_2}\boldsymbol{K}\left(\boldsymbol{T}P\right)_{1:3} p2= uv1 2=Z21K(RP+t)=Z21K(TP)1:3构建优化函数,直接法中我们要求的是最小化光度误差,优化的参数是相机位姿T;特征点法中求的是最小化重投影误差,优化的参数也是相机位姿T. e = I 1 ( p 1 ) − I 2 ( p 2 ) . e=\boldsymbol{I}_1\left(\boldsymbol{p}_1\right)-\boldsymbol{I}_2\left(\boldsymbol{p}_2\right). e=I1(p1)−I2(p2). min T J ( T ) = ∥ e ∥ 2 . \min_TJ\left(\boldsymbol{T}\right)=\|e\|^2. TminJ(T)=∥e∥2. min T J ( T ) = ∑ i = 1 N e i T e i , e i = I 1 ( p 1 , i ) − I 2 ( p 2 , i ) . \min_{\boldsymbol{T}}J\left(\boldsymbol{T}\right)=\sum_{i=1}^{N}e_{i}^{\mathrm{T}}e_{i},\quad e_{i}=\boldsymbol{I}_{1}\left(\boldsymbol{p}_{1,i}\right)-\boldsymbol{I}_{2}\left(\boldsymbol{p}_{2,i}\right). TminJ(T)=i=1∑NeiTei,ei=I1(p1,i)−I2(p2,i).(注:此处得J不代表雅可比矩阵,仅为误差2范数的一个表示符号)
定义两个中间变量,q是P在第二个相机坐标系下的坐标,而u是在第二个相机像素坐标系下的像素坐标。 q = T P , u = 1 Z 2 K q . (此处 u 为上面的 p 2 即像素坐标, q 为其相机坐标) \begin{gathered}q=TP,\\u=\frac1{Z_2}Kq.\end{gathered}(此处u为上面的p2即像素坐标,q为其相机坐标) q=TP,u=Z21Kq.(此处u为上面的p2即像素坐标,q为其相机坐标) 由于优化的参数是位姿,所以要对位姿求导。P1的像素点坐标是固定的常数(不随位姿变化而改变),所以上式对位姿求导后变为 ∂ e ∂ T = ∂ I 1 ( p 1 ) − ∂ I 2 ( p 2 ) ∂ T = ∂ I 1 ( p 1 ) − ∂ I 2 ( u ) ∂ T = − ∂ I 2 ( u ) ∂ T \frac{\partial e}{\partial T}=\frac{\partial\boldsymbol{I}_1\left(\boldsymbol{p}_1\right)-\partial\boldsymbol{I}_2\left(\boldsymbol{p}_2\right)}{\partial T}=\frac{\partial\boldsymbol{I}_1\left(\boldsymbol{p}_1\right)-\partial\boldsymbol{I}_2\left(\boldsymbol{u}\right)}{\partial T}=-\frac{\partial\boldsymbol{I}_2\left(\boldsymbol{u}\right)}{\partial T} ∂T∂e=∂T∂I1(p1)−∂I2(p2)=∂T∂I1(p1)−∂I2(u)=−∂T∂I2(u)根据李代数的求导,我们选择左扰动模型(李群对加法不封闭,但李代数封闭),利用上面定义的中间变量,把u置换为位姿变化形式.( ∂ e ∂ T = ∂ e ∂ δ ξ {{}}{\frac{\partial e}{\partial T}}={\frac{\partial e}{\partial\delta\xi}} ∂T∂e=∂δξ∂e) ∂ e ( ξ ⊕ δ ξ ) ∂ δ ξ = − ∂ I 2 ( 1 Z 2 K exp ( δ ξ ∧ ) exp ( ξ ∧ ) P ) ∂ δ ξ ≈ − ∂ I 2 ( 1 Z 2 K ( 1 + δ ξ ∧ ) exp ( ξ ∧ ) P ) ∂ δ ξ = − ∂ I 2 ( 1 Z 2 K exp ( ξ ∧ ) P + 1 Z 2 K δ ξ ∧ exp ( ξ ∧ ) P ) ∂ δ ξ = − ∂ I 2 ( u + 1 Z 2 K δ ξ ∧ q ) ∂ δ ξ \begin{aligned} \frac{\partial e\left(\boldsymbol{\xi}\oplus\delta\boldsymbol{\xi}\right)}{\partial\delta\boldsymbol{\xi}}& =-\frac{\partial\boldsymbol{I}_2\left(\frac1{Z_2}\boldsymbol{K}\exp\left(\delta\boldsymbol{\xi}^\wedge\right)\exp\left(\boldsymbol{\xi}^\wedge\right)\boldsymbol{P}\right)}{\partial\boldsymbol{\delta}\boldsymbol{\xi}} \\ &\approx-\frac{\partial I_2\left(\frac1{Z_2} K\left(1+\delta\xi^\wedge\right)\exp\left(\xi^\wedge\right)P\right)}{\partial\boldsymbol{\delta}\boldsymbol{\xi}} \\ &=-\frac{\partial I_2\left(\frac1{Z_2} K\exp\left(\xi^{\wedge}\right)P+\frac1{Z_2} K\delta\xi^{\wedge}\exp\left(\xi^{\wedge}\right)P\right)}{\partial\delta\xi} \\ &=-\frac{\partial I_2\left(u+\frac1{Z_2}K\delta\xi^\wedge q\right)}{\partial\boldsymbol{\delta\xi}} \end{aligned} ∂δξ∂e(ξ⊕δξ)=−∂δξ∂I2(Z21Kexp(δξ∧)exp(ξ∧)P)≈−∂δξ∂I2(Z21K(1+δξ∧)exp(ξ∧)P)=−∂δξ∂I2(Z21Kexp(ξ∧)P+Z21Kδξ∧exp(ξ∧)P)=−∂δξ∂I2(u+Z21Kδξ∧q)其中,≈处运用了指数的泰勒一阶展示, 1 Z 2 K δ ξ ∧ q \frac{1}{Z_{2}} K\delta\xi^{\wedge}q Z21Kδξ∧q是像素点位置变化量, δ ξ \delta\xi δξ/ δ ξ ∧ \delta\xi^{\wedge} δξ∧均为扰动量的李代数形式(实际中不做详细区分)。
把 I 2 ( p 2 ) I_{2}\left(p_{2}\right) I2(p2)在 p 2 = u p_{2}=u p2=u处泰勒一阶展开 I 2 ( u + 1 Z 2 K δ ξ ∧ q ) ≈ I 2 ( u ) + ∂ I 2 ∂ δ ξ δ ξ I_2\left(u+\frac{1}{Z_2} K\delta\xi^\wedge q\right)\approx I_2\left(u\right)+\frac{\partial I_2}{\partial\delta\xi} \delta\xi I2(u+Z21Kδξ∧q)≈I2(u)+∂δξ∂I2δξ接着上面的推导,可得 ∂ e ∂ δ ξ = − ∂ I 2 ( u + 1 Z 2 K δ ξ ∧ q ) ∂ δ ξ = − ∂ ( I 2 ( u ) + ∂ I 2 ∂ δ ξ δ ξ ) ∂ δ ξ = 0 − ∂ I 2 ∂ δ ξ \begin{gathered} \frac{\partial e}{\partial\boldsymbol{\delta\xi}}=-\frac{\partial I_2\left(u+\frac1{Z_2} K\delta\xi^\wedge q\right)}{\partial\boldsymbol{\delta\xi}} \\ =-\frac{\partial(I_{2}\left(u\right)+\frac{\partial I_{2}}{\partial\delta\xi}\delta\xi)}{\partial\boldsymbol{\delta\xi}} \\ =0-\frac{\partial I_2}{\partial\delta\xi} \end{gathered} ∂δξ∂e=−∂δξ∂I2(u+Z21Kδξ∧q)=−∂δξ∂(I2(u)+∂δξ∂I2δξ)=0−∂δξ∂I2根据求导的链式法则 ∂ e ∂ T = − ∂ I 2 ∂ u ∂ u ∂ q ∂ q ∂ δ ξ \frac{\partial e}{\partial\boldsymbol{T}}=-\frac{\partial\boldsymbol{I}_2}{\partial\boldsymbol{u}}\frac{\partial\boldsymbol{u}}{\partial\boldsymbol{q}}\frac{\partial\boldsymbol{q}}{\partial\delta\boldsymbol{\xi}} ∂T∂e=−∂u∂I2∂q∂u∂δξ∂q关于 ∂ e ∂ T \frac{\partial e}{\partial T} ∂T∂e直接化为 I 2 I_{2} I2的偏导,不用上述推导也可以想明白(因为以p1为参考,扰动在p2中)
优点如下:
缺点如下: