一、相机模型
设相机坐标系下的左边点
[
X
,
Y
,
Z
]
T
[X,Y,Z]^T
[X,Y,Z]T,相机物理成像的其次坐标为
[
X
′
,
Y
′
,
1
]
[X',Y',1]
[X′,Y′,1],成像焦距为
f
f
f,由相似三角形的关系可以得到:
X
′
=
f
X
Z
Y
′
=
f
Y
Z
(1)
X'=f\frac X Z\\ ~\\ Y'=f\frac Y Z \tag{1}
X′=fZX Y′=fZY(1)
设像素坐标为
[
u
,
v
]
T
[u,v]^T
[u,v]T,如果像素在u轴上缩放
α
\alpha
α倍,在v轴上缩放
β
\beta
β倍,则:
{
u
=
α
X
′
+
c
x
v
=
β
Y
′
+
c
y
(2)
\left \{ \begin{aligned} u=\alpha X'+c_x\\ v= \beta Y'+c_y \end{aligned} \right.\tag{2}
{u=αX′+cxv=βY′+cy(2)
将
α
f
\alpha f
αf合并成
f
x
f_x
fx,
β
X
′
\beta X'
βX′合并成
f
y
f_y
fy:
{
u
=
f
x
X
Z
+
c
x
v
=
f
y
Y
Z
+
c
x
(3)
\left \{ \begin{aligned} u=f_x \frac X Z+c_x\\ v= f_y\frac Y Z+c_x \end{aligned} \right.\tag{3}
⎩⎪⎪⎨⎪⎪⎧u=fxZX+cxv=fyZY+cx(3)
所以有:
Z
[
u
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Y
Z
]
(4)
Z\begin{bmatrix} u \\ ~\\v\\~\\1 \end{bmatrix}=\begin{bmatrix} f_x&0&c_x \\ ~\\0&f_y&c_y \\ ~\\0&0&1 \end{bmatrix}\begin{bmatrix} X\\~\\ Y \\~\\ Z \end{bmatrix}\tag{4}
Z⎣⎢⎢⎢⎢⎡u v 1⎦⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎡fx 0 00fy0cxcy1⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎡X Y Z⎦⎥⎥⎥⎥⎤(4)
即:
Z
P
u
v
=
Z
[
u
v
1
]
=
K
P
=
K
T
P
w
(5)
Z\bm P_{uv}=Z\begin{bmatrix} u \\ ~\\v\\~\\1 \end{bmatrix}=\bm{KP}=\bm{KTP}_w\tag{5}
ZPuv=Z⎣⎢⎢⎢⎢⎡u v 1⎦⎥⎥⎥⎥⎤=KP=KTPw(5)
二、最小化重投影误差
2.1 优化位姿
若空间中的点为
P
i
=
[
X
i
,
Y
i
,
Z
i
]
T
\bm P_i=[X_i,Y_i,Z_i]^T
Pi=[Xi,Yi,Zi]T,其投影的像素坐标为
u
i
=
[
u
i
,
v
i
]
T
\bm u_i=[u_i,v_i]^T
ui=[ui,vi]T,相机的位姿为
T
\bm T
T,所以投影关系为:
u
i
=
1
s
i
K
T
P
i
(6)
\bm u_i=\frac 1 {s_i}\bm{KTP}_i\tag{6}
ui=si1KTPi(6)
由于观测点的噪声,所以就存在误差,所以为了找到一个最优的位姿,我们根据误差构造一个最小二乘问题:
arg
min
T
1
2
∑
i
=
1
n
∥
u
i
−
1
s
i
K
T
P
i
∥
2
2
(7)
\mathop {\arg\min}\limits_T\frac 1 2 \sum_{i=1}^n \left\| \bm u_i-\frac 1 {s_i}\bm{KTP}_i \right\|_2^2\tag{7}
Targmin21i=1∑n∥∥∥∥ui−si1KTPi∥∥∥∥22(7)
面对这个最小二乘法,我们一般利用高斯牛顿法或者列文伯格-马夸尔特方法进行求解,我们令:
e
=
u
i
−
1
s
i
K
T
P
i
e
(
ξ
)
=
u
i
−
1
s
i
K
exp
(
ξ
∧
)
P
i
(8)
\bm e=\bm u_i-\frac 1 {s_i}\bm{KTP}_i \\ ~\\ \bm e(\xi)= \bm u_i-\frac 1 {s_i}\bm{K} \exp{(\xi^\land)} \bm P_i \tag{8}
e=ui−si1KTPi e(ξ)=ui−si1Kexp(ξ∧)Pi(8)
参考我的博文:SLAM–线性化求解估计位姿
e ( Δ ξ ⊕ ξ ) = u i − 1 s i K exp ( Δ ξ ∧ ) exp ( ξ ∧ ) P i (9) \bm e(\Delta \xi \oplus \xi) =\bm u_i-\frac 1 {s_i}\bm{K} \exp{(\Delta\xi^\land)} \exp{(\xi^\land)} \bm P_i \tag{9} e(Δξ⊕ξ)=ui−si1Kexp(Δξ∧)exp(ξ∧)Pi(9)
所以对误差函数线性化可得:
e
(
Δ
ξ
⊕
ξ
)
=
e
(
J
l
−
1
Δ
ξ
+
ξ
)
≈
e
(
ξ
)
+
J
δ
ξ
Δ
ξ
6
×
1
→
e
(
Δ
ξ
⊕
ξ
)
≈
e
(
ξ
)
+
J
δ
ξ
Δ
ξ
6
×
1
(10)
\small \bm e(\Delta \xi \oplus \xi) =\bm e(\bm J_l^{-1}\Delta \xi+\xi) \approx \bm e(\xi)+\bm J_{\delta \xi} \Delta \xi_{6\times1} \\ ~\\ \\ \rightarrow \bm e(\Delta \xi \oplus \xi) \approx \bm e(\xi)+\bm J_{\delta \xi} \Delta \xi_{6\times1} \tag{10}
e(Δξ⊕ξ)=e(Jl−1Δξ+ξ)≈e(ξ)+JδξΔξ6×1 →e(Δξ⊕ξ)≈e(ξ)+JδξΔξ6×1(10)
其中:
J
δ
ξ
=
∂
e
(
ξ
)
∂
δ
ξ
=
−
∂
(
1
s
i
K
exp
(
ξ
∧
)
P
i
)
∂
δ
ξ
=
−
∂
u
∂
δ
ξ
(11)
\small \begin{aligned} \bm J_{\delta \xi}&=\frac {\partial{\bm e(\xi) }} {\partial \delta \xi}\\ ~\\ \\&=-\frac{\partial({\frac 1 {s_i}\bm{K} \exp{(\xi^\land)} \bm P_i})}{\partial \delta \xi}\\ ~\\ &=-\frac{\partial \bm u}{\partial \delta \xi} \end{aligned} \tag{11}
Jδξ =∂δξ∂e(ξ)=−∂δξ∂(si1Kexp(ξ∧)Pi)=−∂δξ∂u(11)
我们不使用像素坐标的其次坐标,所以:
u
=
[
u
v
]
=
[
f
x
X
Z
+
c
x
f
y
Y
Z
+
c
x
]
,
P
′
=
[
X
′
Y
′
Z
′
]
(12)
\bm u = \begin{bmatrix} u \\ ~\\v\\ \end{bmatrix}= \begin{bmatrix} f_x \frac X Z+c_x\\ ~\\ f_y\frac Y Z+c_x \end{bmatrix},\bm P'=\begin{bmatrix} X'\\ ~\\Y'\\~\\ Z' \end{bmatrix}\tag{12}
u=⎣⎡u v⎦⎤=⎣⎡fxZX+cx fyZY+cx⎦⎤,P′=⎣⎢⎢⎢⎢⎡X′ Y′ Z′⎦⎥⎥⎥⎥⎤(12)
由链式求导法则可得:
J
δ
ξ
=
−
∂
u
∂
δ
ξ
=
−
∂
u
∂
P
′
⋅
∂
P
′
∂
δ
ξ
(13)
J_{\delta \xi}=-\frac{\partial \bm u}{\partial \delta \xi}=-\frac{\partial \bm u}{\partial \bm P'}\cdot \frac{\partial \bm P'}{\partial \delta \xi}\tag{13}
Jδξ=−∂δξ∂u=−∂P′∂u⋅∂δξ∂P′(13)
这样我们就可以求出第一个导数:
∂
u
∂
P
′
=
[
∂
u
∂
X
′
∂
u
∂
Y
′
∂
u
∂
Z
′
∂
v
∂
X
′
∂
v
∂
Y
′
∂
v
∂
Z
′
]
=
[
f
x
Z
′
0
−
f
x
X
′
Z
′
2
0
f
y
Z
′
−
f
y
Y
′
Z
′
2
]
\frac{\partial \bm u}{\partial \bm P'}=\begin{bmatrix} \frac{\partial \bm u}{\partial \bm X'} &\frac{\partial \bm u}{\partial \bm Y'}&\frac{\partial \bm u}{\partial \bm Z'}\\ ~\\\frac{\partial \bm v}{\partial \bm X'} & \frac{\partial \bm v}{\partial \bm Y'} &\frac{\partial \bm v}{\partial \bm Z'}\\ \end{bmatrix}= \begin{bmatrix} \frac {f_x}{Z'}&0&-\frac{f_xX'}{Z'^2} \\ ~\\0&\frac{f_y}{Z'}&-\frac{f_yY'}{Z'^2}\\ \end{bmatrix}
∂P′∂u=⎣⎡∂X′∂u ∂X′∂v∂Y′∂u∂Y′∂v∂Z′∂u∂Z′∂v⎦⎤=⎣⎢⎡Z′fx 00Z′fy−Z′2fxX′−Z′2fyY′⎦⎥⎤
求第二个导数:
∂
P
′
∂
δ
ξ
=
∂
(
T
P
ˉ
)
1
:
3
∂
δ
ξ
=
[
(
T
P
ˉ
)
⊙
]
1
:
3
=
[
I
3
×
3
−
(
T
P
ˉ
)
1
:
3
∧
]
3
×
6
\small \frac{\partial \bm P'}{\partial \delta \xi}=\frac{\partial \bm {(T\bar P)}_{1:3}}{\partial \delta \xi}=[(\bm T\bar \bm P)^\odot]_{1:3}\\ ~\\= {\begin{bmatrix}\bm I_{3\times3} &-(\bm T\bar \bm P)_{1 :3}^\land \\ \end{bmatrix} }_{3\times6}
∂δξ∂P′=∂δξ∂(TPˉ)1:3=[(TPˉ)⊙]1:3 =[I3×3−(TPˉ)1:3∧]3×6
所以有:
J
δ
ξ
=
−
[
f
x
Z
′
0
−
f
x
X
′
Z
′
2
0
f
y
Z
′
−
f
y
Y
′
Z
′
2
]
⋅
[
I
3
×
3
−
(
T
P
ˉ
)
1
:
3
∧
]
3
×
6
=
−
[
f
x
Z
′
0
−
f
x
X
′
Z
′
2
−
f
x
X
′
Y
′
Z
′
2
f
x
+
f
x
X
′
2
Z
′
2
−
f
x
Y
′
Z
′
0
f
y
Z
′
−
f
y
Y
′
Z
′
2
−
f
y
−
f
y
Y
′
2
Z
′
2
f
y
Y
′
X
′
Z
′
2
f
y
X
′
Z
′
]
\begin{aligned} J_{\delta \xi}&=-\begin{bmatrix} \frac {f_x}{Z'}&0&-\frac{f_xX'}{Z'^2} \\ ~\\0&\frac{f_y}{Z'}&-\frac{f_yY'}{Z'^2}\\ \end{bmatrix}\cdot {\begin{bmatrix}\bm I_{3\times3} &-(\bm T\bar P)_{1 :3}^\land \\ \end{bmatrix} }_{3\times6}\\ ~\\ &= -\begin{bmatrix} \frac {f_x}{Z'} & 0 &-\frac{f_xX'}{Z'^2} &-\frac{f_xX'Y'}{Z'^2} &f_x+ \frac{f_xX'^2}{Z'^2} & -\frac{f_xY'}{Z'} & \\ ~\\ 0&\frac{f_y}{Z'}&-\frac{f_yY'}{Z'^2} & -f_y-\frac{f_yY'^2}{Z'^2} & \frac{f_yY'X'}{Z'^2} & \frac{f_yX'}{Z'} & \\ \end{bmatrix} \end{aligned}
Jδξ =−⎣⎢⎡Z′fx 00Z′fy−Z′2fxX′−Z′2fyY′⎦⎥⎤⋅[I3×3−(TPˉ)1:3∧]3×6=−⎣⎢⎡Z′fx 00Z′fy−Z′2fxX′−Z′2fyY′−Z′2fxX′Y′−fy−Z′2fyY′2fx+Z′2fxX′2Z′2fyY′X′−Z′fxY′Z′fyX′⎦⎥⎤
这样我们就可以求出
Δ
ξ
\Delta \xi
Δξ:
Δ
ξ
=
−
(
J
δ
ξ
T
⋅
J
δ
ξ
)
−
1
(
J
δ
ξ
T
⋅
e
(
ξ
)
)
\small \Delta \xi= -(J_{\delta \xi}^T\cdot J_{\delta \xi})^{-1}(J_{\delta \xi}^T\cdot \bm e(\xi))
Δξ=−(JδξT⋅Jδξ)−1(JδξT⋅e(ξ))
利用高斯迭代法,对于第K+1次更新位姿:
T
(
ξ
k
+
1
)
=
exp
(
Δ
x
∧
)
⋅
T
(
ξ
0
)
=
exp
(
Δ
ξ
∧
)
⋅
T
(
ξ
0
)
\small T(\xi_{k+1}) = \exp(\Delta x^\land)\cdot T(\xi_0)=\exp (\Delta \xi^\land)\cdot T(\xi_0)
T(ξk+1)=exp(Δx∧)⋅T(ξ0)=exp(Δξ∧)⋅T(ξ0)
2.2 优化路标
同样写出相关函数:
e
=
u
i
−
1
s
i
K
T
P
i
e
(
P
i
)
=
u
i
−
1
s
i
K
exp
(
ξ
∧
)
P
i
(
)
\bm e=\bm u_i-\frac 1 {s_i}\bm{KTP}_i \\ ~\\ \bm e(\bm P_i)= \bm u_i-\frac 1 {s_i}\bm{K} \exp{(\xi^\land)} \bm P_i \tag{}
e=ui−si1KTPi e(Pi)=ui−si1Kexp(ξ∧)Pi()
利用链式求导法则:
∂
e
(
P
)
∂
P
=
∂
e
(
P
)
∂
P
′
∂
P
′
∂
P
\frac {\partial \bm e(\small{\bm P})}{\partial \bm P}=\frac {\partial \bm e(\small{\bm P})}{\partial \bm P'}\frac {\partial \bm P'}{\partial \bm P}
∂P∂e(P)=∂P′∂e(P)∂P∂P′
第一个导数我们已经求出:
∂
e
(
P
)
∂
P
′
=
−
∂
u
∂
P
′
=
−
[
∂
u
∂
X
′
∂
u
∂
Y
′
∂
u
∂
Z
′
∂
v
∂
X
′
∂
v
∂
Y
′
∂
v
∂
Z
′
]
\frac {\partial \bm e(\small{\bm P})}{\partial \bm P'}=-\frac{\partial \bm u}{\partial \bm P'}=-\begin{bmatrix} \frac{\partial \bm u}{\partial \bm X'} &\frac{\partial \bm u}{\partial \bm Y'}&\frac{\partial \bm u}{\partial \bm Z'}\\ ~\\\frac{\partial \bm v}{\partial \bm X'} & \frac{\partial \bm v}{\partial \bm Y'} &\frac{\partial \bm v}{\partial \bm Z'}\\ \end{bmatrix}
∂P′∂e(P)=−∂P′∂u=−⎣⎡∂X′∂u ∂X′∂v∂Y′∂u∂Y′∂v∂Z′∂u∂Z′∂v⎦⎤
对于第二个导数有
P
′
=
(
T
P
ˉ
)
1
:
3
=
R
P
+
t
\bm P'=\bm {(T\bar P)}_{1:3}=\bm{RP+t}
P′=(TPˉ)1:3=RP+t,所以:
∂
P
′
∂
P
=
R
\frac {\partial \bm P'}{\partial \bm P}=\bm R
∂P∂P′=R
于是有:
∂
e
(
P
)
∂
P
=
−
[
f
x
Z
′
0
−
f
x
X
′
Z
′
2
0
f
y
Z
′
−
f
y
Y
′
Z
′
2
]
⋅
R
\frac {\partial \bm e(\small{\bm P})}{\partial \bm P}=-\begin{bmatrix} \frac {f_x}{Z'}&0&-\frac{f_xX'}{Z'^2} \\ ~\\0&\frac{f_y}{Z'}&-\frac{f_yY'}{Z'^2}\\ \end{bmatrix}\cdot \bm R
∂P∂e(P)=−⎣⎢⎡Z′fx 00Z′fy−Z′2fxX′−Z′2fyY′⎦⎥⎤⋅R
由泰勒展开式:
e
(
Δ
P
+
P
)
≈
e
(
P
)
+
J
e
⋅
Δ
P
\small \bm e(\Delta\bm P+\bm P)\approx \bm e(\bm P)+\bm J_{e}\cdot \Delta \bm P
e(ΔP+P)≈e(P)+Je⋅ΔP
( Δ P ) = − ( J e T ⋅ J e ) − 1 ( J e T ⋅ e ( P ) ) \small (\Delta \bm P) = -(\bm J_{e}^T\cdot \bm J_{e})^{-1}(\bm J_{e}^T\cdot \bm e(\bm P)) (ΔP)=−(JeT⋅Je)−1(JeT⋅e(P))
对于第K+1次更新位姿:
P
k
+
1
=
Δ
P
k
+
P
k
\small \bm P_{k+1}=\Delta \bm P_{k}+\bm P_{k}
Pk+1=ΔPk+Pk
至此重投影误差求解推导完成。