ORB-SLAM学习——EPnP算法

论文:EPnP: Accurate Non-Iterative O(n) Solution to the PnP Problem

参考资料:

[1] Lepetit V , Moreno-Noguer F , Fua P . EPnP: An AccurateO(n) Solution to the PnP Problem[J]. international journal of computer vision, 2009, 81(2):155-166.

[2] PnP问题之EPnP解法

[3] EPnP算法

[4] 一起学ORBSLAM2(9)ORBSLAM的PNP解决方案

问题模型

已知世界坐标下的 n n n个3D点,以及它们在一张图像上对应的2D像素点,还有相机的内参数。

求解相机坐标系到世界坐标系的 R \mathbf{R} R, t \mathbf{t} t.

按照高翔博士在《视觉SLAM十四讲》中的阐述,该问题属于PnP问题,即3D到2D点对运动的求解问题。

EPnP方法求解

(1)一般情况的参数化

​ 定义世界坐标系下的 n n n个3D点:
p i , i = 1 , . . . , n (1) p_i,\quad i=1,...,n \tag{1} pi,i=1,...,n(1)
​ 定义世界坐标系下的4个控制点:
c j , j = 1 , . . . , 4 (2) c_j,\quad j=1,...,4 \tag{2} cj,j=1,...,4(2)
​ 世界坐标系下的三维点可以用4个控制点的线性组合表示:

p i w = ∑ j = 1 4 α i j c j w  with  ∑ j = 1 4 α i j = 1 \mathbf{p}_{i}^{w}=\sum_{j=1}^{4} \alpha_{i j} \mathbf{c}_{j}^{w} \quad \text { with } \quad \sum_{j=1}^{4} \alpha_{i j}=1 piw=j=14αijcjw with j=14αij=1
其中的 α i j \alpha_{i j} αij 称为均质重心坐标( homogeneous barycentric coordinates), 一组 [ α i 1 , α i 2 , α i 3 , α i 4 ] \left[\alpha_{i 1}, \alpha_{i 2}, \alpha_{i 3}, \alpha_{i 4}\right] [αi1,αi2,αi3,αi4] 能够唯一地确定对应的三维点 p i p_{i} pi, 因此世界坐标系下 p i w p_{i}^{w } piw可以表示成如下齐次坐标公式:
[ p i w 1 ] = [ c 1 w c 2 w c 3 w c 4 w 1 1 1 1 ] [ α i 1 α i 2 α i 3 α i 4 ] = C [ α i 1 α i 2 α i 3 α i 4 ] \left[\begin{array}{c} \mathbf{p}_{i}^{w} \\ 1 \end{array}\right]=\left[\begin{array}{cccc} \mathbf{c}_{1}^{w} & \mathbf{c}_{2}^{w} & \mathbf{c}_{3}^{w} & \mathbf{c}_{4}^{w} \\ 1 & 1 & 1 & 1 \end{array}\right]\left[\begin{array}{l} \alpha_{i 1} \\ \alpha_{i 2} \\ \alpha_{i 3} \\ \alpha_{i 4} \end{array}\right]=\mathbf{C}\left[\begin{array}{l} \alpha_{i 1} \\ \alpha_{i 2} \\ \alpha_{i 3} \\ \alpha_{i 4} \end{array}\right] [piw1]=[c1w1c2w1c3w1c4w1]αi1αi2αi3αi4=Cαi1αi2αi3αi4
假设此时相机在世界坐标系下的位姿为 [ R , t ] [R, t] [R,t], 4个控制点可以从世界坐标系转到相机坐标系下:
c j c = [ R ∣ t ] [ c j w 1 ] \mathbf{c}_{j}^{c}=[\mathbf{R} \mid \mathbf{t}]\left[\begin{array}{c} \mathbf{c}_{j}^{w} \\ 1 \end{array}\right] cjc=[Rt][cjw1]
同理,世界坐标系下的三维点 p i w p_{i}^{w} piw 也能转到相机坐标系下并与4个控制点产生关联:
p i c = [ R ∣ t ] [ p i w 1 ] = [ R ∣ t ] [ ∑ j = 1 4 α i j c j w ∑ j = 1 4 α i j ] = ∑ j = 1 4 α i j [ R , t ] [ c j w 1 ] = ∑ j = 1 4 α i j c j c \mathbf{p}_{i}^{c}=[\mathbf{R} \mid \mathbf{t}]\left[\begin{array}{c}\mathbf{p}_{i}^{w} \\ 1\end{array}\right]=[\mathbf{R} \mid \mathbf{t}]\left[\begin{array}{c}\sum_{j=1}^{4} \alpha_{i j} \mathbf{c}_{j}^{w} \\ \sum_{j=1}^{4} \alpha_{i j}\end{array}\right]=\sum_{j=1}^{4} \alpha_{i j}[\mathbf{R}, \mathbf{t}]\left[\begin{array}{c}\mathbf{c}_{j}^{w} \\ 1\end{array}\right]=\sum_{j=1}^{4} \alpha_{i j} \mathbf{c}_{j}^{c} pic=[Rt][piw1]=[Rt][j=14αijcjwj=14αij]=j=14αij[R,t][cjw1]=j=14αijcjc

经过上面的参数化定义,可以发现一个重要特点:HB坐标 α i j \alpha_{ij} αij在世界坐标系和相机坐标系的数值是相同的,那么假如我们能够通过世界坐标系下的三维点求解出各个点的 [ α i 1 , α i 2 , α i 3 , α i 4 ] [\alpha_{i1},\alpha_{i2},\alpha_{i3},\alpha_{i4}] [αi1,αi2,αi3,αi4],我们即可通过上式求出相机坐标系下的4个控制点坐标,后面求解相机在世界坐标系下的位姿问题,就转变为:已知 c c c^c cc c w c^w cw,求解两组空间三维点间的位姿变换(3D-3D),理所当然可以使用ICP方法求解。

(2)控制点的选择- -choose_control_points()函数

第一个控制点 c 1 w c_1^w c1w需要选择观察点集 { p i , i = 1 , . . . , n } \{p_i,\quad i=1,...,n\} {pi,i=1,...,n}的质心:
c 1 w = 1 n ∑ i = 1 n p i w \mathbf{c}_{1}^{w}=\frac{1}{n} \sum_{i=1}^{n} \mathbf{p}_{i}^{w} c1w=n1i=1npiw
计算其它三个控制点, c 2 w , c 3 w , c 4 w c_2^w,c_3^w,c_4^w c2w,c3w,c4w通过PCA分解得到,定义 n × 3 n\times 3 n×3维矩阵A:
A = [ ( p 1 w − c 1 w ) ⊤ ( p 2 w − c 1 w ) ⊤ ⋮ ( p n w − c 1 w ) ⊤ ] \mathbf{A}=\left[\begin{array}{c} \left(\mathbf{p}_{1}^{w}-\mathbf{c}_{1}^{w}\right)^{\top} \\ \left(\mathbf{p}_{2}^{w}-\mathbf{c}_{1}^{w}\right)^{\top} \\ \vdots \\ \left(\mathbf{p}_{n}^{w}-\mathbf{c}_{1}^{w}\right)^{\top} \end{array}\right] A=(p1wc1w)(p2wc1w)(pnwc1w)
利用SVD分解获得 A T A A^TA ATA的主分量(注:主成分分析概念点击参考网址),类似齐次线性最小二乘法求解的过程,从而获取 A T A A^TA ATA的特征值 [ λ 1 , λ 2 , λ 3 ] [\lambda_1,\lambda_2,\lambda_3] [λ1,λ2,λ3]及其对应的特征向量 v 1 , v 2 , v 3 \mathbf{v_1},\mathbf{v_2},\mathbf{v_3} v1,v2,v3,所以剩下的三个控制点 c 2 w , c 3 w , c 4 w c_2^w,c_3^w,c_4^w c2w,c3w,c4w分别是:
{ c 2 w = = c 1 w + λ 1 n v 1 c 3 w = c 1 w + λ 2 n v 2 c 4 w = c 1 w + λ s n v 3 \left\{\begin{array}{l} \mathbf{c}_{2}^{w=}=\mathbf{c}_{1}^{w}+\sqrt{\frac{\lambda_{1}}{n}} \mathbf{v}_{\mathbf{1}} \\ \mathbf{c}_{3}^{w}=\mathbf{c}_{1}^{w}+\sqrt{\frac{\lambda_{2}}{n}} \mathbf{v}_{2} \\ \mathbf{c}_{4}^{w}=\mathbf{c}_{1}^{w}+\sqrt{\frac{\lambda_{s}}{n}} \mathbf{v}_{3} \end{array}\right. c2w==c1w+nλ1 v1c3w=c1w+nλ2 v2c4w=c1w+nλs v3
确定4个控制点具体坐标后,将观察点集 { p i , i = 1 , . . . , n } \{p_i,\quad i=1,...,n\} {pi,i=1,...,n}转到HB坐标系下:
[ α i 1 α i 2 α i 3 α i 4 ] = C − 1 [ p i w 1 ] \left[\begin{array}{c} \alpha_{i 1} \\ \alpha_{i 2} \\ \alpha_{i 3} \\ \alpha_{i 4} \end{array}\right]=\mathbf{C}^{-1}\left[\begin{array}{c} \mathbf{p}_{i}^{w} \\ 1 \end{array}\right] αi1αi2αi3αi4=C1[piw1]

(3)求控制点在相机坐标系的坐标c j c _{j}^{c} jc

由相机的投影棋型:
s [ u i 1 ] = K p i c = K ∑ j = 1 4 α i j c j c s\left[\begin{array}{c} \mathbf{u}_{i} \\ 1 \end{array}\right]=\mathbf{K} \mathbf{p}_{i}^{c}=\mathbf{K} \sum_{j=1}^{4} \alpha_{i j} c_{j}^{c} s[ui1]=Kpic=Kj=14αijcjc
矩阵参数貝体化:
s [ u i v i 1 ] = [ f u 0 u c 0 f v v c 0 0 1 ] ∑ j = 1 4 α i j [ x j c y j e z j e ] s\left[\begin{array}{c} u_{i} \\ v_{i} \\ 1 \end{array}\right]=\left[\begin{array}{ccc} f_{u} & 0 & u_{c} \\ 0 & f_{v} & v_{c} \\ 0 & 0 & 1 \end{array}\right] \sum_{j=1}^{4} \alpha_{i j}\left[\begin{array}{l} x_{j}^{c} \\ y_{j}^{e} \\ z_{j}^{e} \end{array}\right] suivi1=fu000fv0ucvc1j=14αijxjcyjezje
上式可以消去 s s s后得到两个线性方程:

∑ j = 1 4 ( α i j f u x j c + α i j ( u c − u i ) z j c ) = 0 ∑ j = 1 4 ( α i j f v y j c + α i j ( v c − v i ) z j c ) = 0 \begin{aligned} \sum_{j=1}^{4}\left(\alpha_{i j} f_{u} x_{j}^{c}+\alpha_{i j}\left(u_{c}-u_{i}\right) z_{j}^{c}\right) &=0 \\ \sum_{j=1}^{4}\left(\alpha_{i j} f_{v} y_{j}^{c}+\alpha_{i j}\left(v_{c}-v_{i}\right) z_{j}^{c}\right) &=0 \end{aligned} j=14(αijfuxjc+αij(ucui)zjc)j=14(αijfvyjc+αij(vcvi)zjc)=0=0
其中 α i j \boldsymbol{\alpha}_{i \boldsymbol{j}} αij, 相机内部参数, [ u i , v i ] \left[\boldsymbol{u}_{i}, \boldsymbol{v}_{\boldsymbol{i}}\right] [ui,vi] 为已知量,未知量为控制点在相机坐标系下的坐标 [ x j c , y j c , z j c ] \left[x_{j}^{c}, y_{j}^{c}, z_{j}^{c}\right] [xjc,yjc,zjc]。 把所有的 n n n 个相机坐标系下的观察点都串联起来,得到线性方程:
M x = 0 \mathbf{M x}=\mathbf{0} Mx=0
展开矩阵M有:
[ α 11 f u 0 α 11 ( u c − u 1 ) … α 14 f u 0 α 14 ( u c − u 1 ) 0 α 11 f v α 11 ( v c − v 1 ) … 0 α 14 f v α 14 ( v c − v 1 ) ⋮ ⋮ ⋮ α n 1 f u 0 α n 1 ( u c − u n ) … α n 4 f u 0 α n 4 ( u c − u n ) 0 α n 1 f v α n 1 ( v c − v n ) … 0 α n 4 f v α n 4 ( v c − v n ) ] [ x 1 c y 1 c z 1 c ⋮ x 4 c y 4 c z 4 c ] = 0 \left[\begin{array}{ccccccc} \alpha_{11} f_{u} & 0 & \alpha_{11}\left(u_{c}-u_{1}\right) & \ldots & \alpha_{14} f_{u} & 0 & \alpha_{14}\left(u_{c}-u_{1}\right) \\ 0 & \alpha_{11} f_{v} & \alpha_{11}\left(v_{c}-v_{1}\right) & \ldots & 0 & \alpha_{14} f_{v} & \alpha_{14}\left(v_{c}-v_{1}\right) \\ \vdots & & & & \vdots & & \vdots \\ \alpha_{n 1} f_{u} & 0 & \alpha_{n 1}\left(u_{c}-u_{n}\right) & \ldots & \alpha_{n 4} f_{u} & 0 & \alpha_{n 4}\left(u_{c}-u_{n}\right) \\ 0 & \alpha_{n 1} f_{v} & \alpha_{n 1}\left(v_{c}-v_{n}\right) & \ldots & 0 & \alpha_{n 4} f_{v} & \alpha_{n 4}\left(v_{c}-v_{n}\right) \end{array}\right]\left[\begin{array}{c} x_{1}^{c} \\ y_{1}^{c} \\ z_{1}^{c} \\ \vdots \\ x_{4}^{c} \\ y_{4}^{c} \\ z_{4}^{c} \end{array}\right]=\mathbf{0} α11fu0αn1fu00α11fv0αn1fvα11(ucu1)α11(vcv1)αn1(ucun)αn1(vcvn)α14fu0αn4fu00α14fv0αn4fvα14(ucu1)α14(vcv1)αn4(ucun)αn4(vcvn)x1cy1cz1cx4cy4cz4c=0
上式中未知量 x = [ c 1 c T , c 2 c T , c 3 c T , c 4 c T ] T \mathbf{x}=\left[c_{1}^{c T}, c_{2}^{c T}, c_{3}^{c T}, c_{4}^{c T}\right]^{T} x=[c1cT,c2cT,c3cT,c4cT]T 是12维向量, M M M 2 n × 12 2 n \times 12 2n×12 维矩阵,它的解可以表达为
x = ∑ i = 1 N β i v i \mathbf{x}=\sum_{i=1}^{N} \beta_{i} \mathbf{v}_{i} x=i=1Nβivi
其中12维向量 V i \mathbf{V}_{i} Vi M \mathbf{M} M 的右奇异向量(不知道为啥ORB-SLAM代码里取的是左奇异向量), 对应 的奇异值为 0 0 0。 具体的求解步骤为:求解 M ⊤ M \mathbf{M}^{\top} \mathbf{M} MM 的特征值和特征向量,特征值为0的特征向量为 V i \mathbf{V}_{i} Vi

根据约束 ∣ ∣ c i c − c j c ∣ ∣ 2 = ∣ ∣ c i w − c j w ∣ ∣ 2 ||\mathbf{c}^c_i-\mathbf{c}^c_j||^2=||\mathbf{c}^w_i-\mathbf{c}^w_j||^2 ciccjc2=ciwcjw2 ,求解 β k \beta_k βk。其中 ∣ ∣ c i w − c j w ∣ ∣ 2 ||\mathbf{c}^w_i-\mathbf{c}^w_j||^2 ciwcjw2为世界坐标系下4个控制点之间的距离的平方,可以直接直接计算出来,是一个6维( C 4 2 = 6 C_4^2=6 C42=6)的向量。 N N N M T M M^TM MTM的0特征值的个数,根据论文描述,由于尺度不确定性,因此 N N N的维度至少为1,而且如果相机是正投影而不是仿射变换,则 N N N的维度变为4,因此如果焦距很小的话就只有1个0特征值,如果焦距长度越来越大,他就越趋向于正投影, N N N的维度就慢慢趋向于4,而由于有噪声的原因,特征值可能不是完全是0,而是一个足够小的数。在ORB-SLAM中计算了 N = 1 − 4 N=1-4 N=14的所有可能,然后计算反投影误差取最小的反投影误差对应的 N N N值作为正确的 N N N


a. 论文中的解法:

下面是Copy自:https://zhuanlan.zhihu.com/p/59070440

Case N = 1 N =1 N=1

这是最简单的情况,上式这时变成了 x = β v \mathbf{x}=\beta\mathbf{v} x=βv。这时候把控制点在摄像机坐标系和世界坐标系的坐标联系起来:控制点间距在两种坐标系之下是相等的
∥ c i c − c j c ∥ 2 = ∥ c i w − c j w ∥ ∥ 2 \left\|\mathbf{c}_{i}^{c}-\mathbf{c}_{j}^{c}\right\|^{2}=\left\|\mathbf{c}_{i}^{w}-\mathbf{c}_{j}^{w \|}\right\|^{2} ciccjc2=ciwcjw2
由此,引入一个约束。
∥ β v [ θ ] − β v [ j ∥ 2 = ∥ c i w − c j w ∥ 2 \left\|\beta \mathbf{v}^{[\theta]}-\beta \mathbf{v}^{[j}\right\|^{2}=\left\|c_{i}^{w}-c_{j}^{w}\right\|^{2} βv[θ]βv[j2=ciwcjw2
其中, v [ i ] \mathbf{v}^{[i]} v[i]表示 v \mathbf{v} v中第 i i i个控制点所占据的3个元素组成的向量。4个控制点,可以得到 β \beta β的一个闭式解。


Case N = 2 \boldsymbol{N}=\mathbf{2} N=2
此时,上式变为 x = β 1 v 1 + β 2 v 2 \mathbf{x}=\boldsymbol{\beta}_{1} \mathbf{v}_{1}+\beta_{2} \mathbf{v}_{\mathbf{2}} x=β1v1+β2v2, 带入 (12) 式
∥ ( β 1 v 1 [ 1 + β 2 v 2 [ i ] ) − ( β 1 v 1 [ j + β 2 v 2 [ j ] ) ∥ 2 = ∥ c i w − c j w ∥ 2 \left\|\left(\beta_{1} \mathbf{v}_{1}^{[1}+\beta_{2} \mathbf{v}_{2}^{[i]}\right)-\left(\beta_{1} \mathbf{v}_{1}^{[j}+\beta_{2} \mathbf{v}_{2}^{[j]}\right)\right\|^{2}=\left\|\mathbf{c}_{i}^{w}-\mathbf{c}_{j}^{w}\right\|^{2} (β1v1[1+β2v2[i])(β1v1[j+β2v2[j])2=ciwcjw2
将上式展开
∥ β 1 ( v 1 [ d − v 1 [ j ] ) ⏟ s 1 + β 2 ( v 2 [ i ] − v 2 [ j ] ) ⏟ s 2 ∥ 2 = ∥ c i w − c j u ∥ 2 ⏟ c β 1 2 S 1 T S 1 + 2 β 1 β 2 S 1 T S 2 + β 2 2 S 2 T S 2 = c \begin{array}{c} \|\beta_{1} \underbrace{\left(\mathbf{v}_{1}^{[\mathbf{d}}-\mathbf{v}_{1}^{[j]}\right)}_{\mathbf{s}_{1}}+\beta_{2} \underbrace{\left(\mathbf{v}_{2}^{[i]}-\mathbf{v}_{2}^{[j]}\right)}_{\mathbf{s}_{2}}\|^{2}=\underbrace{\left\|\mathbf{c}_{i}^{w}-\mathbf{c}_{j}^{u}\right\|^{2}}_{c} \\ \beta_{1}{ }^{2} \mathbf{S}_{1}^{T} \mathbf{S}_{1}+2 \beta_{1} \beta_{2} \mathbf{S}_{1}^{T} \mathbf{S}_{2}+\beta_{2}{ }^{2} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{2}=c \end{array} β1s1 (v1[dv1[j])+β2s2 (v2[i]v2[j])2=c ciwcju2β12S1TS1+2β1β2S1TS2+β22S2TS2=c
引入三个中间变量
β 11 = β 1 2 , β 22 = β 22 2 , β 12 = β 1 β 2 \beta_{11}=\beta_{1}^{2}, \beta_{22}=\beta_{22}^{2}, \beta_{12}=\beta_{1} \beta_{2} β11=β12,β22=β222,β12=β1β2
上式就变成了线性方程(中间变量法,可以将非线性方程转换成线性方程解算)。4个控制点可以构造出6个线性方程,组成
L β = ρ \mathbf{L} \boldsymbol{\beta}=\boldsymbol{\rho} Lβ=ρ
其中, β = [ β 11 , β 12 , β 22 ] T , L \boldsymbol{\beta}=\left[\beta_{11}, \beta_{12}, \beta_{22}\right]^{T}, \mathbf{L} β=[β11,β12,β22]T,L 中为 式子左边的系救,大小为 6 × 3 。 ρ \mathbf{6} \times \mathbf{3}。 \boldsymbol{\rho} 6×3ρ 中为式子右边的系數, 大小为 6 × 1 \mathbf{6} \times \mathbf{1} 6×1。 解出 β \boldsymbol{\beta} β 后, 可以获得两组 β 1 , β 2 \boldsymbol{\beta}_{\mathbf{1}}, \boldsymbol{\beta}_{2} β1,β2的解。再加上一个条件,控制点在摄像机的前端,即 c j c \mathbf{c}^c_j cjc z \mathbf{z} z分量要大于0,从而 β 1 , β 2 \boldsymbol{\beta}_{\mathbf{1}}, \boldsymbol{\beta}_{2} β1,β2唯一确定。


Case N = 3 \boldsymbol{N}=\mathbf{3} N=3
Case N = 2 \boldsymbol{N}=\mathbf{2} N=2 的解法相同, 这里的 β = [ β 11 , β 12 , β 13 , β 22 , β 23 , β 33 ] T , L \boldsymbol{\beta}=\left[\beta_{11}, \beta_{12}, \beta_{13}, \beta_{22}, \beta_{23}, \beta_{33}\right]^{\boldsymbol{T}}, \mathbf{L} β=[β11,β12,β13,β22,β23,β33]T,L的大小为 6 × 6 \mathbf{6} \times \mathbf{6} 6×6

case N = 4 \boldsymbol{N}=\mathbf{4} N=4
再次使用Case N = 2 \boldsymbol{N}=\mathbf{2} N=2的解法试一下,第 i i i个控制点在相机坐标系下的坐标可表示为:
c i c = β 1 v 1 [ i ] + β 2 v 2 [ i ] + β 3 v 3 [ i ] + β 4 v 4 [ i ] \mathbf{c}_{i}^{c}=\beta_{1} \mathbf{v}_{1}^{[i]}+\beta_{2} \mathbf{v}_{2}^{[i]}+\beta_{3} \mathbf{v}_{3}^{[i]}+\beta_{4} \mathbf{v}_{4}^{[i]} cic=β1v1[i]+β2v2[i]+β3v3[i]+β4v4[i]
将其代入约束等式中
∥ β 1 v 1 [ i ] + β 2 v 2 [ i ] + β 3 v 3 [ i ] + β 4 v 4 [ i ] − ( β 1 v 1 [ j ] + β 2 v 2 [ j ] + β 3 v 3 [ j ] + β 4 v 4 [ j ] ) ∥ 2 = ∥ c i c − c j c ∥ 2 \left\|\beta_{1} \mathbf{v}_{1}^{[i]}+\beta_{2} \mathbf{v}_{2}^{[i]}+\beta_{3} \mathbf{v}_{3}^{[i]}+\beta_{4} \mathbf{v}_{4}^{[i]}-\left(\beta_{1} \mathbf{v}_{1}^{[j]}+\beta_{2} \mathbf{v}_{2}^{[j]}+\beta_{3} \mathbf{v}_{3}^{[j]}+\beta_{4} \mathbf{v}_{4}^{[j]}\right)\right\|^{2}=\left\|\mathbf{c}_{i}^{c}-\mathbf{c}_{j}^{c}\right\|^{2} β1v1[i]+β2v2[i]+β3v3[i]+β4v4[i](β1v1[j]+β2v2[j]+β3v3[j]+β4v4[j])2=ciccjc2
这样的约束等式有6条, 将6条等式以矩阵形式表达
L 6 × 10 β 10 × 1 = ρ 6 × 1 \mathbf{L}_{6 \times 10} \boldsymbol{\beta}_{10 \times 1}=\boldsymbol{\rho}_{6 \times 1} L6×10β10×1=ρ6×1
其中 β = [ β 11 , β 12 , β 22 , β 13 , β 23 , β 33 , β 14 , β 24 , β 34 , β 44 ] ⊤ \boldsymbol{\beta}=\left[\beta_{11}, \beta_{12}, \beta_{22}, \beta_{13}, \beta_{23}, \beta_{33}, \beta_{14}, \beta_{24}, \beta_{34}, \beta_{44}\right]^{\top} β=[β11,β12,β22,β13,β23,β33,β14,β24,β34,β44]
β i j = β i β j , L \beta_{i j}=\beta_{i} \beta_{j}, \quad \mathbf{L} βij=βiβj,L 的大小为 6 × 10 6 \times 10 6×10, 将其中一条约束等式展开如下
∥ β 1 v 1 [ i ] + β 2 v 2 [ i ] + β 3 v 3 [ i ] + β 4 v 4 [ i ] − ( β 1 v 1 [ j ] + β 2 v 2 [ j ] + β 3 v 3 [ j ] + β 4 v 4 [ j ] ) ∥ 2 \left\|\beta_{1} \mathbf{v}_{1}^{[i]}+\beta_{2} \mathbf{v}_{2}^{[i]}+\beta_{3} \mathbf{v}_{3}^{[i]}+\beta_{4} \mathbf{v}_{4}^{[i]}-\left(\beta_{1} \mathbf{v}_{1}^{[j]}+\beta_{2} \mathbf{v}_{2}^{[j]}+\beta_{3} \mathbf{v}_{3}^{[j]}+\beta_{4} \mathbf{v}_{4}^{[j]}\right)\right\|^{2} β1v1[i]+β2v2[i]+β3v3[i]+β4v4[i](β1v1[j]+β2v2[j]+β3v3[j]+β4v4[j])2
= ∥ β 1 ( v 1 [ i ] − v 1 [ j ] ) ⏟ s 1 + β 2 ( v 2 [ i ] − v 2 [ j ] ) ⏟ s 2 + β 3 ( v 3 [ i ] − v 3 [ j ] ) ⏟ s 3 + β 4 ( v 4 [ i ] − v 4 [ j ] ) ⏟ s 4 ∥ 2 =\|\beta_{1} \underbrace{\left(\mathbf{v}_{1}^{[i]}-\mathbf{v}_{1}^{[j]}\right)}_{\mathbf{s}_{1}}+\beta_{2} \underbrace{\left(\mathbf{v}_{2}^{[i]}-\mathbf{v}_{2}^{[j]}\right)}_{\mathbf{s}_{2}}+\beta_{3} \underbrace{\left(\mathbf{v}_{3}^{[i]}-\mathbf{v}_{3}^{[j]}\right)}_{\mathbf{s}_{3}}+\beta_{4} \underbrace{\left(\mathbf{v}_{4}^{[i]}-\mathbf{v}_{\mathbf{4}}^{[j]}\right)}_{\mathbf{s}_{4}}\|^{2} =β1s1 (v1[i]v1[j])+β2s2 (v2[i]v2[j])+β3s3 (v3[i]v3[j])+β4s4 (v4[i]v4[j])2
= β 11 s 1 ⊤ s 1 + 2 β 12 s 1 ⊤ s 2 + β 22 s 2 ⊤ s 2 + 2 β 13 s 1 ⊤ s 3 + 2 β 23 s 2 ⊤ s 3 + β 33 s 3 ⊤ s 3 + =\beta_{11} \mathbf{s}_{1}^{\top} \mathbf{s}_{1}+2 \beta_{12} \mathbf{s}_{1}^{\top} \mathbf{s}_{2}+\beta_{22} \mathbf{s}_{2}^{\top} \mathbf{s}_{2}+2 \beta_{13} \mathbf{s}_{1}^{\top} \mathbf{s}_{3}+2 \beta_{23} \mathbf{s}_{2}^{\top} \mathbf{s}_{3}+\beta_{33} \mathbf{s}_{3}^{\top} \mathbf{s}_{3}+ =β11s1s1+2β12s1s2+β22s2s2+2β13s1s3+2β23s2s3+β33s3s3+
2 β 14 s 1 ⊤ s 4 + 2 β 24 s 2 ⊤ s 4 + 2 β 34 s 3 ⊤ s 4 + β 44 s 4 ⊤ s 4 \mathbf{2} \beta_{14} \mathbf{s}_{1}^{\top} \mathbf{s}_{4}+2 \beta_{24} \mathbf{s}_{2}^{\top} \mathbf{s}_{4}+2 \beta_{34} \mathbf{s}_{3}^{\top} \mathbf{s}_{4}+\beta_{44} \mathbf{s}_{4}^{\top} \mathbf{s}_{4} 2β14s1s4+2β24s2s4+2β34s3s4+β44s4s4
显然,由于未知数 β 10 × 1 \mathbf{\beta}_{10 \times 1} β10×1是10维向量,但是我们只能找到6条约束等式,因此无法得到唯一解。这次,就不能直接使用Case N = 2 , N = 3 \boldsymbol{N}=\mathbf{2},\boldsymbol{N}=\mathbf{3} N=2,N=3的解法了。因为,方程的数量少于待求解变量。看一下中间变量法,引入中间变量的同时,也增加了变量的个数。比如,Case N = 3 \boldsymbol{N}=\mathbf{3} N=3的时候,引入中间变量后,变量个数由3个变成了6个。多出了3个变量 β a b \beta_{ab} βab。原文[1]提到,再引入约束,使用"Reinearization"的方法求解。(好难的~~~看不懂)

b. ORB-SLAM解法(其实ORB-SLAM是搬了OpenCV求解EPnP的代码)

它是用一种近似求解的方法,虽然原理看不懂, 但是实现起来非常简单
近似求解 β 1 , β 2 , β 3 , β 4 \beta_{1}, \beta_{2}, \beta_{3}, \beta_{4} β1,β2,β3,β4, 记 L = [ l 1 , l 2 , l 3 , l 4 , l 5 , l 6 , l 7 , l 8 , l 9 , l 10 ] \mathbf{L}=\left[\mathbf{l}_{1}, \mathbf{l}_{2}, \mathbf{l}_{3}, \mathbf{l}_{4}, \mathbf{l}_{5}, \mathbf{l}_{6}, \mathbf{l}_{7}, \mathbf{l}_{8}, \mathbf{l}_{9}, \mathbf{l}_{10}\right] L=[l1,l2,l3,l4,l5,l6,l7,l8,l9,l10], 也就
是把 L \mathbf{L} L 写成了列向量的形式。
[ l 1 , l 2 , l 3 , l 4 , l 5 , l 6 , l 7 , l 8 , l 9 , l 10 ] [ β 11 β 12 β 22 β 13 β 23 β 33 β 14 β 24 β 34 β 44 ] = ρ \left[\mathbf{l}_{1}, \mathbf{l}_{2}, \mathbf{l}_{3}, \mathbf{l}_{4}, \mathbf{l}_{5}, \mathbf{l}_{6}, \mathbf{l}_{7}, \mathbf{l}_{8}, \mathbf{l}_{9}, \mathbf{l}_{10}\right]\left[\begin{array}{c} \beta_{11} \\ \beta_{12} \\ \beta_{22} \\ \beta_{13} \\ \beta_{23} \\ \beta_{33} \\ \beta_{14} \\ \beta_{24} \\ \beta_{34} \\ \beta_{44} \end{array}\right]=\boldsymbol{\rho} [l1,l2,l3,l4,l5,l6,l7,l8,l9,l10]β11β12β22β13β23β33β14β24β34β44=ρ
Case N = 4 \boldsymbol{N}=\mathbf{4} N=4
β 11 l 1 + β 12 l 2 + β 13 l 4 + β 14 l 7 = ρ \beta_{11} \mathbf{l}_{1}+\beta_{12} \mathbf{l}_{2}+\beta_{13} \mathbf{l}_{4}+\beta_{14} \mathbf{l}_{7}=\boldsymbol{\rho} β11l1+β12l2+β13l4+β14l7=ρ
Case N = 2 \boldsymbol{N}=\mathbf{2} N=2
β 11 l 1 + β 12 l 2 + β 22 l 3 = ρ \beta_{11} \mathbf{l}_{1}+\beta_{12} \mathbf{l}_{2}+\beta_{22} \mathbf{l}_{3}=\boldsymbol{\rho} β11l1+β12l2+β22l3=ρ
Case N = 3 \boldsymbol{N}=\mathbf{3} N=3
β 11 l 1 + β 12 l 2 + β 22 l 3 + β 13 l 4 + β 23 l 5 = ρ \beta_{11} \mathbf{l}_{1}+\beta_{12} \mathbf{l}_{2}+\beta_{22} \mathbf{l}_{3}+\beta_{13} \mathbf{l}_{4}+\beta_{23} \mathbf{l}_{5}=\rho β11l1+β12l2+β22l3+β13l4+β23l5=ρ
Case N = 1 \boldsymbol{N}=\mathbf{1} N=1
最简单的情况, 跟论文方法一样求闭式解,可以根据以上三种方法求得, β 1 , β 2 , β 3 , β 4 \beta_{1}, \beta_{2}, \beta_{3}, \beta_{4} β1,β2,β3,β4 的初值, 值得一提的是, N = 1 , 2 , 3 \boldsymbol{N}=\mathbf{1}, \mathbf{2}, \mathbf{3} N=1,2,3 的情况中, 剩余的 β \boldsymbol{\beta} β 直接补 0

通过以上任一种方法都能求得 β 1 , β 2 , β 3 , β 4 \beta_1, \beta_2, \beta_3,\beta_4 β1,β2,β3,β4初值,它的数值直接影响到最终求解到的相机位姿的精度,因此我们需要使用高斯牛顿法对其进行进一步优化提高精度:

​ 可以再次利用前面的控制点间距约束等式来获取优化残差项:
展开式子:
β ∗ = arg ⁡ min ⁡ β ∑ ( i , j ) ,  s.t.  i < j ∥ Error ⁡ i , j ( β ) ∥ 2  Error  i , j ( β ) = ∥ c i c − c j c ∥ 2 ⏟ c c − ∥ c i w − c j w ∥ 2 ⏟ c w \begin{array}{l} \begin{aligned} \boldsymbol{\beta}^{*}=\underset{\boldsymbol{\beta}}{\arg \min } \sum_{(i, j), \text { s.t. } i<j}\left\|\operatorname{Error}_{i, j}(\boldsymbol{\beta})\right\|^{2} \\ \text { Error }_{i, j}(\boldsymbol{\beta})=\underbrace{\left\|\mathbf{c}_{i}^{c}-\mathbf{c}_{j}^{c}\right\|^{2}}_{c c}-\underbrace{\left\|\mathbf{c}_{i}^{w}-\mathbf{c}_{j}^{w}\right\|^{2}}_{c w} \end{aligned}\\ \end{array} β=βargmin(i,j), s.t. i<jErrori,j(β)2 Error i,j(β)=cc ciccjc2cw ciwcjw2
展开式子:
c c = ∥ ( β 1 v 1 [ i ] + β 2 v 2 [ i ] + β 3 v 3 [ i ] + β 4 v 4 [ i ] ) − ( β 1 v 1 [ j ] + β 2 v 2 [ j ] + β 3 v 3 [ j ] + β 4 v 4 [ j ] ) ∥ 2 = ∥ β 1 ( v 1 [ i ] − v 1 [ j ] ) ⏟ s 1 + β 2 ( v 2 [ i ] − v 2 [ j ] ) ⏟ S 2 + β 3 ( v 3 [ i ] − v 3 [ j ] ) ⏟ s 3 + β 4 ( v 4 [ i ] − v 4 [ j ] ) ⏟ s 4 ∥ 2 \begin{aligned} c c &=\left\|\left(\beta_{1} \mathbf{v}_{1}^{[i]}+\beta_{2} \mathbf{v}_{2}^{[i]}+\beta_{3} \mathbf{v}_{3}^{[i]}+\beta_{4} \mathbf{v}_{4}^{[i]}\right)-\left(\beta_{1} \mathbf{v}_{1}^{[j]}+\beta_{2} \mathbf{v}_{2}^{[j]}+\beta_{3} \mathbf{v}_{3}^{[j]}+\beta_{4} \mathbf{v}_{4}^{[j]}\right)\right\|^{2} \\ &=\|\beta_{1} \underbrace{\left(\mathbf{v}_{1}^{[i]}-\mathbf{v}_{1}^{[j]}\right)}_{\mathbf{s}_{1}}+\beta_{2} \underbrace{\left(\mathbf{v}_{2}^{[i]}-\mathbf{v}_{2}^{[j]}\right)}_{\mathbf{S}_{2}}+\beta_{3} \underbrace{\left(\mathbf{v}_{3}^{[i]}-\mathbf{v}_{3}^{[j]}\right)}_{\mathbf{s}_{3}}+\beta_{4} \underbrace{\left(\mathbf{v}_{4}^{[i]}-\mathbf{v}_{4}^{[j]}\right)}_{\mathbf{s}_{4}}\|^{2} \end{aligned} cc=(β1v1[i]+β2v2[i]+β3v3[i]+β4v4[i])(β1v1[j]+β2v2[j]+β3v3[j]+β4v4[j])2=β1s1 (v1[i]v1[j])+β2S2 (v2[i]v2[j])+β3s3 (v3[i]v3[j])+β4s4 (v4[i]v4[j])2
= β 1 2 S 1 T S 1 + β 1 β 2 S 1 T S 2 + β 1 β 3 S 1 T S 3 + β 1 β 4 S 1 T S 4 + β 1 β 2 S 2 T S 1 + β 2 2 S 2 T S 2 + β 2 β 3 S 2 T S 3 + β 2 β 4 S 2 T S 4 + β 1 β 3 S 3 T S 1 + β 2 β 3 S 3 T S 2 + β 3 2 S 3 T S 3 + β 3 β 4 S 3 T S 4 + β 1 β 4 S 4 T S 1 + β 2 β 4 S 4 T S 2 + β 3 β 4 S 4 T S 3 + β 4 2 S 4 T S 4 = β 1 2 S 1 T S 1 + 2 β 1 β 2 S 1 T S 2 + 2 β 1 β 3 S 1 T S 3 + 2 β 1 β 4 S 1 T S 4 + β 2 2 S 2 T S 2 + 2 β 2 β 3 S 2 T S 3 + 2 β 2 β 4 S 2 T S 4 + β 3 2 S 3 T S 3 + 2 β 3 β 4 S 3 T S 4 + β 4 2 S 4 T S 4 \begin{array}{l} =\beta_{1}^{2} \mathbf{S}_{1}^{T} \mathbf{S}_{1}+\beta_{1} \beta_{2} \mathbf{S}_{1}^{T} \mathbf{S}_{2}+\beta_{1} \beta_{3} \mathbf{S}_{1}^{T} \mathbf{S}_{3}+\beta_{1} \beta_{4} \mathbf{S}_{1}^{T} \mathbf{S}_{4} \\ +\beta_{1} \beta_{2} \mathbf{S}_{2}^{T} \mathbf{S}_{1}+\beta_{2}{ }^{2} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{2}+\beta_{2} \beta_{3} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{3}+\beta_{2} \beta_{4} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{4} \\ +\beta_{1} \beta_{3} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{1}+\beta_{2} \beta_{3} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{2}+\beta_{3}{ }^{2} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{3}+\beta_{3} \beta_{4} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{4} \\ +\beta_{1} \beta_{4} \mathbf{S}_{4}{ }^{T} \mathbf{S}_{1}+\beta_{2} \beta_{4} \mathbf{S}_{4}{ }^{T} \mathbf{S}_{2}+\beta_{3} \beta_{4} \mathbf{S}_{4}{ }^{T} \mathbf{S}_{3}+\beta_{4}{ }^{2} \mathbf{S}_{4}{ }^{T} \mathbf{S}_{4} \\ =\beta_{1}{ }^{2} \mathbf{S}_{1}{ }^{T} \mathbf{S}_{1}+2 \beta_{1} \beta_{2} \mathbf{S}_{1}{ }^{T} \mathbf{S}_{2}+2 \beta_{1} \beta_{3} \mathbf{S}_{1}{ }^{T} \mathbf{S}_{3}+2 \beta_{1} \beta_{4} \mathbf{S}_{1}^{T} \mathbf{S}_{4} \\ +\beta_{2}{ }^{2} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{2}+2 \beta_{2} \beta_{3} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{3}+2 \beta_{2} \beta_{4} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{4} \\ +\beta_{3}{ }^{2} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{3}+2 \beta_{3} \beta_{4} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{4} \\ +\beta_{4}{ }^{2} \mathbf{S}_{4}{ }^{T} \mathbf{S}_{4} \end{array} =β12S1TS1+β1β2S1TS2+β1β3S1TS3+β1β4S1TS4+β1β2S2TS1+β22S2TS2+β2β3S2TS3+β2β4S2TS4+β1β3S3TS1+β2β3S3TS2+β32S3TS3+β3β4S3TS4+β1β4S4TS1+β2β4S4TS2+β3β4S4TS3+β42S4TS4=β12S1TS1+2β1β2S1TS2+2β1β3S1TS3+2β1β4S1TS4+β22S2TS2+2β2β3S2TS3+2β2β4S2TS4+β32S3TS3+2β3β4S3TS4+β42S4TS4

利用Gauss-Newton法进行非线性优化时,需要求残差项Error( β \beta β)对于参数项 β \beta β的雅克比矩阵:
J i , j = ∂ [ Error ⁡ i , j ( β ) ] ∂ β = [ 2 β 1 S 1 T S 1 + 2 β 2 S 1 T S 2 + 2 β 3 S 1 T S 3 + 2 β 4 S 1 T S 4 2 β 1 S 1 T S 2 + 2 β 2 S 2 T S 2 + 2 β 3 S 2 T S 3 + 2 β 4 S 2 T S 4 2 β 1 S 1 T S 3 + 2 β 2 S 2 T S 3 + 2 β 3 S 3 T S 3 + 2 β 4 S 3 T S 4 2 β 1 S 1 T S 4 + 2 β 2 S 2 T S 4 + 2 β 3 S 3 T S 4 + 2 β 4 S 4 T S 4 ] \begin{aligned} \mathbf{J}_{i, j}=& \frac{\partial\left[\operatorname{Error}_{i, j}(\beta)\right]}{\partial \beta} \\ &=\left[\begin{array}{l} 2 \beta_{1} \mathbf{S}_{1}^{T} \mathbf{S}_{1}+2 \beta_{2} \mathbf{S}_{1}^{T} \mathbf{S}_{2}+2 \beta_{3} \mathbf{S}_{1}^{T} \mathbf{S}_{3}+2 \beta_{4} \mathbf{S}_{1}^{T} \mathbf{S}_{4} \\ 2 \beta_{1} \mathbf{S}_{1}{ }^{T} \mathbf{S}_{2}+2 \beta_{2} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{2}+2 \beta_{3} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{3}+2 \beta_{4} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{4} \\ 2 \beta_{1} \mathbf{S}_{1}{ }^{T} \mathbf{S}_{3}+2 \beta_{2} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{3}+2 \beta_{3} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{3}+2 \beta_{4} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{4} \\ 2 \beta_{1} \mathbf{S}_{1}{ }^{T} \mathbf{S}_{4}+2 \beta_{2} \mathbf{S}_{2}{ }^{T} \mathbf{S}_{4}+2 \beta_{3} \mathbf{S}_{3}{ }^{T} \mathbf{S}_{4}+2 \beta_{4} \mathbf{S}_{4}{ }^{T} \mathbf{S}_{4} \end{array}\right] \end{aligned} Ji,j=β[Errori,j(β)]=2β1S1TS1+2β2S1TS2+2β3S1TS3+2β4S1TS42β1S1TS2+2β2S2TS2+2β3S2TS3+2β4S2TS42β1S1TS3+2β2S2TS3+2β3S3TS3+2β4S3TS42β1S1TS4+2β2S2TS4+2β3S3TS4+2β4S4TS4
将六个小雅克比 J i , j \boldsymbol{J}_{i, j} Ji,j 合成为 6 × 4 \mathbf{6} \times \mathbf{4} 6×4 的大雅克比
J = [ J 1 , 2 J 1 , 3 J 1 , 4 J 2 , 3 J 2 , 4 J 3 , 4 ] \mathbf{J}=\left[\begin{array}{l} \mathbf{J}_{1,2} \\ \mathbf{J}_{1,3} \\ \mathbf{J}_{1,4} \\ \mathbf{J}_{2,3} \\ \mathbf{J}_{2,4} \\ \mathbf{J}_{3,4} \end{array}\right] J=J1,2J1,3J1,4J2,3J2,4J3,4
记残差为
r = [ Error ⁡ 1 , 2 ( β ) Error ⁡ 1 , 3 ( β ) Error ⁡ 1 , 4 ( β ) Error ⁡ 2 , 3 ( β ) Error ⁡ 2 , 4 ( β ) Error ⁡ 3 , 4 ( β ) ] \mathbf{r}=\left[\begin{array}{c} \operatorname{Error}_{1,2}(\boldsymbol{\beta}) \\ \operatorname{Error}_{1,3}(\boldsymbol{\beta}) \\ \operatorname{Error}_{1,4}(\boldsymbol{\beta}) \\ \operatorname{Error}_{2,3}(\boldsymbol{\beta}) \\ \operatorname{Error}_{2,4}(\boldsymbol{\beta}) \\ \operatorname{Error}_{3,4}(\boldsymbol{\beta}) \end{array}\right] r=Error1,2(β)Error1,3(β)Error1,4(β)Error2,3(β)Error2,4(β)Error3,4(β)
那么,增量方程为
J T J δ β = − J T r ( 22 ) \mathbf{J}^{T} \mathbf{J} \delta \beta=-\mathbf{J}^{T} \mathbf{r}(\mathbf{2} 2) JTJδβ=JTr(22)
使用QR分解求解线性方程组,得到增量 δ β \delta \beta δβ,更新方程
β = β + δ β ( 23 ) \boldsymbol{\beta}=\boldsymbol{\beta}+\boldsymbol{\delta} \boldsymbol{\beta}(\mathbf{2 3}) β=β+δβ(23)

(4)计算相机位姿

  • 计算控制点在相机坐标系下的坐标 :
    c i c = ∑ j = 1 N β k v k [ i ] , i = 1 , 2 , 3 , 4 \mathbf{c}_{i}^{c}=\sum_{j=1}^{N} \beta_{k} \mathbf{v}_{k}^{[i]}, i=1,2,3,4 cic=j=1Nβkvk[i],i=1,2,3,4
  • 计算3D参考点在相机参考坐标系的坐标。
    p i c = ∑ j = 1 4 α i j c j c \mathbf{p}_{i}^{c}=\sum_{j=1}^{4} \alpha_{i j} \mathbf{c}_{j}^{c} pic=j=14αijcjc
  • 计算 { p i w } i = 1 , 2 , … , n \left\{\mathbf{p}_{i}^{w}\right\}_{i=1,2, \ldots, n} {piw}i=1,2,,n 的重心 p 0 w \mathbf{p}_{0}^{w} p0w 和矩阵 A \mathbf{A} A
    p 0 w = 1 n ∑ i = 1 n p i w A = [ ( p 1 w − p 0 w ) ⊤ ( p 2 w − p 0 w ) ⊤ ⋮ ( p n w − p 0 w ) ⊤ ] \begin{array}{c} \mathbf{p}_{0}^{w}=\frac{1}{n} \sum_{i=1}^{n} \mathbf{p}_{i}^{w} \\ \mathbf{A}=\left[\begin{array}{c} \left(\mathbf{p}_{1}^{w}-\mathbf{p}_{0}^{w}\right)^{\top} \\ \left(\mathbf{p}_{2}^{w}-\mathbf{p}_{0}^{w}\right)^{\top} \\ \vdots \\ \left(\mathbf{p}_{n}^{w}-\mathbf{p}_{0}^{w}\right)^{\top} \end{array}\right] \end{array} p0w=n1i=1npiwA=(p1wp0w)(p2wp0w)(pnwp0w)
  • 计算 { p i c } i = 1 , 2 , … , n \left\{\mathbf{p}_{i}^{c}\right\}_{i=1,2, \ldots, n} {pic}i=1,2,,n 的重心 p 0 c \mathbf{p}_{0}^{c} p0c 和矩阵 B \mathbf{B} B.
    p 0 c = 1 n ∑ i = 1 n p i c \mathbf{p}_{0}^{c}=\frac{1}{n} \sum_{i=1}^{n} \mathbf{p}_{i}^{c} p0c=n1i=1npic
    B = [ ( p 1 c − p 0 c ) ⊤ ( p 2 c − p 0 c ) ⊤ ⋮ ( p n c − p 0 c ) ⊤ ] \mathbf{B}=\left[\begin{array}{c} \left(\mathbf{p}_{1}^{c}-\mathbf{p}_{0}^{c}\right)^{\top} \\ \left(\mathbf{p}_{2}^{c}-\mathbf{p}_{0}^{c}\right)^{\top} \\ \vdots \\ \left(\mathbf{p}_{n}^{c}-\mathbf{p}_{0}^{c}\right)^{\top} \end{array}\right] B=(p1cp0c)(p2cp0c)(pncp0c)
  • 计算矩阵
    H = B ⊤ A \mathbf{H}=\mathbf{B}^{\top} \mathbf{A} H=BA
  • 计算 H \mathbf{H} H 的SVD分解:
    H = U Σ V ⊤ \mathbf{H}=\mathbf{U} \mathbf{\Sigma} \mathbf{V}^{\top} H=UΣV
  • 计算旋转 R \mathbf{R} R
    R = U V ⊤ \mathbf{R}=\mathbf{U} \mathbf{V}^{\top} R=UV
    如果 ∣ R ∣ < 0 |\mathbf{R}|<\mathbf{0} R<0, 那么 R ( 2 , : ) = − R ( 2 , : ) \mathbf{R}(2,:)=-\mathbf{R}(\mathbf{2},:) R(2,:)=R(2,:)
  • 计算位姿中的平移 t \mathbf{t} t
    t = p 0 c − R p 0 w \mathbf{t}=\mathbf{p}_{0}^{c}-\mathbf{R} \mathbf{p}_{0}^{w} t=p0cRp0w
    在ORB-SLAM2方案中,会在当前帧中随机选取多组观测点(每组4个点),将其放入EPnP求解器中求解出相机当前在世界坐标系下的位姿,然后通过RANSAC算法选取最优的一组位姿,并且剔除外点,具体请参考ORB-SLAM源代码.
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值