第七章 视觉里程计
三 3D-2D: PnP
在之前建图的基础上,已知了3D点的空间位置信息,和点投影到图像上的信息,求相机的旋转和平移。
1. DLT 直接线性变换
已知空间点P和投影点x:(其中[R|t]是3×4的增广矩阵,在这里省略了相机内参K,因为K是已知的,所以没有带入)
P
=
(
X
,
Y
,
Z
,
1
)
T
x
=
(
u
,
v
,
1
)
s
x
=
[
R
∣
t
]
P
P=(X,Y,Z,1)^T\\ x=(u,v,1)\\ sx=[R|t]P
P=(X,Y,Z,1)Tx=(u,v,1)sx=[R∣t]P
展开得到:
用最后一行消掉s,得到:
其中:
t
1
T
=
(
t
1
,
t
2
,
t
3
,
t
4
)
,
t
2
T
=
(
t
5
,
t
6
,
t
7
,
t
8
)
,
t
3
T
=
(
t
9
,
t
10
,
t
11
,
t
12
)
\pmb{t_1}^T=(t_1,t_2,t_3,t_4),\pmb{t_2}^T=(t_5,t_6,t_7,t_8),\pmb{t_3}^T=(t_9,t_{10},t_{11},t_{12})
t1t1t1T=(t1,t2,t3,t4),t2t2t2T=(t5,t6,t7,t8),t3t3t3T=(t9,t10,t11,t12)
因为一共12个未知数,一对点可以有两个方程,所以需要6对点。给的点多于6对时,求最小二乘解。得到[R|t]后用QR分解投影到SO(3),然后得到R和t。
2. P3P
利用3对点求解和t,下图中是相机成像的,存在很多的相似三角形。
看三角形OAB得到:(余弦定理)
O
A
2
+
O
B
2
−
2
O
A
∗
O
B
∗
c
o
s
(
∠
A
O
B
)
=
A
B
2
三
角
形
A
O
C
:
O
A
2
+
O
C
2
−
2
O
A
∗
O
C
∗
c
o
s
(
∠
A
O
C
)
=
A
C
2
三
角
形
B
O
C
:
O
B
2
+
O
C
2
−
2
O
B
∗
O
C
∗
c
o
s
(
∠
B
O
C
)
=
B
C
2
OA^2+OB^2-2OA*OB*cos(\angle AOB)=AB^2\\ 三角形AOC: OA^2+OC^2-2OA*OC*cos(\angle AOC)=AC^2\\ 三角形BOC: OB^2+OC^2-2OB*OC*cos(\angle BOC)=BC^2
OA2+OB2−2OA∗OB∗cos(∠AOB)=AB2三角形AOC:OA2+OC2−2OA∗OC∗cos(∠AOC)=AC2三角形BOC:OB2+OC2−2OB∗OC∗cos(∠BOC)=BC2
上式全部除以 OC^2,记x=OA/OC,y=OB/OC,得到:
x
2
+
y
2
−
2
x
y
∗
c
o
s
(
∠
A
O
B
)
=
A
B
2
/
O
C
2
x
2
+
1
−
2
x
∗
c
o
s
(
∠
A
O
C
)
=
A
C
2
/
O
C
2
y
2
+
1
−
2
y
∗
c
o
s
(
∠
B
O
C
)
=
B
C
2
/
O
C
2
x^2+y^2-2xy*cos(\angle AOB)=AB^2/OC^2\\ x^2+1-2x*cos(\angle AOC)=AC^2/OC^2\\ y^2+1-2y*cos(\angle BOC)=BC^2/OC^2
x2+y2−2xy∗cos(∠AOB)=AB2/OC2x2+1−2x∗cos(∠AOC)=AC2/OC2y2+1−2y∗cos(∠BOC)=BC2/OC2
然后:
v
=
A
B
2
/
O
C
2
,
u
=
B
C
2
/
A
B
2
,
w
=
A
C
2
/
A
B
2
u
v
=
B
C
2
/
O
C
2
,
w
v
=
A
C
2
/
O
C
2
v=AB^2/OC^2,\quad u=BC^2/AB^2,\quad w=AC^2/AB^2\\ uv=BC^2/OC^2,\quad wv=AC^2/OC^2
v=AB2/OC2,u=BC2/AB2,w=AC2/AB2uv=BC2/OC2,wv=AC2/OC2
所以得到:
x
2
+
y
2
−
2
x
y
∗
c
o
s
(
∠
A
O
B
)
=
v
x
2
+
1
−
2
x
∗
c
o
s
(
∠
A
O
C
)
=
w
v
y
2
+
1
−
2
y
∗
c
o
s
(
∠
B
O
C
)
=
u
v
x^2+y^2-2xy*cos(\angle AOB)=v\\ x^2+1-2x*cos(\angle AOC)=wv\\ y^2+1-2y*cos(\angle BOC)=uv
x2+y2−2xy∗cos(∠AOB)=vx2+1−2x∗cos(∠AOC)=wvy2+1−2y∗cos(∠BOC)=uv
消掉v得到:
(
1
−
u
)
y
2
−
u
x
2
−
2
y
∗
c
o
s
(
∠
B
O
C
)
+
2
u
x
y
∗
c
o
s
(
∠
A
O
B
)
+
1
=
0
(
1
−
w
)
x
2
−
w
y
2
−
2
x
∗
c
o
s
(
∠
A
O
C
)
+
2
w
x
y
∗
c
o
s
(
∠
A
O
B
)
+
1
=
0
(1-u)y^2-ux^2-2y*cos(\angle BOC)+2uxy*cos(\angle AOB)+1=0\\ (1-w)x^2-wy^2-2x*cos(\angle AOC)+2wxy*cos(\angle AOB)+1=0
(1−u)y2−ux2−2y∗cos(∠BOC)+2uxy∗cos(∠AOB)+1=0(1−w)x2−wy2−2x∗cos(∠AOC)+2wxy∗cos(∠AOB)+1=0
由于知道2D点图像位置,三个余弦角可以得到,同时w,u也是可以得到的,所以可以求得x,y值。从而得到ABC在相机坐标系下的3D坐标,然后根据3D-3D的点对,计算相机运动的R,t。
3. Bundle Adjustment
优化解法,最小化重投影误差,投影关系为:
s
i
u
i
=
K
e
x
p
(
ξ
∧
)
P
i
所
以
:
u
i
=
1
s
i
K
e
x
p
(
ξ
∧
)
P
i
s_iu_i = K exp(\xi^{\wedge})P_i\\ 所以: u_i = \frac{1}{s_i} K exp(\xi^{\wedge})P_i
siui=Kexp(ξ∧)Pi所以:ui=si1Kexp(ξ∧)Pi
u的真实值和计算值存在误差,要求出使该误差最小的T,就是相机的平移和旋转。
ξ
∗
=
a
r
g
m
i
n
ξ
1
2
∑
i
=
1
n
∣
∣
u
i
−
1
s
i
K
e
x
p
(
ξ
∧
)
P
i
∣
∣
2
2
令
:
e
i
=
u
i
−
1
s
i
K
e
x
p
(
ξ
∧
)
P
i
\xi ^*=argmin_{\xi}\frac{1}{2}\sum^n_{i=1}{||u_i-\frac{1}{s_i} K exp(\xi^{\wedge})P_i||^2_2}\\ 令:e_i=u_i-\frac{1}{s_i} K exp(\xi^{\wedge})P_i
ξ∗=argminξ21i=1∑n∣∣ui−si1Kexp(ξ∧)Pi∣∣22令:ei=ui−si1Kexp(ξ∧)Pi
对于优化这个目标函数,用的是李代数扰动(因为不方便直接对位姿求导为0),所以是对扰动的小量求导,也就是:
第一项为:
假
设
:
P
′
=
(
e
x
p
(
ξ
∧
)
P
)
1
:
3
=
[
X
′
,
Y
′
,
Z
′
]
所
以
:
s
u
=
K
P
′
变
为
:
[
s
u
s
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
′
Y
′
Z
′
]
假设:P'=(exp(\xi^{\wedge})P)_{1:3}=[X',Y',Z']\\ 所以:su=KP'变为: \\\left[ \begin{matrix} su\\sv\\1 \end{matrix} \right]= \left[ \begin{matrix} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} X'\\Y'\\Z' \end{matrix} \right]
假设:P′=(exp(ξ∧)P)1:3=[X′,Y′,Z′]所以:su=KP′变为:⎣⎡susv1⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡X′Y′Z′⎦⎤
化简得到:(用第三行消掉s)
u
=
f
x
X
"
Z
"
+
c
x
,
v
=
f
y
Y
"
Z
"
+
c
y
u=f_x\frac{X^"}{Z^"}+c_x,\quad v=f_y\frac{Y^"}{Z^"}+c_y
u=fxZ"X"+cx,v=fyZ"Y"+cy
所以得到导数为:
第二项为:在第四章中可以知道扰动模型的导数为:
ð
(
T
P
)
ð
δ
ξ
=
[
I
−
P
′
∧
0
T
0
T
]
≜
(
T
p
)
⊙
\frac{\eth(TP)}{\eth\delta\xi}= \left[ \begin{matrix} I & -P'^{\wedge}\\ 0^T & 0^T \end{matrix} \right ]\triangleq(Tp)^{\odot}
ðδξð(TP)=[I0T−P′∧0T]≜(Tp)⊙
所以非其次的形式为:(3×6的矩阵)
ð
(
P
′
)
ð
δ
ξ
=
[
I
−
P
′
∧
]
\frac{\eth(P')}{\eth\delta\xi}= \left[ \begin{matrix} I & -P'^{\wedge} \end{matrix} \right]
ðδξð(P′)=[I−P′∧]
两项的乘积为:
为优化提供了方向。不仅可以优化相机位移和旋转,还可以优化3D点位置,关于3D点位置的导数为:
ð
e
ð
P
=
ð
e
ð
P
′
∗
R
\frac{\eth e}{\eth P}=\frac{\eth e}{\eth P'}*R
ðPðe=ðP′ðe∗R
代码 pose_estimation_3d2d.cpp
四 3D-3D ICP
1. 用SVD解法:
给配对好的两组3D点,求其旋转和平移。可以用迭代最近点(ICP)求解。设:
P
=
{
p
1
,
.
.
.
,
p
n
}
,
P
′
=
{
p
1
′
,
.
.
.
,
p
n
′
}
∀
i
,
p
i
=
R
p
i
′
+
t
P=\{p_1,...,p_n\},P'=\{p'_1,...,p'_n\} \\ \forall i,p_i=Rp'_i+t
P={p1,...,pn},P′={p1′,...,pn′}∀i,pi=Rpi′+t
pi的真实值与计算值之间存在误差:
e
i
=
p
i
−
(
R
p
i
′
+
t
)
e_i=p_i-(Rp'_i+t)
ei=pi−(Rpi′+t)
所以就可以定义为最小二乘问题:
min
R
,
t
J
=
1
2
∑
i
=
1
n
∣
∣
(
p
i
−
(
R
p
i
′
+
t
)
)
∣
∣
2
2
\min_{R,t}J=\frac{1}{2}\sum_{i=1}^{n}{||(p_i-(Rp'_i+t))||_2^2}
R,tminJ=21i=1∑n∣∣(pi−(Rpi′+t))∣∣22
定义质心为:
得到:
其中交叉项 (pi - p - R ( pi’ - p’ ) ) 为0,因为 pi 和 p 的相对位置与 pi‘ 和 p’ 的相对位置大小是相同的,在乘上R之后,就是一样的向量,所以做差为0。所以优化目标函数可以简化为:
min
R
,
t
J
=
1
2
∑
i
=
1
n
∣
∣
p
i
−
p
−
R
(
p
i
′
−
p
′
)
∣
∣
2
+
∣
∣
p
−
R
p
′
−
t
∣
∣
2
\min_{R,t}J=\frac{1}{2}\sum_{i=1}^{n}{||p_i-p-R(p_i'-p')||^2+||p-Rp'-t||^2}
R,tminJ=21i=1∑n∣∣pi−p−R(pi′−p′)∣∣2+∣∣p−Rp′−t∣∣2
前面一项只和R有关,所以使前面一项最小得到R,然后取t使得后一项为0。
如何求前面一项最小呢,分为这么几步:
定义去质心坐标:
q
i
=
p
i
−
p
,
q
i
′
=
p
i
′
−
p
′
q_i=p_i-p,\quad q'_i=p'_i-p'
qi=pi−p,qi′=pi′−p′
所以变为最小化:
R
∗
=
a
r
g
min
R
1
2
∑
i
=
1
n
∣
∣
q
i
−
R
q
i
′
∣
∣
2
R^*=arg\min_R \frac{1}{2}\sum_{i=1}^{n}{||q_i-Rq'_i||^2}
R∗=argRmin21i=1∑n∣∣qi−Rqi′∣∣2
因为R^T * R 等于 I ,所以前两项都和R 没有关系,所以实际上优化目标函数变为:
然后:
将第二项变为0,可以得到如下公式,求出t:
t
=
p
−
R
p
′
t=p-Rp'
t=p−Rp′
2. 非线性优化
非线性优化的思想是用迭代的方式去寻找最优值。当以李代数表达位姿时,目标函数改写为:
min
ξ
=
1
2
∑
i
=
1
n
‖
(
p
i
−
e
x
p
(
ξ
∧
)
p
′
i
)
‖
2
2
\min_ξ=\frac{1}{2}\sum_{i=1}^{n}{‖(p_i−exp(ξ^{\wedge})p′_i)‖_2^2}
ξmin=21i=1∑n‖(pi−exp(ξ∧)p′i)‖22
它关于位姿导数已推导过,使用李代数扰动模型:
∂
e
∂
δ
ξ
=
−
(
e
x
p
(
ξ
∧
)
∗
p
i
′
)
⊙
\frac{∂e}{∂δξ}=−(exp(ξ^∧)*p'_i)^{\odot}
∂δξ∂e=−(exp(ξ∧)∗pi′)⊙
- ICP问题存在唯一解和无穷多解的情况
- 若存在唯一解,极小值点即为全局最优解
- 在匹配已知的情况下,最小二乘实际上具有解析解,没有必要用迭代优化
- 可以混合使用PnP和ICP优化
- 深度值已知的点,用建模它们的3D-3D误差
- 深度值未知的点,用建模3D-2D的重投影误差
代码:pose_estimation_3d3d.cpp