针对map_frame到camera_frame的转换的问题,打算采用基于PNP的ORB_SLAM2,故有必要对PNP好好回顾一下。
1,P3P
在 SLAM 当中,通常的做法是先使用 P3P/EPnP 等方法估计相机位姿,然后构建最小二乘优化问题对估计值进行调整(Bundle Adjustment)。
顾名思义,P3P仅仅使用3对匹配点,如图
由余弦定理可知
x
2
+
y
2
−
2
x
y
c
o
s
⟨
a
,
b
⟩
=
A
B
2
/
O
C
2
y
2
+
1
−
2
y
c
o
s
⟨
b
,
c
⟩
=
B
C
2
/
O
C
2
x
2
+
1
−
2
x
c
o
s
⟨
a
,
c
⟩
=
A
C
2
/
O
C
2
x^{2}+ y^{2} − 2xy cos ⟨a, b⟩ = AB^{2}/OC^{2} \\ y ^{2}+ 1 − 2y cos ⟨b, c⟩ = BC^{2} /OC^{2}\\ x ^{2}+ 1 − 2x cos ⟨a, c⟩ = AC^{2} /OC^{2}\\
x2+y2−2xycos⟨a,b⟩=AB2/OC2y2+1−2ycos⟨b,c⟩=BC2/OC2x2+1−2xcos⟨a,c⟩=AC2/OC2
第二个公式和第三个公式分别除第一个公式,得到
(
1
−
u
)
y
2
−
u
x
2
−
c
o
s
⟨
b
,
c
⟩
y
+
2
u
x
y
c
o
s
⟨
a
,
b
⟩
+
1
=
0
(
1
−
w
)
x
2
−
w
y
2
−
c
o
s
⟨
a
,
c
⟩
x
+
2
w
x
y
c
o
s
⟨
a
,
b
⟩
+
1
=
0
(1 − u) y 2 − ux 2 − cos ⟨b, c⟩ y + 2uxy cos ⟨a, b⟩ + 1 = 0 \\ (1 − w) x 2 − wy 2 − cos ⟨a, c⟩ x + 2wxy cos ⟨a, b⟩ + 1 = 0\\
(1−u)y2−ux2−cos⟨b,c⟩y+2uxycos⟨a,b⟩+1=0(1−w)x2−wy2−cos⟨a,c⟩x+2wxycos⟨a,b⟩+1=0
其中
x
=
O
A
/
O
C
x=OA/OC
x=OA/OC待求
y
=
O
B
/
O
C
y=OB/OC
y=OB/OC待求
u
=
B
C
2
/
A
B
2
u=BC^{2}/AB^{2}
u=BC2/AB2已知
w
=
A
C
2
/
A
B
2
w=AC^{2}/AB^{2}
w=AC2/AB2已知
使用吴消元法解出,比较复杂,但是有现成的包,可以快速的求解出来。最后得出在当前相机坐标系下面,landmark的3D坐标。两个问题
- P3P 只利用三个点的信息。当给定的配对点多于 3 组时,难以利用更多的信息。
- 如果 3D 点或 2D 点受噪声影响,或者存在误匹配,则算法失效。
2,EPnP
EPnP 更加复杂,需要明确几个概念
1,参考点与控制点
参考点是指用于参与到相机坐标系下坐标求解的点
控制点是EPnP 的特定的一个概念,由
c
i
c_i
ci
i
=
1
,
2
,
3
,
4
i=1,2,3,4
i=1,2,3,4表示。参考点与控制点的关系为
p
i
w
=
∑
j
=
1
4
α
i
j
c
j
w
,
w
i
t
h
∑
j
=
1
4
α
i
j
=
1
p_i^w=∑_{j=1}^4α_{ij}c_j^w, with ∑_{j=1}^4α_{ij}=1
piw=∑j=14αijcjw,with∑j=14αij=1
p
i
c
=
∑
j
=
1
4
α
i
j
c
j
c
p_i^c=∑_{j=1}^4α_{ij}c_j^c
pic=∑j=14αijcjc
2,Barycentric Coordinates
这个指的是
α
i
j
α_{ij}
αij,由于参考点都是非齐次的(3维),并且满足约束关系
∑
j
=
1
4
α
i
j
=
1
∑_{j=1}^4α_{ij}=1
∑j=14αij=1,所以是数值唯一的。
3,控制点的选择,这个无需多深究,只要不妨碍有关Barycentric的求解
4,求解特征向量
v
i
v_i
vi相机坐标系下的坐标,比较复杂,目前就大概了解吧
先求出0空间对应的特征向量
v
i
v_i
vi,当N=4的时候,可以近似求解出
β
1
,
β
2
,
β
3
,
β
4
\beta_1,\beta_2,\beta_3,\beta_4
β1,β2,β3,β4的数值,之后使用高斯牛顿法对
β
1
,
β
2
,
β
3
,
β
4
\beta_1,\beta_2,\beta_3,\beta_4
β1,β2,β3,β4进行优化。优化的目标函数为
E
r
r
o
r
(
β
)
=
∑
(
i
,
j
)
s
.
t
.
i
<
j
(
∥
∥
c
i
c
−
c
j
c
∥
∥
2
−
∥
∥
c
i
w
−
c
j
w
∥
∥
2
)
2
Error(β)=∑_{(i,j) s.t. i<j}(∥∥c_i^c−c_j^c∥∥^2−∥∥c_i^w−c_j^w∥∥^2)^2
Error(β)=∑(i,j)s.t.i<j(∥∥cic−cjc∥∥2−∥∥ciw−cjw∥∥2)2
最后得到控制点在现有相机坐标系下面的表示
也就得到参考点在现有相机坐标系下的表示
参考
3,Bundle Adjustment
把 PnP 问题构建成一个定义于李代数上的非线性最小二乘问题,首先使用G-N的基本步骤
- 给定初始值 x 0 x_0 x0 。
- 对于第 k 次迭代,求出当前的雅可比矩阵 J ( x k ) J (x_k ) J(xk) 和误差 f ( x k ) f (x_k ) f(xk)。
- 求解增量方程: H ∆ x k = g H∆x_k = g H∆xk=g.
- 若 ∆ x k ∆x_k ∆xk 足够小,则停止。否则,令 x k + 1 = x k + ∆ x k x_k+1 = x_k + ∆x_k xk+1=xk+∆xk ,返回 2.
在BA算法中,误差函数为
u
i
−
K
e
x
p
(
ξ
u_i − K exp (ξ
ui−Kexp(ξ^
)
P
i
) P_i
)Pi,优化变量为ξ,所以最小二乘的问题化成了
然而,高翔仅仅只有对单个点提出解释,对于单个点的相机位姿可以了,但是对于n个点估计来讲,没有占到什么便宜,并且对同时优化参考点的位姿没有解释清楚,针对这两点,我做了相关调研。
查了一圈,貌似这个在g2o中是通过增加边来解决的,即如果有N个点,就要有N个边,限于水平,具体图优化的算法不深入探究。此外,优化变量也可以添加到参考点的坐标。