已知:若干个关键帧中,某些像素点对应了同一个新路标点(换言之,某一个路标点被若干个关键帧观测到)(像素点之间的对应关系或关联,可以通过光流跟踪、特征匹配等得到)。
将该已知数学化:已知第
k
k
k帧上该像素的归一化平面坐标为
P
c
k
=
[
u
k
,
v
k
,
1
]
T
,
(
k
=
1
,
2
,
⋯
 
,
n
)
P_{c_k}=[u_k,v_k,1]^T,(k=1,2,\cdots,n)
Pck=[uk,vk,1]T,(k=1,2,⋯,n),且已知第
k
k
k帧(相对于世界坐标系的)位姿
T
k
=
[
R
k
,
t
k
]
3
×
4
T_k=[R_k,t_k]_{3\times 4}
Tk=[Rk,tk]3×4,求该新路标点的世界坐标系下的坐标
P
w
=
[
X
,
Y
,
Z
,
1
]
T
P_w=[X,Y,Z,1]^T
Pw=[X,Y,Z,1]T(取齐次坐标)。
【注意】此处得位姿是
T
c
w
T_{cw}
Tcw,我们知道在【VINS课件及代码】中位姿得定义是
T
w
c
T_{wc}
Twc,因此需要一步转换!!
R
c
w
=
R
w
c
T
,
t
c
w
=
−
R
w
c
T
t
w
c
R_{cw}=R^T_{wc},t_{cw}=-R^T_{wc}t_{wc}
Rcw=RwcT,tcw=−RwcTtwc
根据投影关系:
λ
k
P
c
k
=
T
k
P
w
,
(
k
=
1
,
2
,
⋯
 
,
n
)
\lambda_kP_{c_k}=T_kP_w, \quad(k=1,2,\cdots,n)
λkPck=TkPw,(k=1,2,⋯,n)
式中,
λ
k
\lambda_k
λk为第
k
k
k帧坐标系下新路标点的深度值,是未知量(但同时我们不关心,应该消去该未知量)。
展开:
λ
k
[
u
k
v
k
1
]
=
[
T
k
,
11
T
k
,
12
T
k
,
13
T
k
,
14
T
k
,
21
T
k
,
22
T
k
,
23
T
k
,
24
T
k
,
31
T
k
,
32
T
k
,
33
T
k
,
34
]
P
w
[
λ
k
u
k
λ
k
v
k
λ
k
]
=
[
T
k
,
1
T
T
k
,
2
T
T
k
,
3
T
]
P
w
\begin{aligned} \lambda_k \begin{bmatrix} u_k \\ v_k \\1 \end{bmatrix} &= \begin{bmatrix} T_{k,11} & T_{k,12} & T_{k,13} & T_{k,14} \\ T_{k,21} & T_{k,22} & T_{k,23} & T_{k,24}\\ T_{k,31} & T_{k,32} & T_{k,33} & T_{k,34}\\ \end{bmatrix}P_w \\ \begin{bmatrix} \lambda_k u_k \\ \lambda_k v_k \\ \lambda_k \end{bmatrix} &= \begin{bmatrix} T^T_{k,1}\\ T^T_{k,2}\\ T^T_{k,3}\\ \end{bmatrix} P_w \end{aligned}
λk⎣⎡ukvk1⎦⎤⎣⎡λkukλkvkλk⎦⎤=⎣⎡Tk,11Tk,21Tk,31Tk,12Tk,22Tk,32Tk,13Tk,23Tk,33Tk,14Tk,24Tk,34⎦⎤Pw=⎣⎡Tk,1TTk,2TTk,3T⎦⎤Pw
消去
λ
k
\lambda_k
λk得:
[
u
k
T
k
,
3
T
y
v
k
T
k
,
3
T
y
]
=
[
T
k
,
1
T
T
k
,
2
T
]
P
w
[
u
k
T
k
,
3
T
−
T
k
,
1
T
v
k
T
k
,
3
T
−
T
k
,
2
T
]
P
w
=
0
\begin{aligned} \begin{bmatrix} u_k T^T_{k,3}y \\ v_k T^T_{k,3} y \end{bmatrix} &= \begin{bmatrix} T^T_{k,1}\\ T^T_{k,2} \end{bmatrix} P_w \\ \begin{bmatrix} u_k T^T_{k,3} - T^T_{k,1} \\ v_k T^T_{k,3} - T^T_{k,2} \end{bmatrix} P_w&= 0 \end{aligned}
[ukTk,3TyvkTk,3Ty][ukTk,3T−Tk,1TvkTk,3T−Tk,2T]Pw=[Tk,1TTk,2T]Pw=0
每一帧可以贡献上述两个方程,将
n
n
n帧都罗列出来,如下:
[
u
1
T
1
,
3
T
−
T
1
,
1
T
v
1
T
1
,
3
T
−
T
1
,
2
T
u
2
T
2
,
3
T
−
T
2
,
1
T
v
2
T
2
,
3
T
−
T
2
,
2
T
⋯
⋯
u
n
T
n
,
3
T
−
T
n
,
1
T
v
n
T
n
,
3
T
−
T
n
,
2
T
]
P
w
=
0
D
P
w
=
0
\begin{aligned} \begin{bmatrix} u_1 T^T_{1,3} - T^T_{1,1} \\ v_1 T^T_{1,3} - T^T_{1,2} \\ u_2 T^T_{2,3} - T^T_{2,1} \\ v_2 T^T_{2,3} - T^T_{2,2} \\ \cdots \\ \cdots \\ u_n T^T_{n,3} - T^T_{n,1} \\ v_n T^T_{n,3} - T^T_{n,2} \\ \end{bmatrix} P_w &= 0 \\ D P_w &=0 \end{aligned}
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡u1T1,3T−T1,1Tv1T1,3T−T1,2Tu2T2,3T−T2,1Tv2T2,3T−T2,2T⋯⋯unTn,3T−Tn,1TvnTn,3T−Tn,2T⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤PwDPw=0=0
解上述线性方程即可求得新路标点得齐次坐标 P w P_w Pw。
【注】:因为我们确定有非零解,故应该有 r a n k ( D ) = 3 rank(D)=3 rank(D)=3;在非常理想情况下(即观测无噪声、位姿估计准确)或许可以实现。但是!! 实际情况却是观测有噪声,位姿估计有误差,故一般情况下是 r a n k ( D ) = 4 rank(D)=4 rank(D)=4,此时去求解该齐次方程,只能得到零解!!
那么,如何才能从含有一定“噪声”的方程组
D
P
w
=
0
DP_w=0
DPw=0中,求解得到非零解P_w呢?
【转化】为寻找最小二乘解:
min
y
∥
D
y
∥
2
2
,
s
.
t
.
∥
y
∥
=
1
\min_{y} \| Dy \|^2_2, \quad s.t. \| y\|=1
ymin∥Dy∥22,s.t.∥y∥=1
该式的含义为,寻找使得 D y Dy Dy的二范数取得最小值得 y y y,且这个 y y y得模长为1(该条件主要是为了规避 y y y为零解得情况)。
此处直接给出结论:
y
=
U
4
y=U_4
y=U4即为该最小二乘问题得解。
其中
U
4
U_4
U4为对
D
T
D
D^TD
DTD进行奇异值分解得到的奇异值
σ
4
\sigma_4
σ4对应的向量(或酉矩阵第4列)。
取得 y = U 4 y=U_4 y=U4,只需同除以第四个元素,转化为齐次坐标即可。
【对奇异值得一些理解】
每个矩阵 A A A都可以表示为一系列秩为1的“小”矩阵的和,而奇异值则是“小”矩阵前的权重,衡量了某个“小”矩阵对于 A A A的权重。
奇异值分解和特征值分解的区别:
所有的矩阵都可以进行奇异值分解,而只有方阵才可以进行特征值分解。
当所给的矩阵是对称的方阵时,
A
T
=
A
A^T=A
AT=A,奇异值分解和特征值分解的结果是相同的。即,对称矩阵的特征值分解是所有奇异值分解的一个特例。但是二者还是存在一些小的差异,奇异值分解需要对奇异值从大到小的排序,且奇异值均大于等于零。
Matlab代码:
对于特征值分解 [v,d] = eig(A)
, 即 A = v*d*inv(v)
;
对于奇异值分解,其分解的基本形式为 [u,s,v] = svd(C)
, C = u*s*v'
.
若C阵为对称的方阵, 则有 u = v
; 所以有 C = v*s*v'
。