四元数及error-state kalman | HyperPlane

四元数及error-state kalman

四元数相关的基本推导,主要是扰动相关。然后记下了一些error-state kalman相关的公式。

不做具体说明时,都是右手系

四元数乘法

q⊗p≠p⊗qq \otimes p \neq p \otimes q

其中⊗\otimes为四元数乘法,pp和qq为四元数,四元数乘法满足结合律和分配律。四元数乘法为二元运算,可以写成两种等价的形式:

q⊗p=[q]Lp=[p]Rqq \otimes p = {[q]}_L p = {[p]}_Rq

[q]L=qwI+[0−qvTqv[qv]×][q]_L = q_wI + \begin{bmatrix} 0 & -q_v^T \\ q_v & [q_v]_{\times} \end{bmatrix}

[q]R=qwI+[0−qvTqv−[qv]×][q]_R = q_wI + \begin{bmatrix} 0 & -q_v^T \\ q_v & -[q_v]_{\times} \end{bmatrix}

其中q=(qw,qv)q = (q_w, q_v),qwq_w为实数,qvq_v为其中虚数向量。

左手系和右手系在四元数计算上的区别:

  • 右手系:ij=−ji=kij = -ji = k, jk=−kj=ijk = -kj = i,ki=−ik=jki = -ik = j
  • 左手系:ij=−ji=−kij = -ji = -k,jk=−kj=−ijk = -kj = -i,ki=−ik=−jki = -ik = -j

Eigen中的四元数运算如果使用方法 coeffs()输出系数,输出的向量是按照(qv,qw)(q_v,q_w)排列的。在Eigen中四元数的构造函数中,输入参数顺序是按照(qw,qv)(q_w,q_v)排列的。所以想使用四元数乘法的时候可以构造四元数使用Eigen的四元数相乘函数来避免这些问题。但是想使用Eigen的四元数系数进行四元数乘法运算时(尤其对于论文里面经常提到的Ω\Omega矩阵),其形式为
[q]L=qwI+[[qv]×qv−qvT0][q]_L = q_wI +\begin{bmatrix}[q_v]_{\times} & q_v \\-q_v^T & 0\end{bmatrix}
[q]R=qwI+[−[qv]×qv−qvT0][q]_R = q_wI +\begin{bmatrix}-[q_v]_{\times} & q_v \\-q_v^T & 0\end{bmatrix}
当然计算结果自然是按照(qv,qw)(q_v,q_w)排列的四元数

由于

q⊗r⊗p=[p]R[q]Lrq \otimes r \otimes p = [p]_R[q]_Lr

q⊗r⊗p=[q]L[p]Rrq \otimes r \otimes p = [q]_L[p]_Rr

因此有[p]R[q]L=[q]L[p]R[p]_R[q]_L = [q]_L[p]_R


扰动及求导

先交代一些东西

qAB⊗qBC=qACq_{AB} \otimes q_{BC} = q_{AC}

RABRBC=RACR_{AB} R_{BC} = R_{AC}

Δq=[112Δθ]+O(∥Δθ∥2)\Delta q = \begin{bmatrix} 1 \\ \frac{1}{2} \Delta \theta \end{bmatrix} + O \left( \| \Delta \theta \|^2 \right)

ΔR=I+[Δθ]×+O(∥Δθ∥2)\Delta R = I + [\Delta \theta]_{\times} + O\left( \| \Delta \theta \|^2 \right)

下文可能使用局部到全局坐标系的变换更容易理解

局部扰动

局部扰动也就是把扰动加在目前的坐标系数据下,然后再通过坐标系之间的关系变到其他坐标系下,具体形式为:

q~=q⊗Δq\tilde{q} = q \otimes \Delta q

R~=RΔR\tilde{R} = R \Delta R

其扰动放在右边,其原因为qAB′=qAB⊗qBB′q_{AB'} = q_{AB} \otimes q_{BB'},可以满足先对局部数据进行扰动调整再通过坐标系关系变换到其他坐标系下。典型的应用为IMU预积分,具体形式为qGIk+1=qGIk⊗qIkIk+1q_{GI_{k+1}} = q_{GI_{k}} \otimes q_{I_{k}I_{k+1}}。旋转矩阵形式类似。其对时间求导形式为:

q˙=12Ω(ω)q=12q⊗ω\dot{q} = \frac{1}{2} \Omega(\omega) q = \frac{1}{2} q \otimes \omega

R˙=R[ω]×\dot{R} = R[\omega]_{\times}

其中ω\omega为局部角速度(当前坐标系的角速度),Ω(ω)\Omega(\omega)为[ω]R[\omega]_R(不要在意维数的问题)。具体推导如下:

q˙=lim⁡Δt→0q(t+Δt)−q(t)Δt=lim⁡Δt→0q⊗Δq−qΔt=lim⁡Δt→0q⊗([1Δθ/2]−[10])Δt=lim⁡Δt→0q⊗([0Δθ/2])Δt=12q⊗[0ωL]R˙=lim⁡Δt→0R(t+Δt)−R(t)Δt=lim⁡Δt→0RΔR−RΔt=lim⁡Δt→0R(ΔR−I)Δt=lim⁡Δt→0R[Δθ]×Δt=R[ω]×\begin{aligned} \dot{q} &= \lim_{\Delta t \rightarrow 0} \frac{q(t + \Delta t) - q(t)}{\Delta t} \\ &= \lim_{\Delta t \rightarrow 0} \frac{q \otimes \Delta q - q}{\Delta t} \\ &= \lim_{\Delta t \rightarrow 0} \frac{q \otimes \left(\begin{bmatrix}1 \\ \Delta \theta/2 \end{bmatrix} - \begin{bmatrix} 1 \\ 0 \end{bmatrix} \right)}{\Delta t} \\ &= \lim_{\Delta t \rightarrow 0} \frac{q \otimes \left(\begin{bmatrix}0 \\ \Delta \theta/2 \end{bmatrix} \right)}{\Delta t} \\ &= \frac{1}{2} q \otimes \begin{bmatrix} 0 \\ \omega_L \end{bmatrix} \\ \\ \dot{R} &= \lim_{\Delta t \rightarrow 0} \frac{R(t + \Delta t) - R(t)}{\Delta t} \\ &= \lim_{\Delta t \rightarrow 0} \frac{R \Delta R - R}{\Delta t} \\ &= \lim_{\Delta t \rightarrow 0} \frac{R (\Delta R - I)}{\Delta t} \\ &= \lim_{\Delta t \rightarrow 0} \frac{R [\Delta \theta]_{\times}} {\Delta t} \\ &= R[\omega]_{\times} \end{aligned}

全局扰动

和局部扰动相对,也就是先通过坐标系的关系变换到其他坐标系下再进行扰动。具体形式为:

q~=Δq⊗q\tilde{q} = \Delta q \otimes q

R~=ΔRR\tilde{R} = \Delta R R

由于qA′B=qA′AqABq_{A'B} = q_{A'A}q_{AB},也就是扰动没有加在局局部下,是加在了坐标系之间的变换这种全局关系中。其时间导数为:

q˙=12[ω]Lq=12ω⊗q\dot{q} = \frac{1}{2} [\omega]_L q = \frac{1}{2} \omega \otimes q

R˙=[ω]×R\dot{R} = [\omega]_{\times} R

其中ω\omega是全局角速度,也就是要目标坐标系下的角速度,不是当前坐标系下的角速度。

其他的求导

∂(q⊗a⊗q∗)∂θ=∂(Ra)∂θ=lim⁡∂θ→0R{θ+∂θ}a−Ra∂θ=lim⁡∂θ→0(I+[∂θ]×)Ra−Ra∂θ=−[Ra]×∂(q⊗a⊗q∗)∂q=∂(Ra)∂q=2[qwa+qv×a∣qvTaI+qvaT−aqvT−qw[a]×]\begin{aligned} \frac{\partial (q \otimes a \otimes q^*)}{\partial \theta} &= \frac{\partial (Ra)}{\partial \theta} \\ &= \lim_{\partial \theta \rightarrow 0} \frac{R\{ \theta + \partial \theta \}a - Ra}{\partial \theta} \\ &= \lim_{\partial \theta \rightarrow 0} \frac{(I + [\partial \theta]_{\times})Ra - Ra}{\partial \theta} \\ &= -\left[ Ra \right]_{\times} \\ \\ \frac{\partial (q \otimes a \otimes q^*)}{\partial q} &= \frac{\partial (Ra)}{\partial q} \\ &= 2 \left[ q_w a + q_v \times a | q_v^T a I + q_v a^T - a q_v^T - q_w [a]_{\times} \right] \end{aligned}


旋转矩阵与四元数关系

(不要在意维数的细节问题)

q⊗r⊗q∗=Rrq \otimes r \otimes q^* = Rr

R4=[q∗]R[q]L=[q]L[q∗]R=[100R] R_4 = [q^*]_R[q]_L = [q]_L[q^*]_R = \begin{bmatrix} 1 & 0 \\ 0 & R \end{bmatrix}


系统运动(局部)

连续时间

论文里面多是给的连续时间的推导结果
true state:

p˙t=vt\dot{p}_t = v_t

v˙t=Rt(am−abt−an)+gt\dot{v}_t = R_t(a_m - a_{bt} - a_n) + g_t

q˙t=12qt⊗(ωm−ωbt−ωn)\dot{q}_t = \frac{1}{2} q_t \otimes (\omega_m - \omega_{bt} - \omega_n)

a˙bt=aw\dot{a}_{bt} = a_w

ω˙bt=ωw\dot{\omega}_{bt} = \omega _w

g˙t=0\dot{g}_t = 0

其中ama_m与ωm\omega_m为测量值,abta_{bt}与ωbt\omega_{bt}为true bias,ana_n与ωn\omega_n为噪声。
nominal state:

p˙=v\dot{p} = v

v˙=R(am−ab)+g\dot{v} = R(a_m - a_b) + g

q˙=12q⊗(ωm−ωb)\dot{q} = \frac{1}{2} q \otimes (\omega_m - \omega_b)

a˙b=0\dot{a}_b = 0

ω˙b=0\dot{\omega}_b = 0

g˙=0\dot{g} = 0

error state:

δp˙=δv\dot{\delta p} = \delta v

δv˙=−R[am−ab]×δθ−Rδab+δg−Ran\dot{\delta v} = -R[a_m - a_b]_{\times} \delta \theta - R \delta a_b + \delta g - Ra_n

δθ˙=−[ωm−ωb]×δθ−δωb−ωn\dot{\delta \theta} = -[\omega_m - \omega_b]_{\times}\delta\theta - \delta \omega_b - \omega_n

δab˙=aw\dot{\delta a_b} = a_w

ωb˙=ωw\dot{\omega_b} = \omega_w

δg˙=0\dot{\delta g} = 0

TODO:δv˙\dot{\delta v}和δθ˙\dot{\delta \theta}的推导有时间补上

离散时间

其实和连续时间没差多少,就是把导数变成已经积分好的x←x+x˙Δtx \leftarrow x + \dot{x}\Delta t。数值积分方法还可以使用其他的,之后的具体形式都需要重新推导,这里是示例。
nominal state:

p←p+vΔt+12(R(am−ab)+g)Δt2p \leftarrow p + v\Delta t + \frac{1}{2} (R(a_m - a_b) + g)\Delta t^2

v←v+(R(am−ab)+g)Δtv \leftarrow v + (R(a_m - a_b) + g) \Delta t

q←q⊗q{(ωm−ωb)Δt}q \leftarrow q \otimes q\{ (\omega_m - \omega_b)\Delta t \}

ab←aba_b \leftarrow a_b

ωb←ωb\omega_b \leftarrow \omega_b

g←gg \leftarrow g

error state:

δp←δp+δvΔt\delta p \leftarrow \delta p + \delta v \Delta t

δv←δv+(−R[am−ab]×δθ−Rδab+δg)Δt+vi\delta v \leftarrow \delta v + (-R[a_m-a_b]_{\times}\delta \theta - R\delta a_b + \delta g) \Delta t + v_i

δθ←RT{(ωm−ωb)Δt}δθ−δωbΔt+θi\delta \theta \leftarrow R^T\{ (\omega_m - \omega_b) \Delta t \}\delta \theta - \delta \omega_b \Delta t + \theta_i

δab←δab+ai\delta a_b \leftarrow \delta a_b + a_i

δωb←δωb+ωi\delta \omega_b \leftarrow \delta \omega_b + \omega_i

δg←δg\delta g \leftarrow \delta g

FF矩阵可以通过以上内容很容易推导出来,具体形式懒得写了。
error state的期望为00,在预测的过程中就是为了计算协方差矩阵,改变当前期望分布