姿态可以进行数学运算的表达式有两种。一种是四元数Q,一种是旋转矩阵R。
假设在SLAM算法中构建了一个姿态残差如下:
e
=
Q
v
a
r
−
1
∗
Q
2
e=Q_{var}^{-1}*Q_2
e=Qvar−1∗Q2
或者
e
=
R
v
a
r
−
1
∗
R
2
e=R_{var}^{-1}*R_2
e=Rvar−1∗R2
其中
Q
v
a
r
,
R
v
a
r
是待优化变量,
Q
2
,
R
2
是约束
其中Q_{var},R_{var}是待优化变量,Q_2,R_2是约束
其中Qvar,Rvar是待优化变量,Q2,R2是约束
e
如何对
Q
v
a
r
和
R
v
a
r
求导?
e如何对Q_{var}和R_{var}求导?
e如何对Qvar和Rvar求导?
通过四元数方法进行求导
残差对Manifold变量求导
在VINS-MONO中预计分的姿态约束公式如下:
r
q
=
2
∗
[
Q
i
j
⊗
(
Q
i
−
1
⊗
Q
j
)
]
v
e
c
r_q =2*[ Q_i^j\otimes(Q_i^{-1}\otimes Q_j)]_{vec}
rq=2∗[Qij⊗(Qi−1⊗Qj)]vec
其中
Q
i
j
表示
i
,
j
帧之间的姿态预积分的逆
,
Q
i
,
Q
j
表示第
i
,
j
帧的姿态是待优化的量
其中Q_i^j表示i,j帧之间的姿态预积分的逆,Q_i,Q_j表示第i,j帧的姿态是待优化的量
其中Qij表示i,j帧之间的姿态预积分的逆,Qi,Qj表示第i,j帧的姿态是待优化的量
然后
r
q
对姿态
Q
j
求导,
J
r
Q
=
R
l
e
f
t
(
Q
i
j
⊗
Q
i
−
1
⊗
Q
j
)
.
b
o
t
t
o
m
R
i
g
h
t
C
o
r
n
e
r
<
3
,
3
>
(
)
然后r_q对姿态Q_j求导,J_r^Q=R_{left}(Q_i^j \otimes Q_i^{-1} \otimes Q_j).bottomRightCorner<3, 3>()
然后rq对姿态Qj求导,JrQ=Rleft(Qij⊗Qi−1⊗Qj).bottomRightCorner<3,3>()
V
I
N
S
M
O
N
O
中是通过右扰动的方式推导残差对四元数的导数
VINS MONO中是通过右扰动的方式推导残差对四元数的导数
VINSMONO中是通过右扰动的方式推导残差对四元数的导数
以对
Q
j
为例
,
对
Q
j
右乘一个小扰动
[
1
θ
]
:
以对Q_j为例,对Qj右乘一个小扰动\begin{bmatrix} 1 \\ \theta \end{bmatrix}:
以对Qj为例,对Qj右乘一个小扰动[1θ]:
l
i
m
θ
→
0
Q
i
j
⊗
Q
i
−
1
⊗
(
Q
j
⊗
[
1
θ
]
)
−
Q
i
j
⊗
Q
i
−
1
⊗
(
Q
j
⊗
[
1
0
]
)
θ
lim_{\theta \to 0} \frac{ Q_i^j\otimes Q_i^{-1}\otimes (Q_j \otimes \begin{bmatrix} 1 \\ \theta \end{bmatrix})-Q_i^j\otimes Q_i^{-1}\otimes (Q_j \otimes \begin{bmatrix} 1 \\ 0 \end{bmatrix})} {\theta}
limθ→0θQij⊗Qi−1⊗(Qj⊗[1θ])−Qij⊗Qi−1⊗(Qj⊗[10])
=
R
l
e
f
t
(
Q
i
j
⊗
Q
i
−
1
⊗
Q
j
)
l
i
m
θ
→
0
[
1
θ
]
−
[
1
0
]
θ
=R_{left}(Q_i^j \otimes Q_i^{-1} \otimes Q_j)lim_{\theta \to 0} \frac{ \begin{bmatrix} 1 \\ \theta \end{bmatrix}-\begin{bmatrix} 1 \\ 0 \end{bmatrix}} {\theta}
=Rleft(Qij⊗Qi−1⊗Qj)limθ→0θ[1θ]−[10]
R
l
e
f
t
(
Q
i
j
⊗
Q
i
−
1
⊗
Q
j
)
就是残差对四元数的导数,
R
l
e
f
t
表示四元数左矩阵
R_{left}(Q_i^j \otimes Q_i^{-1} \otimes Q_j)就是残差对四元数的导数,R_{left}表示四元数左矩阵
Rleft(Qij⊗Qi−1⊗Qj)就是残差对四元数的导数,Rleft表示四元数左矩阵
因为VINS MONO只取了四元数的虚部作为残差,所以只取了矩阵的下面三行。
具体推导过程可以看这个链接的第42页VINS MONO公式推导
四元数的基础概念可以查看下述链接四元数速查手册
Manifold变量对Tangent变量求导
然后VINS MONO在LocalParameterization类中定义了四元数Manifold
空间相对于Tangent
空间的jacobian
矩阵:
l
i
m
θ
→
0
[
1
θ
]
−
[
1
0
]
θ
=
∂
[
1
θ
]
θ
lim_{\theta \to 0} \frac{ \begin{bmatrix} 1 \\ \theta \end{bmatrix}-\begin{bmatrix} 1 \\ 0 \end{bmatrix}} {\theta} = \frac{\partial\begin{bmatrix} 1 \\ \theta \end{bmatrix}}{\theta}
limθ→0θ[1θ]−[10]=θ∂[1θ]
结果如下:前三行是位置的和姿态无关不用管,后四行是姿态的。
J
m
a
n
i
f
o
l
d
t
a
n
g
e
n
t
=
[
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
]
J_{manifold}^{tangent}=\begin{bmatrix} 1 & 0 & 0& 0 & 0& 0 \\ 0 & 1 & 0& 0 & 0& 0\\ 0 & 0 &1& 0 & 0& 0\\ 0 & 0 &0& 1 & 0& 0\\ 0 & 0 &0& 0 & 1& 0\\ 0 & 0 &0& 0 & 0& 1\\ 0 & 0 &0& 0 & 0& 0\\ \end{bmatrix}
Jmanifoldtangent=
100000001000000010000000100000001000000010
VINS MONO中LocalParameterization中ComputeJacobian是
∂
[
1
θ
]
θ
\frac{\partial\begin{bmatrix} 1 \\ \theta \end{bmatrix}}{\theta}
θ∂[1θ]
VINS MONO的结果是
[
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
]
\begin{bmatrix}1 &0 & 0 &0 \\0 &1 & 0 &0 \\0 & 0 & 1 &0 \\0 &0 & 0 &0 \\\end{bmatrix}
1000010000100000
其中全是0的那行从第一行放到第四行。其对应的残差对Manifold变量求导的雅可比矩阵中第一列放到最后一列。
Ceres中自带的QuaternionParameterization 中ComputeJacobian是:
∂
Q
⊗
[
1
θ
]
θ
\frac{\partial Q \otimes \begin{bmatrix} 1 \\ \theta \end{bmatrix}}{\theta}
θ∂Q⊗[1θ]
其结果是:
Ceres根据链式法则
最终计算 残差对Manifold变量的雅可比矩阵
和Manifold变量对Tangent变量的雅可比矩阵
的乘积
。殊途同归,两种方法只要最后的雅可比矩阵相同就行。关于LocalParameterization
类型变量雅可比矩阵计算方式可以看我另一篇博客:
Ceres中LocalParameterization参数Jacobian矩阵计算过程
自定义的角度约束残差推导
然后借鉴VINS-MONO中求导的方法,自己定义的残差:
r
q
=
2
∗
[
Q
i
m
u
−
1
⊗
Q
i
]
.
v
e
c
r_q = 2*[Q_{imu}^{-1} \otimes Q_i].vec
rq=2∗[Qimu−1⊗Qi].vec
其中
Q
i
是待优化变量
,
r
q
对
Q
i
求导
,
其表达式为:
其中Q_i是待优化变量,r_q对Q_i求导,其表达式为:
其中Qi是待优化变量,rq对Qi求导,其表达式为:
R
l
e
f
t
(
Q
i
m
u
−
1
⊗
Q
i
)
R_{left}(Q_{imu}^{-1} \otimes Q_i)
Rleft(Qimu−1⊗Qi)
LocalParameterization中定义的jacobian为:
[
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
0
]
\begin{bmatrix}1 &0 & 0 &0 \\0 &1 & 0 &0 \\0 & 0 & 1 &0 \\0 &0 & 0 &0 \\\end{bmatrix}
1000010000100000
其对应的残差对Manifold变量求导的雅可比矩阵中第一列放到最后一列。
开始用上述雅可比矩阵求导的时候,发现残差并不会收敛,发现是没有加Eigen::RowMajor
。