问题
如下公式(1)对应MSCKF论文中的公式(23),其表示特征
j
j
j与所有观测到该特征的状态构成的观测方程,但这个方程中的
G
p
~
j
{}^{G}\widetilde{\boldsymbol{p}}_{j}
Gp
j 是由状态
X
~
\widetilde{\boldsymbol{X}}
X
推导出来的,于是这两类状态之间存在耦合,这与EKF所要求的观测方程不一致,因此需要调整该观测方程。
r
(
j
)
≃
H
x
(
j
)
X
~
+
H
f
(
j
)
G
p
~
j
+
n
(
j
)
(1)
\mathbf{r}^{(j)} \simeq \mathbf{H}_{\mathbf{x}}^{(j)}\widetilde{\boldsymbol{X}} + \mathbf{H}_{f}^{(j)} {}^{G}\widetilde{\boldsymbol{p}}_{j} + \mathbf{n}^{(j)} \tag{1}
r(j)≃Hx(j)X
+Hf(j)Gp
j+n(j)(1)
调整的策略是只保留状态
X
~
\widetilde{\boldsymbol{X}}
X
而将
G
p
~
j
{}^{G}\widetilde{\boldsymbol{p}}_{j}
Gp
j 移除,那自然会想到在公式(1)左右两侧同时乘以"某个矩阵"使得右侧第二项直接变成
0
\mathbf{0}
0,而"某个矩阵"如果是
H
f
(
j
)
\mathbf{H}_{f}^{(j)}
Hf(j) 的左零空间构成的矩阵既可以达到这个效果。于是调整后观测方程为:
A
T
r
(
j
)
≃
A
T
H
x
(
j
)
X
~
+
A
T
H
f
(
j
)
G
p
~
j
+
A
T
n
(
j
)
r
o
(
j
)
≃
H
o
(
j
)
X
~
+
n
o
(
j
)
(2)
\begin{aligned} \mathbf{A}^{T}\mathbf{r}^{(j)} &\simeq\mathbf{A}^{T} \mathbf{H}_{\mathbf{x}}^{(j)}\widetilde{\boldsymbol{X}} + \mathbf{A}^{T}\mathbf{H}_{f}^{(j)} {}^{G}\widetilde{\boldsymbol{p}}_{j} + \mathbf{A}^{T}\mathbf{n}^{(j)}\\ \mathbf{r}_{o}^{(j)} &\simeq \mathbf{H}_{o}^{(j)}\widetilde{\boldsymbol{X}} + \mathbf{n}_{o}^{(j)} \tag{2} \end{aligned}
ATr(j)ro(j)≃ATHx(j)X
+ATHf(j)Gp
j+ATn(j)≃Ho(j)X
+no(j)(2)
式中
A
T
\mathbf{A}^{T}
AT即为
H
f
(
j
)
\mathbf{H}_{f}^{(j)}
Hf(j) 的左零空间构成的矩阵。
注: 零空间是满足 A x = 0 \mathbf{Ax}=\mathbf{0} Ax=0的所有 x \mathbf{x} x组成的空间,而左零空间是满足 x T A = 0 \mathbf{x}^{T}\mathbf{A}=\mathbf{0} xTA=0 ( A T x = 0 ) (\mathbf{A}^{T}\mathbf{x}=\mathbf{0}) (ATx=0)的所有 x \mathbf{x} x组成的空间
原理
假设特征点
p
j
\mathbf{p}_{j}
pj 被n个相机位姿看到,则可知
H
f
(
j
)
\mathbf{H}_{f}^{(j)}
Hf(j) 的维度为
2
n
×
3
(
n
>
1
)
2n\times 3(n>1)
2n×3(n>1),于是可对
H
f
(
j
)
\mathbf{H}_{f}^{(j)}
Hf(j) 进行QR分解得:
其中
Q
\mathbf{Q}
Q为正交矩阵,即该矩阵的所有列向量彼此正交,于是可知
Q
2
\mathbf{Q}_{2}
Q2 任意一列
q
2
i
\mathbf{q}_{2i}
q2i 满足
q
2
i
T
Q
1
=
0
\mathbf{q}_{2i}^{T}\mathbf{Q}_{1}=\mathbf{0}
q2iTQ1=0,根据左零空间的定义可知矩阵
Q
2
\mathbf{Q}_{2}
Q2的所有列向量构成的空间即为
Q
1
\mathbf{Q}_{1}
Q1 的左零空间,所以可得
Q
2
T
Q
1
=
0
\mathbf{Q}_{2}^{T}\mathbf{Q}_{1}=\mathbf{0}
Q2TQ1=0,于是
Q
2
T
\mathbf{Q}_{2}^{T}
Q2T 即为公式(2)中的
A
T
\mathbf{A}^{T}
AT.
实现
利用eigen中的qr分解对象,按如下计算过程获得矩阵 H f \mathbf{H}_{f} Hf 的左零空间:
Eigen::ColPivHouseholderQR<Eigen::MatrixXd> qr(H_f.rows(), H_f.cols());
qr.compute(H_f);
Eigen::MatrixXd Q = qr.householderQ();
Eigen::MatrixXd Q1 = Q.block(0,0,Q.rows(),3);
Eigen::MatrixXd Q2 = Q.block(0,3,Q.rows(),Q.cols()-3);