Lambda Twist: An Accurate Fast Robust Perspective Three Point (P3P) Solver

Lambda Twist: An Accurate Fast Robust Perspective Three Point (P3P)Solver

0.引言

特征点的3D可以由三角化或者RGBD相机获取。因此双目或RGBD的视觉里程计中可以直接使用PnP估计相机运动,而在单目视觉里程计中,必须先进行初始化然后才能使用PnP。
[uxuy1]=λK[Rt][xyz1]\left[\begin{array}{c} u_{x} \\ u_{y} \\ 1 \end{array}\right]=\lambda K \cdot\left[\begin{array}{ll} R & t \end{array}\right]\left[\begin{array}{l} x \\ y \\ z \\ 1 \end{array}\right]
首先需要弄清楚,3D-2D求解的结果是什么?

  • 1.[xyz1]\left[\begin{array}{l} x \\ y \\ z \\ 1 \end{array}\right]为上一帧特征点在世界坐标系下的坐标,PwP_w;

  • 2.[R,t][R,t]为world系到camera系的变换TcwT_{cw};

  • 3.KK为相机内参,[uxuy1]\left[\begin{array}{c} u_{x} \\ u_{y} \\ 1 \end{array}\right]为下一帧的像素坐标系,λ\lambda为相机坐标系下的逆深度;

  • 4.怎么求两帧之间的相对位姿变换?
    a.把上一帧当做世界坐标系
    b.TC1C2=TWC11TWC2T_{C_1C_2} = T_{WC_1}^{-1}T_{WC_2}

即是,PnP只能求解当前帧到世界坐标系下的变换,要求取前后帧的变换,还需要经过一次转换。同时需要注意的是,wcwc是更常用的!

1.DLT求解PnP

[uxuy1]=λK[Rt][xyz1]=λ[p1p2p3p4p5p6p7p8p9p10p11p12][xyz1]=λ[p0Tp1Tp2T]x\left[\begin{array}{c} u_{x} \\ u_{y} \\ 1 \end{array}\right]=\lambda K \cdot\left[\begin{array}{ll} R & t \end{array}\right]\left[\begin{array}{l} x \\ y \\ z \\ 1 \end{array}\right]=\lambda\left[\begin{array}{cccc} p_{1} & p_{2} & p_{3} & p_{4} \\ p_{5} & p_{6} & p_{7} & p_{8} \\ p_{9} & p_{10} & p_{11} & p_{12} \end{array}\right]\left[\begin{array}{c} x \\ y \\ z \\ 1 \end{array}\right]=\lambda\left[\begin{array}{c} \boldsymbol{p}_{0}^{T} \\ \boldsymbol{p}_{1}^{T} \\ \boldsymbol{p}_{2}^{T} \end{array}\right] \mathbf{x}

ux=p0Txp2Tx,uy=p1Txp2Tx{p0Txp2Txux=0p1Txp2Txuy=0\Rightarrow u_{x}=\frac{\boldsymbol{p}_{0}^{T} \mathbf{x}}{\boldsymbol{p}_{2}^{T} \mathbf{x}}, u_{y}=\frac{\boldsymbol{p}_{1}^{T} \mathbf{x}}{\boldsymbol{p}_{2}^{T} \mathbf{x}} \Rightarrow\left\{\begin{array}{l} \boldsymbol{p}_{0}^{T} \mathbf{x}-\boldsymbol{p}_{2}^{T} \mathbf{x} \cdot u_{x}=0 \\ \boldsymbol{p}_{1}^{T} \mathbf{x}-\boldsymbol{p}_{2}^{T} \mathbf{x} \cdot u_{y}=0 \end{array}\right.

[xT0xTux0xTxTuy][p0p1p2]=0\Rightarrow\left[\begin{array}{ccc} \mathbf{x}^{T} & 0 & -\mathbf{x}^{T} u_{x} \\ 0 & \mathbf{x}^{T} & -\mathbf{x}^{T} u_{y} \end{array}\right]\left[\begin{array}{c} \boldsymbol{p}_{0} \\ \boldsymbol{p}_{1} \\ \boldsymbol{p}_{2} \end{array}\right]=\boldsymbol{0}

齐次最小二成得到[p0p1p2]\left[\begin{array}{l} \boldsymbol{p}_{0} \\ \boldsymbol{p}_{1} \\ \boldsymbol{p}_{2} \end{array}\right]

投影矩阵:
P=K[Rt]=[p1p2p3p4p5p6p7p8p9p10p11p12]=[p0Tp1Tp2T]P=K \cdot[R t]=\left[\begin{array}{cccc} p_{1} & p_{2} & p_{3} & p_{4} \\ p_{5} & p_{6} & p_{7} & p_{8} \\ p_{9} & p_{10} & p_{11} & p_{12} \end{array}\right]=\left[\begin{array}{c} \boldsymbol{p}_{0}^{T} \\ \boldsymbol{p}_{1}^{T} \\ \boldsymbol{p}_{2}^{T} \end{array}\right]

P=K[Rt]=K[RRc]=[MMc]M=QRK,Rt\begin{array}{l} P=K \cdot[R t]=K \cdot[R-R c]=[M-M c] \\ M=Q R \Rightarrow K, R \Rightarrow t \end{array}

2.P3P求解

参考十四讲.

3.Lambda Twist

Lambda Twist: An Accurate Fast Robust Perspective Three Point (P3P) Solver

λiyi=Rxi+t,i{1,2,3}\lambda_{i} \boldsymbol{y}_{i}=\mathbf{R} \boldsymbol{x}_{i}+\boldsymbol{t}, i \in\{1,2,3\}
其中,xix_i为3D点,yiy_i为2D点。同时将yiy_i归一化处理:yi=1\left|\boldsymbol{y}_{i}\right|=1。则有:
λiyiλjyj=R(xixj),\lambda_{i} \boldsymbol{y}_{i}-\lambda_{j} \boldsymbol{y}_{j}=\mathbf{R}\left(\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right),\Rightarrow

λiyiλjyj2=xixj2=defaij,\left|\lambda_{i} \boldsymbol{y}_{i}-\lambda_{j} \boldsymbol{y}_{j}\right|^{2}=\left|\boldsymbol{x}_{i}-\boldsymbol{x}_{j}\right|^{2} \stackrel{\text {def}}{=} a_{i j},\Rightarrowλi2+λj22bij=aijbij=defyiTyj\begin{array}{l} \lambda_{i}^{2}+\lambda_{j}^{2}-2 b_{i j}=a_{i j} \\ b_{i j} \stackrel{\text {def}}{=} \boldsymbol{y}_{i}^{T} \boldsymbol{y}_{j} \end{array}iji j i.e. {12,13,23}。此时,就只剩下λi\lambda_i为变量。式中bijb_{ij}aija_{ij}几何意义分别为,像素点ii,jj的投影光线夹角的余弦,三维点xix_i,xjx_j之间的距离平方。如果3D不共线,则aij>0,ija_{i j}>0, \forall i j

3.1.三个非齐次二次多项式

上式中深度参数λi\lambda_i的约束可以表达为:

ΛM12Λ=a12,ΛM13Λ=a13,ΛM23Λ=a23\boldsymbol{\Lambda}^{\top} \mathbf{M}_{12} \boldsymbol{\Lambda}=a_{12}, \quad \boldsymbol{\Lambda}^{\top} \mathbf{M}_{13} \boldsymbol{\Lambda}=a_{13}, \quad \boldsymbol{\Lambda}^{\top} \mathbf{M}_{23} \boldsymbol{\Lambda}=a_{23}

其中:M12=(1b120b1210000),M13=(10b13000b1301),M23=(00001b230b231)\mathbf{M}_{12}=\left(\begin{array}{ccc} 1 & -b_{12} & 0 \\ -b_{12} & 1 & 0 \\ 0 & 0 & 0 \end{array}\right), \mathbf{M}_{13}=\left(\begin{array}{rcc} 1 & 0 & -b_{13} \\ 0 & 0 & 0 \\ -b_{13} & 0 & 1 \end{array}\right), \mathbf{M}_{23}=\left(\begin{array}{ccc} 0 & 0 & 0 \\ 0 & 1 & -b_{23} \\ 0 & -b_{23} & 1 \end{array}\right)

此时只关注当λi>0\lambda_i>0时的解。同时舍去复数解,λ1,λ2,λ3>0\lambda_{1}, \lambda_{2}, \lambda_{3}>0.

3.2.两个齐次二次多项式

公式太多了,就不重复造*了,看论文吧。

整体算法流程:

Lambda Twist: An Accurate Fast Robust Perspective Three Point (P3P) Solver