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。
[ u x u y 1 ] = λ K [ R t ] [ x y z 1 ] \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. [ x y z 1 ] \left[\begin{array}{l} x \\ y \\ z \\ 1 \end{array}\right] 为上一帧特征点在世界坐标系下的坐标, P w P_w ;

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

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

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

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

1.DLT求解PnP

[ u x u y 1 ] = λ K [ R t ] [ x y z 1 ] = λ [ p 1 p 2 p 3 p 4 p 5 p 6 p 7 p 8 p 9 p 10 p 11 p 12 ] [ x y z 1 ] = λ [ p 0 T p 1 T p 2 T ] 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}

u x = p 0 T x p 2 T x , u y = p 1 T x p 2 T x { p 0 T x p 2 T x u x = 0 p 1 T x p 2 T x u y = 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.

[ x T 0 x T u x 0 x T x T u y ] [ p 0 p 1 p 2 ] = 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}

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

投影矩阵:
P = K [ R t ] = [ p 1 p 2 p 3 p 4 p 5 p 6 p 7 p 8 p 9 p 10 p 11 p 12 ] = [ p 0 T p 1 T p 2 T ] 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 [ R t ] = K [ R R c ] = [ M M c ] M = Q R K , R t \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

在这里插入图片描述

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

λ i y i λ j y j 2 = x i x j 2 = def a i j , \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 λ i 2 + λ j 2 2 b i j = a i j b i j = def y i T y j \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} i j i j i.e. {12,13,23}。此时,就只剩下 λ i \lambda_i 为变量。式中 b i j b_{ij} a i j a_{ij} 几何意义分别为,像素点 i i , j j 的投影光线夹角的余弦,三维点 x i x_i , x j x_j 之间的距离平方。如果3D不共线,则 a i j > 0 , i j a_{i j}>0, \forall i j

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

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

Λ M 12 Λ = a 12 , Λ M 13 Λ = a 13 , Λ M 23 Λ = a 23 \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}

其中: M 12 = ( 1 b 12 0 b 12 1 0 0 0 0 ) , M 13 = ( 1 0 b 13 0 0 0 b 13 0 1 ) , M 23 = ( 0 0 0 0 1 b 23 0 b 23 1 ) \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.两个齐次二次多项式

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

整体算法流程:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/fb_941219/article/details/107345422