SLAM如何在Ceres中计算残差对四元数的雅可比矩阵

姿态可以进行数学运算的表达式有两种。一种是四元数Q,一种是旋转矩阵R
假设在SLAM算法中构建了一个姿态残差如下:
e = Q v a r − 1 ∗ Q 2 e=Q_{var}^{-1}*Q_2 e=Qvar1Q2
或者 e = R v a r − 1 ∗ R 2 e=R_{var}^{-1}*R_2 e=Rvar1R2
其中 Q v a r , R v a r 是待优化变量, Q 2 , R 2 是约束 其中Q_{var},R_{var}是待优化变量,Q_2,R_2是约束 其中QvarRvar是待优化变量,Q2R2是约束
e 如何对 Q v a r 和 R v a r 求导? e如何对Q_{var}和R_{var}求导? e如何对QvarRvar求导?

通过四元数方法进行求导

残差对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[QijQi1Qj)]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(QijQi1Qj).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θQijQi1Qj[1θ]QijQi1Qj[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(QijQi1Qj)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(QijQi1Qj)就是残差对四元数的导数,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[Qimu1Qi].vec
其中 Q i 是待优化变量 , r q 对 Q i 求导 , 其表达式为: 其中Q_i是待优化变量,r_q对Q_i求导,其表达式为: 其中Qi是待优化变量,rqQi求导,其表达式为:
R l e f t ( Q i m u − 1 ⊗ Q i ) R_{left}(Q_{imu}^{-1} \otimes Q_i) Rleft(Qimu1Qi)
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值