S-MSCKF中观测更新的时机是在特征点跟踪丢失之后,其过程如下:
- 检查跟踪丢失的特征点是否进行过三角化,若果没有,则求其进行三角化。
- 根据上述已知的特征点坐标以及观测,得到状态量之间的约束,进行观测更新。
这里介绍S-MSCKF中对特征点三角化的方法。
1 特征点三角化
特征点三角化分两步,第一步是根据对特征点的某两帧观测值对其坐标进行初始估计;第二步是根据对特征点的多帧观测对其坐标进行修正。
1.1 两帧约束求特征点三维坐标
如下示意图,已知测量得到的特征点
f
f
f在
C
1
C_1
C1中的归一化坐标为
(
z
1
(
0
)
,
z
2
(
1
)
)
(z_1(0),z_2(1))
(z1(0),z2(1)),测量得到的特征点在
C
2
C_2
C2中的归一化坐标为
(
z
2
(
0
)
,
z
2
(
1
)
)
(z_2(0),z_2(1))
(z2(0),z2(1)),
C
2
C_2
C2到
C
1
C_1
C1的转换矩阵为
[
R
,
t
]
[R,t]
[R,t],求特征点
f
f
f在
C
1
C_1
C1系中的深度
d
d
d。
特征点
f
f
f在
C
1
C_1
C1系中的坐标可以表示为
d
[
z
1
(
0
)
,
z
1
(
2
)
,
1
]
T
d[z_1(0),z_1(2),1]^T
d[z1(0),z1(2),1]T,那么其在
C
2
C_2
C2中的坐标可以表示为
R
d
[
z
1
(
0
)
,
z
1
(
2
)
,
1
]
T
+
t
Rd[z_1(0),z_1(2),1]^T+t
Rd[z1(0),z1(2),1]T+t,设
m
=
R
[
z
1
(
0
)
,
z
1
(
2
)
,
1
]
T
m=R[z_1(0),z_1(2),1]^T
m=R[z1(0),z1(2),1]T,那么特征点在
C
2
C_2
C2中可以表示为:
S = d m + t = [ d m ( 0 ) + t ( 0 ) d m ( 1 ) + t ( 1 ) d m ( 2 ) + t ( 2 ) ] S=dm+t=\left[\begin{matrix} dm(0)+t(0)\\ dm(1)+t(1)\\ dm(2)+t(2) \end{matrix}\right] S=dm+t=⎣⎡dm(0)+t(0)dm(1)+t(1)dm(2)+t(2)⎦⎤
将特征点在
C
2
C_2
C2中的归一化坐标同时乘以
d
m
(
2
)
+
t
(
2
)
dm(2)+t(2)
dm(2)+t(2),得到
S
′
S^{'}
S′,那么使
∣
∣
S
−
S
′
∣
∣
||S-S^{'}||
∣∣S−S′∣∣最小即可。
S
−
S
′
=
[
d
m
(
0
)
+
t
(
0
)
−
z
2
(
0
)
[
d
m
(
2
)
+
t
(
2
)
]
d
m
(
1
)
+
t
(
1
)
−
z
2
(
1
)
[
d
m
(
2
)
+
t
(
2
)
]
d
m
(
2
)
+
t
(
2
)
−
[
d
m
(
2
)
+
t
(
2
)
]
]
=
[
[
m
(
0
)
−
z
2
(
0
)
m
(
2
)
]
d
−
[
z
2
(
0
)
t
(
2
)
−
t
(
0
)
]
[
m
(
1
)
−
z
2
(
1
)
m
(
2
)
]
d
−
[
z
2
(
1
)
t
(
2
)
−
t
(
1
)
]
0
]
S-S^{'}=\left[\begin{matrix} dm(0)+t(0)-z_2(0)\left[dm(2)+t(2)\right]\\ dm(1)+t(1)-z_2(1)[dm(2)+t(2)]\\ dm(2)+t(2)-[dm(2)+t(2)] \end{matrix}\right]= \left[\begin{matrix} [m(0)-z_2(0)m(2)]d-[z_2(0)t(2)-t(0)]\\ [m(1)-z_2(1)m(2)]d-[z_2(1)t(2)-t(1)]\\ 0 \end{matrix}\right]
S−S′=⎣⎡dm(0)+t(0)−z2(0)[dm(2)+t(2)]dm(1)+t(1)−z2(1)[dm(2)+t(2)]dm(2)+t(2)−[dm(2)+t(2)]⎦⎤=⎣⎡[m(0)−z2(0)m(2)]d−[z2(0)t(2)−t(0)][m(1)−z2(1)m(2)]d−[z2(1)t(2)−t(1)]0⎦⎤
也即是
∣
∣
A
d
−
b
∣
∣
||Ad-b||
∣∣Ad−b∣∣最小即可:
d
^
=
min
d
{
[
d
A
(
0
)
−
b
(
0
)
]
2
+
[
d
A
(
1
)
+
b
(
1
)
]
2
}
=
A
(
0
)
b
(
0
)
+
A
(
1
)
b
(
1
)
A
(
0
)
2
+
A
(
1
)
2
=
(
A
−
1
A
)
−
1
A
T
b
\hat d=\min_{d}\, \{ [dA(0)-b(0)]^2+[dA(1)+b(1)]^2 \}=\frac{A(0)b(0)+A(1)b(1)}{{A(0)}^{2}+{A(1)}^2}=(A^{-1}A)^{-1}A^{T}b
d^=dmin{[dA(0)−b(0)]2+[dA(1)+b(1)]2}=A(0)2+A(1)2A(0)b(0)+A(1)b(1)=(A−1A)−1ATb
所以得到特征点
f
f
f的三维坐标p的初始估计:
p
(
0
)
=
z
1
(
0
)
d
,
p
(
1
)
=
z
1
(
1
)
d
,
p
(
2
)
=
d
p(0)=z_1(0)d ,\quad p(1)=z_1(1)d ,\quad p(2)=d
p(0)=z1(0)d,p(1)=z1(1)d,p(2)=d
1.2 多帧约束
因为某个特征点在滑动窗口中并不一定只被两帧观测到,所以我们需要根据特征点在多个相机中的观测来进一步优化特征点的三维坐标。
为了提高数值计算的稳定性,特征点的坐标这里采用逆深度表示。比如特征点在某相机坐标系中的坐标为 [ X , Y , Z ] T [X,Y,Z]^{T} [X,Y,Z]T,那么其逆深度表示为 [ α , β , ρ ] T = [ X Y , Y Z , 1 Z ] T [\alpha,\beta,\rho]^{T}=[\frac{X}{Y},\frac{Y}{Z},\frac{1}{Z}]^{T} [α,β,ρ]T=[YX,ZY,Z1]T。
设特征点为
f
j
f_{j}
fj,选取相机系
C
n
C_n
Cn参考系,那么
f
j
f_j
fj在相机系
C
i
C_i
Ci的坐标为:
C
i
p
f
j
=
C
(
C
n
C
i
q
)
C
n
p
f
j
+
C
i
p
C
n
^{C_i}p_{f_j}=C{(^{C_i}_{C_n}q)}{^{C_n}p_{f_j}}+{^{C_i}p_{C_n}}\\
Cipfj=C(CnCiq)Cnpfj+CipCn
将逆深度带入得到:
C
i
p
f
j
=
C
n
Z
j
(
C
(
C
n
C
i
q
)
[
C
n
X
j
C
n
Z
j
C
n
Y
j
C
n
Z
j
1
]
+
1
C
n
Z
j
C
i
p
C
n
)
=
C
n
Z
j
(
C
(
C
n
C
i
q
)
[
α
j
β
j
1
]
+
ρ
j
C
i
p
C
n
)
=
C
n
Z
j
[
h
i
1
(
α
j
,
β
j
,
ρ
)
h
i
2
(
α
j
,
β
j
,
ρ
)
h
i
3
(
α
j
,
β
j
,
ρ
)
]
^{C_i}p_{f_j}= {^{C_n}Z_{j}}\left(C({^{C_i}_{C_n}q}) \left[ \begin{matrix} \frac{^{C_n}X_j}{^{C_n}Z_j} \\ \frac{^{C_n}Y_j}{^{C_n}Z_j} \\ 1 \end{matrix} \right] +{\frac{1}{^{C_n}Z_j}}{^{C_i}p_{C_n}}\right)= {^{C_n}Z_{j}}\left(C({^{C_i}_{C_n}q}) \left[ \begin{matrix} \alpha_j \\ \beta_j \\ 1 \end{matrix} \right] +{\rho _j}{^{C_i}p_{C_n}}\right)\\ = {^{C_n}Z_{j}}\left[\begin{matrix} h_{i1}(\alpha_j,\beta_j,\rho) \\ h_{i2}(\alpha_j,\beta_j,\rho) \\ h_{i3}(\alpha_j,\beta_j,\rho) \end{matrix}\right]
Cipfj=CnZj⎝⎜⎛C(CnCiq)⎣⎢⎡CnZjCnXjCnZjCnYj1⎦⎥⎤+CnZj1CipCn⎠⎟⎞=CnZj⎝⎛C(CnCiq)⎣⎡αjβj1⎦⎤+ρjCipCn⎠⎞=CnZj⎣⎡hi1(αj,βj,ρ)hi2(αj,βj,ρ)hi3(αj,βj,ρ)⎦⎤
那么
f
j
f_j
fj在
C
i
C_i
Ci系中的观测为:(忽略内参,这里使用归一化坐标)
z
i
(
j
)
=
1
h
i
3
(
α
j
,
β
j
,
ρ
)
[
h
i
1
(
α
j
,
β
j
,
ρ
)
h
i
2
(
α
j
,
β
j
,
ρ
)
]
+
n
i
(
j
)
z^{(j)}_{i}=\frac{1}{h_{i3}(\alpha_j,\beta_j,\rho)}\left[\begin{matrix} h_{i1}(\alpha_j,\beta_j,\rho) \\ h_{i2}(\alpha_j,\beta_j,\rho) \end{matrix}\right]+n_i^{(j)}
zi(j)=hi3(αj,βj,ρ)1[hi1(αj,βj,ρ)hi2(αj,βj,ρ)]+ni(j)
设
f
j
f_j
fj在
C
1
,
.
.
.
,
C
m
C_1,...,C_m
C1,...,Cm系下的观测值为
z
1
(
j
)
,
.
.
.
,
z
m
(
j
)
z^{(j)}_1,...,z^{(j)}_m
z1(j),...,zm(j),那么我们可以构建一个最小二乘问题:
min
1
2
∑
i
=
1
m
∣
∣
e
i
(
α
j
,
β
j
,
ρ
j
)
∣
∣
2
=
min
1
2
∑
i
=
1
m
∣
∣
z
i
(
j
)
−
z
^
i
(
j
)
∣
∣
2
\min \frac{1}{2}\sum_{i=1}^{m}||e_i(\alpha_j,\beta_j,\rho_j)||^2=\min \frac{1}{2}\sum_{i=1}^{m}||z_i^{(j)}-\hat z_i^{(j)}||^2
min21i=1∑m∣∣ei(αj,βj,ρj)∣∣2=min21i=1∑m∣∣zi(j)−z^i(j)∣∣2
其中
z
^
i
(
j
)
\hat z^{(j)}_i
z^i(j)为:
z
^
i
(
j
)
=
1
h
i
3
(
α
^
j
,
β
^
j
,
ρ
^
)
[
h
i
1
(
α
^
j
,
β
^
j
,
ρ
^
)
h
i
2
(
α
^
j
,
β
^
j
,
ρ
^
)
]
\hat z^{(j)}_{i}=\frac{1}{h_{i3}(\hat \alpha_j,\hat \beta_j,\hat \rho)}\left[\begin{matrix} h_{i1}(\hat \alpha_j,\hat \beta_j,\hat \rho) \\ h_{i2}(\hat \alpha_j,\hat \beta_j,\hat \rho) \end{matrix}\right]
z^i(j)=hi3(α^j,β^j,ρ^)1[hi1(α^j,β^j,ρ^)hi2(α^j,β^j,ρ^)]
其中误差对优化参数的雅可比矩阵为:
J
i
=
∂
e
i
∂
(
α
^
j
,
β
^
j
,
ρ
^
j
)
=
−
∂
z
^
i
(
j
)
∂
h
∂
h
∂
(
α
^
j
,
β
^
j
,
ρ
^
j
)
=
−
∂
z
^
i
(
j
)
∂
h
[
∂
h
∂
α
^
j
∂
h
∂
β
^
j
∂
h
∂
ρ
^
j
]
=
−
[
1
h
i
1
(
α
^
j
,
β
^
j
,
ρ
^
j
)
0
−
h
i
1
(
α
^
j
,
β
^
j
,
ρ
^
j
)
h
i
3
2
(
α
^
j
,
β
^
j
,
ρ
^
j
)
0
1
h
i
3
(
α
^
j
,
β
^
j
,
ρ
^
j
)
−
h
i
2
(
α
^
j
,
β
^
j
,
ρ
^
j
)
h
i
3
2
(
α
^
j
,
β
^
j
,
ρ
^
j
)
]
[
C
(
C
n
C
i
q
)
(
1
0
0
)
C
(
C
n
C
i
q
)
(
0
1
0
)
C
i
p
C
n
]
J_i=\frac{\partial e_i}{\partial (\hat \alpha_j,\hat \beta_j,\hat \rho_j)}= -\frac{\partial \hat z_i^{(j)}}{\partial h}\frac{\partial h}{\partial (\hat \alpha_j,\hat \beta_j,\hat \rho_j)}= -\frac{\partial \hat z_i^{(j)}}{\partial h} \left[\begin{matrix} \frac{\partial h}{\partial \hat \alpha_j} & \frac{\partial h}{\partial \hat \beta_j} &\frac{\partial h}{\partial \hat \rho_j} \end{matrix}\right]= \\ -\left[\begin{matrix} \frac{1}{h_{i1}(\hat \alpha_j,\hat \beta_j,\hat \rho_j)} & 0 & -\frac{h_{i1}(\hat \alpha_j,\hat \beta_j,\hat \rho_j)}{h_{i3}^2(\hat \alpha_j,\hat \beta_j,\hat \rho_j)} \\ 0 & \frac{1}{h_{i3}(\hat \alpha_j,\hat \beta_j,\hat \rho_j)} & -\frac{h_{i2}(\hat \alpha_j,\hat \beta_j,\hat \rho_j)}{h_{i3}^2(\hat \alpha_j,\hat \beta_j,\hat \rho_j)} \end{matrix}\right] \left[\begin{matrix} C(^{C_i}_{C_n}q)\left(\begin{matrix}1\\ 0\\ 0\end{matrix}\right)& C(^{C_i}_{C_n}q)\left(\begin{matrix}0\\ 1\\ 0\end{matrix}\right)& ^{C_i}p_{C_n} \end{matrix}\right]
Ji=∂(α^j,β^j,ρ^j)∂ei=−∂h∂z^i(j)∂(α^j,β^j,ρ^j)∂h=−∂h∂z^i(j)[∂α^j∂h∂β^j∂h∂ρ^j∂h]=−⎣⎡hi1(α^j,β^j,ρ^j)100hi3(α^j,β^j,ρ^j)1−hi32(α^j,β^j,ρ^j)hi1(α^j,β^j,ρ^j)−hi32(α^j,β^j,ρ^j)hi2(α^j,β^j,ρ^j)⎦⎤⎣⎡C(CnCiq)⎝⎛100⎠⎞C(CnCiq)⎝⎛010⎠⎞CipCn⎦⎤
整体Jacobian矩阵和残差向量为:
J
=
[
J
1
J
2
⋮
J
m
]
e
=
[
e
1
e
2
⋮
e
m
]
J=\left[\begin{matrix}J_1 \\ J_2 \\ \vdots \\ J_m \end{matrix}\right] \quad e=\left[\begin{matrix}e_1 \\ e_2 \\ \vdots \\ e_m \end{matrix}\right]
J=⎣⎢⎢⎢⎡J1J2⋮Jm⎦⎥⎥⎥⎤e=⎣⎢⎢⎢⎡e1e2⋮em⎦⎥⎥⎥⎤
利用Levenberg-Marquart方法迭代:
(
J
H
J
+
λ
I
)
δ
=
J
H
e
(J^{H}J+\lambda I)\delta =J^H e
(JHJ+λI)δ=JHe
(
α
^
j
,
β
^
j
,
ρ
^
j
)
=
(
α
^
j
,
β
^
j
,
ρ
^
j
)
+
δ
(\hat \alpha_j,\hat \beta_j,\hat \rho_j)=(\hat \alpha_j,\hat \beta_j,\hat \rho_j)+\delta
(α^j,β^j,ρ^j)=(α^j,β^j,ρ^j)+δ
最后将
C
n
C_n
Cn坐标系下的特征点坐标转换到世界坐标系下:
G
p
^
f
j
=
1
ρ
^
j
C
(
G
C
n
q
^
)
T
[
α
^
j
β
^
j
1
]
+
G
p
^
C
n
^G\hat p_{f_j}=\frac{1}{\hat \rho_j}{C(^{C_n}_G\hat q)}^T \left[\begin{matrix} \hat \alpha_j \\ \hat \beta_j \\ 1 \end{matrix}\right]+ {^G\hat p_{C_n}}
Gp^fj=ρ^j1C(GCnq^)T⎣⎡α^jβ^j1⎦⎤+Gp^Cn
参考文献
(1) A Multi-State Constraint Kalman Filter for Vision-aided Inertial Navigation
(2) Robust Stereo Visual Inertial Odometry for Fast Autonomous Flight
(3) Indirect Kalman Filter for 3D Attitude Estimation