MSCKF2讲:JPL四元数与Hamilton四元数

MSCKF2讲:JPL四元数与Hamilton四元数

文章目录

  • MSCKF2讲:JPL四元数与Hamilton四元数
  • 2 JPL四元数
    • 2.1 定义与区别
    • 2.2 JPL四元数的乘法
    • 2.3 反对称矩阵
    • 2.4 Ω ( ω ) \Omega(\omega) Ω(ω)矩阵
    • 2.5 JPL四元数与旋转矩阵的转换
    • 2.6 JPL四元数导数
    • 2.7 JPL四元数积分
      • 2.7.1 0阶积分
      • 2.7.2 1阶积分
  • 3 JPL与Hamilton的区别
    • 3.1 转换方向
    • 3.2 四元数与旋转向量的转换
    • 3.3 四元数与旋转矩阵的转换
    • 3.4 四元数的乘法
    • 3.5 四元数的导数
    • 3.6 四元数的扰动

  本文总结了MSCKF中使用的JPL四元数,并且与Hamilton四元数进行了对比,主要参考了以下两篇论文。所有更加详细内容都可以在论文中找到。

论文1:Indirect Kalman Filter for 3D Attitude Estimation
论文2:Quaternion kinematics for the error-state Kalman filter

2 JPL四元数

参考Indirect Kalman Filter for 3D Attitude Estimation论文

2.1 定义与区别

  一个四元数可以表示为(不分种类)
q = q 0 + q 1 i + q 2 j + q 3 k \boldsymbol{q}=q_0+q_1 \mathrm{i}+\mathrm{q}_2 \mathrm{j}+\mathrm{q}_3 \mathrm{k} q=q0​+q1​i+q2​j+q3​k
  十四讲上的四元数是Hamilton四元数,符合右手定则;这里是JPL四元数,符合左手定则。

在这里插入图片描述

Hamilton四元数(右手)JPL四元数(左手)异同
i 2 = j 2 = k 2 = − 1 \mathrm{i}^2=\mathrm{j}^2=\mathrm{k}^2=-1 i2=j2=k2=−1 i 2 = j 2 = k 2 = − 1 \mathrm{i}^2=\mathrm{j}^2=\mathrm{k}^2=-1 i2=j2=k2=−1相同
i j = k , j i = − k \mathrm{ij}=\mathrm{k}, \mathrm{ji}=-\mathrm{k} ij=k,ji=−k i j = − k , j i = k \mathrm{ij}=\mathrm{-k}, \mathrm{ji}=\mathrm{k} ij=−k,ji=k不相同
j k = i , k j = − i \mathrm{jk}=\mathrm{i}, \mathrm{kj}=-\mathrm{i} jk=i,kj=−i j k = − i , k j = i \mathrm{jk}=-\mathrm{i}, \mathrm{kj}=\mathrm{i} jk=−i,kj=i不相同
k i = j , i k = − j \mathrm{ki}=\mathrm{j}, \mathrm{ik}=-\mathrm{j} ki=j,ik=−j k i = − j , i k = j \mathrm{ki}=-\mathrm{j}, \mathrm{ik}=\mathrm{j} ki=−j,ik=j不相同

在JPL四元数中,表示为 q = [ q 1 q 2 q 3 q 0 ] T {q}=\left[\begin{array}{cccc}q_1&q_2&q_3&q_0\end{array}\right]^T q=[q1​​q2​​q3​​q0​​]T,虚部在前,实部在后!

在Hamilton四元数中,表示为 q = [ q 0 q 1 q 2 q 3 ] T {q}=\left[\begin{array}{cccc}q_0&q_1&q_2&q_3\end{array}\right]^T q=[q0​​q1​​q2​​q3​​]T,实部在前,虚部在后!

  一个四元数可以通过角轴表示, θ \theta θ和 n n n分别表示转轴和转角(注意两种四元素实虚部不一样,下面是Hamilton四元数,JPL四元数把虚部和实部反过来即可)。
q = [ cos ⁡ θ 2 , n sin ⁡ θ 2 ] T { θ = 2 arccos ⁡ q 0 [ n x , n y , n z ] T = [ q 1 , q 2 , q 3 ] T / sin ⁡ θ 2 . {\mathbf{q}}=[\cos\frac{\theta}{2},n\sin\frac{\theta}{2}]^\mathrm{T}\\ \left\{\begin{array}{l} \theta=2 \arccos q_0 \\ {\left[n_x, n_y, n_z\right]^{\mathrm{T}}=\left[q_1, q_2, q_3\right]^{\mathrm{T}} / \sin \frac{\theta}{2}} \end{array} .\right. q=[cos2θ​,nsin2θ​]T{θ=2arccosq0​[nx​,ny​,nz​]T=[q1​,q2​,q3​]T/sin2θ​​.
  我们称这种四元数为旋转四元数,也是单位四元数。

∣ q ˉ ∣ = q ˉ T q ˉ = ∣ q ∣ 2 + q 0 2 = 1 |\bar{q}|=\sqrt{\bar{q}^\mathrm{T}\bar{q}}=\sqrt{|\mathbf{q}|^2+q_0^2}=1 ∣qˉ​∣=qˉ​Tqˉ​ ​=∣q∣2+q02​ ​=1

注意:

① 四元数q和四元数−q描述旋转到相同的最终坐标系位置!q0取负相当于π-θ/2,对于θ来说就是2π-θ,实部sin(π-θ/2)=sin(θ/2),所以符号到了旋转轴上,旋转轴不管左手系还是右手系,取负相当于原来的逆方向!而角度刚好也是2π-θ,所以实际上旋转的还是原来的方向!唯⼀的区别是到达目标的旋转方向,具有正标量元素q0的四元数描述最短旋转!(同理,+R和-R描述的是相同的旋转)

公式cos(π-θ) = -cos(θ), sin(π-θ) = sin(θ)

② 不要把四元数 q q q和四元数的逆 q − 1 q^{-1} q−1搞混,它们描述相反的旋转

2.2 JPL四元数的乘法

Indirect Kalman Filter for 3D Attitude Estimation论文1.2节

  注意这里也是和Hamilton四元数一个不同之处!这也会使得两种四元数和旋转矩阵的转换公式不一致。

1 乘法

q ˉ ⊗ p ˉ = ( q 0 + q 1 i + q 2 j + q 3 k ) ( p 0 + p 1 i + p 2 j + p 3 k ) = q 0 p 0 − q 1 p 1 − q 2 p 2 − q 3 p 3 + ( q 0 p 1 + q 1 p 0 − q 2 p 3 + q 3 p 2 ) i + ( q 0 p 2 + q 2 p 0 − q 3 p 1 + q 1 p 3 ) j + ( q 0 p 3 + q 3 p 0 − q 1 p 2 + q 2 p 1 ) k = [ q 0 p 1 + q 3 p 2 − q 2 p 3 + q 1 p 0 − q 3 p 1 + q 0 p 2 + q 1 p 3 + q 2 p 0 q 2 p 1 − q 1 p 2 + q 0 p 3 + q 3 p 0 − q 1 p 1 − q 2 p 2 − q 3 p 3 + q 0 p 0 ] \begin{aligned} \bar{q}\otimes\bar{p}& =(q_0+q_1\mathbf{i}+q_2\mathbf{j}+q_3\mathbf{k})\left(p_0+p_1\mathbf{i}+p_2\mathbf{j}+p_3\mathbf{k}\right) \\ &=q_0p_0-q_1p_1-q_2p_2-q_3p_3+(q_0p_1+q_1p_0-q_2p_3+q_3p_2)\mathbf{i} \\ &+\left(q_0p_2+q_2p_0-q_3p_1+q_1p_3\right)\mathbf{j}+\left(q_0p_3+q_3p_0-q_1p_2+q_2p_1\right)\mathbf{k} \\ &\left.=\left[\begin{array}{c}q_0p_1+q_3p_2-q_2p_3+q_1p_0\\-q_3p_1+q_0p_2+q_1p_3+q_2p_0\\q_2p_1-q_1p_2+q_0p_3+q_3p_0\\-q_1p_1-q_2p_2-q_3p_3+q_0p_0\end{array}\right.\right]\\ \end{aligned} qˉ​⊗pˉ​​=(q0​+q1​i+q2​j+q3​k)(p0​+p1​i+p2​j+p3​k)=q0​p0​−q1​p1​−q2​p2​−q3​p3​+(q0​p1​+q1​p0​−q2​p3​+q3​p2​)i+(q0​p2​+q2​p0​−q3​p1​+q1​p3​)j+(q0​p3​+q3​p0​−q1​p2​+q2​p1​)k= ​q0​p1​+q3​p2​−q2​p3​+q1​p0​−q3​p1​+q0​p2​+q1​p3​+q2​p0​q2​p1​−q1​p2​+q0​p3​+q3​p0​−q1​p1​−q2​p2​−q3​p3​+q0​p0​​ ​​

= [ q 0 q 3 − q 2 q 1 − q 3 q 0 q 1 q 2 q 2 − q 1 q 0 q 3 − q 1 − q 2 − q 3 q 0 ] [ p 1 p 2 p 3 p 0 ] =\left.\left[\begin{array}{cccc}q_0&q_3&-q_2&q_1\\-q_3&q_0&q_1&q_2\\q_2&-q_1&q_0&q_3\\-q_1&-q_2&-q_3&q_0\end{array}\right.\right]\left[\begin{array}{c}p_1\\p_2\\p_3\\p_0\end{array}\right] = ​q0​−q3​q2​−q1​​q3​q0​−q1​−q2​​−q2​q1​q0​−q3​​q1​q2​q3​q0​​ ​ ​p1​p2​p3​p0​​ ​

/* @brief Perform q1 * q2 */		// 注意代码中q=(q0,q1,q2,q3)  q3是实部,q0,q1,q2对应虚部
inline Eigen::Vector4d quaternionMultiplication(const Eigen::Vector4d& q1,const Eigen::Vector4d& q2) {Eigen::Matrix4d L;L(0, 0) =  q1(3); L(0, 1) =  q1(2); L(0, 2) = -q1(1); L(0, 3) =  q1(0);L(1, 0) = -q1(2); L(1, 1) =  q1(3); L(1, 2) =  q1(0); L(1, 3) =  q1(1);L(2, 0) =  q1(1); L(2, 1) = -q1(0); L(2, 2) =  q1(3); L(2, 3) =  q1(2);L(3, 0) = -q1(0); L(3, 1) = -q1(1); L(3, 2) = -q1(2); L(3, 3) =  q1(3);Eigen::Vector4d q = L * q2;		// JPL四元数乘法quaternionNormalize(q);			// 每次归一化四元数return q;
}

2 对某一个四元数虚部定义反对称矩阵简化运算。重新定义JPL四元数 q = [ v , s ] T q = [v,s]^T q=[v,s]T,其中 v = [ q 1 , q 2 , q 3 ] T v = [q_1,q_2,q_3]^T v=[q1​,q2​,q3​]T是虚部, s = q 0 s = q_0 s=q0​是实部!

⌊ v × ⌋ = [ 0 − q 3 q 2 q 3 0 − q 1 − q 2 q 1 0 ] \left.\lfloor\mathbf{v}\times\rfloor=\left[\begin{array}{ccc}0&-q_3&q_2\\q_3&0&-q_1\\-q_2&q_1&0\end{array}\right.\right] ⌊v×⌋= ​0q3​−q2​​−q3​0q1​​q2​−q1​0​ ​

  所以,四元数乘法可以简化为下面的式子,通过下表s和v来区分四元数pq的实部与虚部
q ˉ ⊗ p ˉ = L ( q ˉ ) p ˉ = [ q 0 q 3 − q 2 q 1 − q 3 q 0 q 1 q 2 q 2 − q 1 q 0 q 3 − q 1 − q 2 − q 3 q 0 ] [ p 1 p 2 p 3 p 0 ] q ˉ ⊗ p ˉ = L ( q ˉ ) p ˉ = [ q s I 3 × 3 − ⌊ q v × ⌋ q v − q v T q s ] [ p v p s ] \begin{gathered} \bar{q}\otimes\bar{p}=\mathcal{L}(\bar{q})\bar{p}=\left.\left[\begin{array}{cccc}q_0&q_3&-q_2&q_1\\-q_3&q_0&q_1&q_2\\q_2&-q_1&q_0&q_3\\-q_1&-q_2&-q_3&q_0\end{array}\right.\right]\left[\begin{array}{c}p_1\\p_2\\p_3\\p_0\end{array}\right] \\ \bar{q}\otimes\bar{p} \left.=\mathcal{L}(\bar{q})\bar{p}=\left[\begin{array}{cc}q_s\mathbf{I}_{3\times3}-\lfloor\mathbf{q}_v\times\rfloor&\mathbf{q}_v\\-\mathbf{q}_v^\mathrm{T}&q_s\end{array}\right.\right]\left[\begin{array}{c}\mathbf{p}_v\\p_s\end{array}\right] \end{gathered} qˉ​⊗pˉ​=L(qˉ​)pˉ​= ​q0​−q3​q2​−q1​​q3​q0​−q1​−q2​​−q2​q1​q0​−q3​​q1​q2​q3​q0​​ ​ ​p1​p2​p3​p0​​ ​qˉ​⊗pˉ​=L(qˉ​)pˉ​=[qs​I3×3​−⌊qv​×⌋−qvT​​qv​qs​​][pv​ps​​]​
  同理,我们可以互换四元数pq
q ˉ ⊗ p ˉ = R ( p ˉ ) q ˉ = [ p 0 − p 3 p 2 p 1 p 3 p 0 − p 1 p 2 − p 2 p 1 p 0 p 3 − p 1 − p 2 − p 3 p 0 ] [ q 1 q 2 q 3 q 0 ] \left.\bar{q}\otimes\bar{p}=\mathcal{R}(\bar{p})\bar{q}=\left[\begin{array}{cccc}p_0&-p_3&p_2&p_1\\p_3&p_0&-p_1&p_2\\-p_2&p_1&p_0&p_3\\-p_1&-p_2&-p_3&p_0\end{array}\right.\right]\left[\begin{array}{c}q_1\\q_2\\q_3\\q_0\end{array}\right] qˉ​⊗pˉ​=R(pˉ​)qˉ​= ​p0​p3​−p2​−p1​​−p3​p0​p1​−p2​​p2​−p1​p0​−p3​​p1​p2​p3​p0​​ ​ ​q1​q2​q3​q0​​ ​

q ˉ ⊗ p ˉ = R ( p ˉ ) q ˉ = = [ p s I 3 × 3 + ⌊ p v × ⌋ p v − p v T p s ] [ q v q s ] \bar{q}\otimes\bar{p}=\mathcal{R}(\bar{p})\bar{q}=\left.=\left[\begin{array}{cc}p_s\mathbf{I}_{3\times3}+\lfloor\mathbf{p}_v\times\rfloor&\mathbf{p}_v\\-\mathbf{p}_v^\mathrm{T}&p_s\end{array}\right.\right]\left[\begin{array}{c}\mathbf{q}_v\\q_s\end{array}\right] qˉ​⊗pˉ​=R(pˉ​)qˉ​==[ps​I3×3​+⌊pv​×⌋−pvT​​pv​ps​​][qv​qs​​]

  结合上面两个式子,可以得到
L ( q ˉ − 1 ) = L T ( q ˉ ) R ( p ˉ − 1 ) = R T ( p ˉ ) \begin{aligned}\mathcal{L}(\bar{q}^{-1})&=\mathcal{L}^\mathrm{T}(\bar{q})\\\mathcal{R}(\bar{p}^{-1})&=\mathcal{R}^\mathrm{T}(\bar{p})\end{aligned} L(qˉ​−1)R(pˉ​−1)​=LT(qˉ​)=RT(pˉ​)​

4 对于单位旋转矩阵——对应四元数

q ˉ 0 = [ 0 0 0 1 ] T q ˉ ⊗ q ˉ 0 = q ˉ 0 ⊗ q ˉ = q ˉ \left.\bar{q}_0=\left[\begin{array}{cccc}0&0&0&1\end{array}\right.\right]^\mathrm{T}\\\bar{q}\otimes\bar{q}_0=\bar{q}_0\otimes\bar{q}=\bar{q} qˉ​0​=[0​0​0​1​]Tqˉ​⊗qˉ​0​=qˉ​0​⊗qˉ​=qˉ​

/** @brief 输入一个四元数,将其转换维单位四元数.*/
inline void quaternionNormalize(Eigen::Vector4d& q) {double norm = q.norm();q = q / norm;return;
}

5 四元数的逆 q − 1 q^{-1} q−1:转轴相同,转角相反。

q ˉ − 1 = [ − q v q s ] = [ − k ^ sin ⁡ ( θ / 2 ) cos ⁡ ( θ / 2 ) ] = [ k ^ sin ⁡ ( − θ / 2 ) cos ⁡ ( − θ / 2 ) ] \left.\bar{q}^{-1}=\left[\begin{array}{c}-\mathbf{q}_v\\q_s\end{array}\right.\right]=\left[\begin{array}{c}-\hat{\mathbf{k}}\sin(\theta/2)\\\cos(\theta/2)\end{array}\right]=\left[\begin{array}{c}\hat{\mathbf{k}}\sin(-\theta/2)\\\cos(-\theta/2)\end{array}\right] qˉ​−1=[−qv​qs​​]=[−k^sin(θ/2)cos(θ/2)​]=[k^sin(−θ/2)cos(−θ/2)​]

  也就是说,一个四元数乘以其逆,相当于没有旋转,即对应单位旋转。

2.3 反对称矩阵

  在线性代数中,反对称矩阵(或称斜对称矩阵)指转置矩阵和自身的加法逆元相等的方形矩阵。其满足: A T = − A A^{\mathsf{T}}=-A AT=−A或写作 A = ( a i j ) A=(a_{ij}) A=(aij​),各元素关系 a i j = − a j i a_{ij}=-a_{ji} aij​=−aji​

⌊ v × ⌋ = [ 0 − q 3 q 2 q 3 0 − q 1 − q 2 q 1 0 ] \left.\lfloor\mathbf{v}\times\rfloor=\left[\begin{array}{ccc}0&-q_3&q_2\\q_3&0&-q_1\\-q_2&q_1&0\end{array}\right.\right] ⌊v×⌋= ​0q3​−q2​​−q3​0q1​​q2​−q1​0​ ​

/*	math_utils.hpp */
inline Eigen::Matrix3d skewSymmetric(const Eigen::Vector3d& w) {Eigen::Matrix3d w_hat;w_hat(0, 0) = 0;w_hat(0, 1) = -w(2);w_hat(0, 2) = w(1);w_hat(1, 0) = w(2);w_hat(1, 1) = 0;w_hat(1, 2) = -w(0);w_hat(2, 0) = -w(1);w_hat(2, 1) = w(0);w_hat(2, 2) = 0;return w_hat;
}

1 反交换性

⌊ ω × ⌋ = − ⌊ ω × ⌋ T ⌊ a × ⌋ b = − ⌊ b × ⌋ a ⇔ a T ⌊ b × ⌋ = − b T ⌊ a × ⌋ \begin{aligned}\lfloor\boldsymbol{\omega}\times\rfloor&=-\lfloor\boldsymbol{\omega}\times\rfloor^\mathrm{T}\\\lfloor\mathbf{a}\times\rfloor\mathbf{b}&=-\lfloor\mathbf{b}\times\rfloor\mathbf{a}\\\Leftrightarrow\mathbf{a}^\mathrm{T}\lfloor\mathbf{b}\times\rfloor&=-\mathbf{b}^\mathrm{T}\lfloor\mathbf{a}\times\rfloor\end{aligned} ⌊ω×⌋⌊a×⌋b⇔aT⌊b×⌋​=−⌊ω×⌋T=−⌊b×⌋a=−bT⌊a×⌋​

2 分配律

⌊ a × ⌋ + ⌊ b × ⌋ = ⌊ a + b ⌋ × \lfloor\mathbf{a}\times\rfloor+\lfloor\mathbf{b}\times\rfloor=\lfloor\mathbf{a}+\mathbf{b}\rfloor\times ⌊a×⌋+⌊b×⌋=⌊a+b⌋×

3 同一向量叉积

ω × ( c ⋅ ω ) = c ⋅ ⌊ ω × ⌋ ω = − c ⋅ ( ω T ⌊ ω × ⌋ ) T = 0 3 × 1 \boldsymbol{\omega}\times(c\cdot\boldsymbol{\omega})=c\cdot\lfloor\boldsymbol{\omega}\times\rfloor\boldsymbol{\omega}=-c\cdot\left(\boldsymbol{\omega}^\mathrm{T}\lfloor\boldsymbol{\omega}\times\rfloor\right)^\mathrm{T}=\mathbf{0}_{3\times1} ω×(c⋅ω)=c⋅⌊ω×⌋ω=−c⋅(ωT⌊ω×⌋)T=03×1​

4 拉格朗日公式

⌊ a × ⌋ ⌊ b × ⌋ = b a T − ( a T b ) I 3 × 3 ⇔ a × ( b × c ) = b ( a T c ) − c ( a T b ) ⌊ a × ⌋ ⌊ b × ⌋ + a b T = ⌊ b × ⌋ ⌊ a × ⌋ + b a T ⌊ ( a × b ) × ⌋ = b a T − a b T ( = ( a × b ) × c ) \begin{gathered} \left\lfloor\mathbf{a}\times\right\rfloor\left\lfloor\mathbf{b}\times\right\rfloor=\mathbf{b}\mathbf{a}^\mathrm{T}-\left(\mathbf{a}^\mathrm{T}\mathbf{b}\right)\mathbf{I}_{3\times3} \\ \Leftrightarrow\mathbf{a}\times(\mathbf{b}\times\mathbf{c})=\mathbf{b}\left(\mathbf{a}^\mathrm{T}\mathbf{c}\right)-\mathbf{c}\left(\mathbf{a}^\mathrm{T}\mathbf{b}\right) \\ \lfloor\mathbf{a}\times\rfloor\lfloor\mathbf{b}\times\rfloor+\mathbf{a}\mathbf{b}^\mathrm{T}=\lfloor\mathbf{b}\times\rfloor\lfloor\mathbf{a}\times\rfloor+\mathbf{b}\mathbf{a}^\mathrm{T} \\ \lfloor(\mathbf{a}\times\mathbf{b})\times\rfloor=\mathbf{b}\mathbf{a}^\mathrm{T}-\mathbf{a}\mathbf{b}^\mathrm{T}(=(\mathbf{a}\times\mathbf{b})\times\mathbf{c}) \end{gathered} ⌊a×⌋⌊b×⌋=baT−(aTb)I3×3​⇔a×(b×c)=b(aTc)−c(aTb)⌊a×⌋⌊b×⌋+abT=⌊b×⌋⌊a×⌋+baT⌊(a×b)×⌋=baT−abT(=(a×b)×c)​

5 雅可比恒等式

⌊ a × ⌋ ⌊ b × ⌋ c + ⌊ b × ⌋ ⌊ c × ⌋ a + ⌊ c × ⌋ ⌊ a × ⌋ b = 0 \lfloor\mathbf{a}\times\rfloor\lfloor\mathbf{b}\times\rfloor\mathbf{c}+\lfloor\mathbf{b}\times\rfloor\lfloor\mathbf{c}\times\rfloor\mathbf{a}+\lfloor\mathbf{c}\times\rfloor\lfloor\mathbf{a}\times\rfloor\mathbf{b}=\mathbf{0} ⌊a×⌋⌊b×⌋c+⌊b×⌋⌊c×⌋a+⌊c×⌋⌊a×⌋b=0

6 旋转(重要!!!) 下面R是旋转矩阵

⌊ ( R a ) × ⌋ = R ⌊ a × ⌋ R T R ( a × b ) = ( R a ) × ( R b ) \begin{gathered}\lfloor\mathbf{(Ra)}\times\rfloor=\mathbf{R}\lfloor\mathbf{a}\times\rfloor\mathbf{R}^\mathrm{T}\\\mathbf{R}(\mathbf{a}\times\mathbf{b})=(\mathbf{Ra})\times(\mathbf{Rb})\end{gathered} ⌊(Ra)×⌋=R⌊a×⌋RTR(a×b)=(Ra)×(Rb)​

2.4 Ω ( ω ) \Omega(\omega) Ω(ω)矩阵

参考:论文Indirect Kalman Filter for 3D Attitude Estimation中1.3.2 Properties of the matrix Ω

  记向量 ω = ( ω x , ω y , ω z ) T \omega = (\omega_x,\omega_y,\omega_z)^T ω=(ωx​,ωy​,ωz​)T。

  这个矩阵用在向量和四元数的乘积中,例如用于四元数导数中
Ω ( ω ) = [ 0 ω z − ω y ω x − ω z 0 ω x ω y ω y − ω x 0 ω z − ω x − ω y − ω z 0 ] = [ − ⌊ ω × ⌋ ω − ω T 0 ] \left.\boldsymbol{\Omega}(\boldsymbol{\omega})=\left[\begin{array}{cccc}0&\omega_z&-\omega_y&\omega_x\\-\omega_z&0&\omega_x&\omega_y\\\omega_y&-\omega_x&0&\omega_z\\-\omega_x&-\omega_y&-\omega_z&0\end{array}\right.\right] \left.=\left[\begin{array}{cc}-\lfloor\boldsymbol{\omega}\times\rfloor&\boldsymbol{\omega}\\-\boldsymbol{\omega}^\mathrm{T}&0\end{array}\right.\right] Ω(ω)= ​0−ωz​ωy​−ωx​​ωz​0−ωx​−ωy​​−ωy​ωx​0−ωz​​ωx​ωy​ωz​0​ ​=[−⌊ω×⌋−ωT​ω0​]

平方

Ω ( ω ) 2 = [ ⌊ ω × ⌋ 2 − ω ω T − ⌊ ω × ⌋ ω ω T ⌊ ω × ⌋ − ω T ω ] = [ − ∣ ω ∣ 2 ⋅ I 3 × 3 0 3 × 1 0 1 × 3 − ∣ ω ∣ 2 ] = − ∣ ω ∣ 2 ⋅ I 4 × 4 \begin{aligned} \mathbf{\Omega}(\mathbf{\omega})^{2}& =\quad\begin{bmatrix}\lfloor\boldsymbol{\omega\times\rfloor^2-\omega\omega^\mathrm{T}}&-\lfloor\boldsymbol{\omega\times\rfloor\omega}\\\boldsymbol{\omega^\mathrm{T}}\lfloor\boldsymbol{\omega\times\rfloor}&-\boldsymbol{\omega^\mathrm{T}\omega}\end{bmatrix} \\ &=\quad\begin{bmatrix}-|\boldsymbol{\omega}|^2\cdot\mathbf{I}_{3\times3}&\mathbf{0}_{3\times1}\\\mathbf{0}_{1\times3}&-|\boldsymbol{\omega}|^2\end{bmatrix} \\ &=\quad-|\omega|^{2}\cdot\mathbf{I}_{4\times4} \end{aligned} Ω(ω)2​=[⌊ω×⌋2−ωωTωT⌊ω×⌋​−⌊ω×⌋ω−ωTω​]=[−∣ω∣2⋅I3×3​01×3​​03×1​−∣ω∣2​]=−∣ω∣2⋅I4×4​​

高阶幂

Ω ( ω ) 3 = − ∣ ω ∣ 2 ⋅ Ω ( ω ) Ω ( ω ) 4 = ∣ ω ∣ 4 ⋅ I 4 × 4 Ω ( ω ) 5 = ∣ ω ∣ 4 ⋅ Ω ( ω ) Ω ( ω ) 6 = − ∣ ω ∣ 6 ⋅ I 4 × 4 \begin{aligned} &\mathbf{\Omega}(\mathbf{\omega})^{3}&& =\quad-|\boldsymbol{\omega}|^2\cdot\boldsymbol{\Omega}(\boldsymbol{\omega}) \\ &\mathbf{\Omega}(\mathbf{\omega})^{4}&& =\quad|\omega|^4\cdot\mathbf{I}_{4\times4} \\ &\mathbf{\Omega}(\mathbf{\omega})^{5}&& =\quad|\omega|^4\cdot\boldsymbol{\Omega}(\boldsymbol{\omega}) \\ &\Omega(\omega)^{6}&& =\quad-|\omega|^{6}\cdot\mathbf{I}_{4\times4} \end{aligned} ​Ω(ω)3Ω(ω)4Ω(ω)5Ω(ω)6​​=−∣ω∣2⋅Ω(ω)=∣ω∣4⋅I4×4​=∣ω∣4⋅Ω(ω)=−∣ω∣6⋅I4×4​​

补充:JPL四元数对应的 Ω ( ω ) \Omega(\omega) Ω(ω)矩阵和Hamilton不同,下面是Hamilton对应的 Ω ( ω ) \Omega(\omega) Ω(ω)矩阵

Ω ( ω ) ≜ [ ω ] R = [ 0 − ω ⊤ ω − [ ω ] × ] = [ 0 − ω x − ω y − ω z ω x 0 ω z − ω y ω y − ω z 0 ω x ω z ω y − ω x 0 ] \Omega(\omega)\triangleq[\omega]_R=\begin{bmatrix}0&-\boldsymbol{\omega}^\top\\\boldsymbol{\omega}&-[\boldsymbol{\omega}]_\times\end{bmatrix}=\begin{bmatrix}0&-\omega_x&-\omega_y&-\omega_z\\\omega_x&0&\omega_z&-\omega_y\\\omega_y&-\omega_z&0&\omega_x\\\omega_z&\omega_y&-\omega_x&0\end{bmatrix} Ω(ω)≜[ω]R​=[0ω​−ω⊤−[ω]×​​]= ​0ωx​ωy​ωz​​−ωx​0−ωz​ωy​​−ωy​ωz​0−ωx​​−ωz​−ωy​ωx​0​ ​

2.5 JPL四元数与旋转矩阵的转换

参考论文Indirect Kalman Filter for 3D Attitude Estimation中1.4 Relationship between Quaternion and Rotational Matrix

  给定向量p,是⼀个三维点。我们将相应的四元数定义为
p ˉ = [ p v 0 ] \left.\bar{p}=\left[\begin{array}{c}\mathbf{p}_v\\0\end{array}\right.\right] pˉ​=[pv​0​]
  使用以下两种不同坐标系中表示的向量之间的关系

① 旋转矩阵
L p = G L C G p {}^L\mathbf{p}={}_G^L\mathbf{C}^G\mathbf{p} Lp=GL​CGp
② 四元数(不同类型的四元数对旋转的表示都一样,即 p ′ = q p q − 1 . p^{\prime}=qpq^{-1}. p′=qpq−1.)

L p ˉ = G L q ˉ ⊗ G p ˉ ⊗ G L q ˉ − 1 = [ q s I 3 × 3 − ⌊ q v × ⌋ q v − q v T q s ] [ p v 0 ] ⊗ L G q ˉ − 1 = [ q s p v − q v × p v − q v T p v ] ⊗ [ − q v q s ] = [ q s 2 p − q s q × p + q q T p + q s p × q − ( q × p ) × q + q s q T p − q s q T p − q T ( q × p ) ] = [ q s 2 p − 2 q s q × p + q q T p − ( ( 1 − q s 2 I 3 × 3 ) − q q T ) p − q T ⌊ q × ⌋ p ] = [ ( 2 q s 2 − 1 ) I 3 × 3 − 2 q s ⌊ q v × ⌋ + 2 q v q v T 0 ] [ G p v 0 ] \begin{aligned} ^L{\bar{p}}& ={}_{G}^{L}\bar{q}\otimes{}^{G}\bar{p}\otimes{}_{G}^{L}\bar{q}^{-1} \\ &\left.=\left[\begin{array}{cc}q_s\mathbf{I}_{3\times3}-\lfloor\mathbf{q}_v\times\rfloor&\mathbf{q}_v\\-\mathbf{q}_v^\mathrm{T}&q_s\end{array}\right.\right]\left[\begin{array}{c}\mathbf{p}_v\\0\end{array}\right]\otimes_L^G\bar{q}^{-1} \\ &\left.=\left[\begin{array}{c}q_s\mathbf{p}_v-\mathbf{q}_v\times\mathbf{p}_v\\-\mathbf{q}_v^\mathrm{T}\mathbf{p}_v\end{array}\right.\right]\otimes\left[\begin{array}{c}-\mathbf{q}_v\\q_s\end{array}\right] \\ &\left.=\left[\begin{array}{c}q_s^2\mathbf{p}-q_s\mathbf{q}\times\mathbf{p}+\mathbf{q}\mathbf{q}^\mathrm{T}\mathbf{p}+q_s\mathbf{p}\times\mathbf{q}-(\mathbf{q}\times\mathbf{p})\times\mathbf{q}\\+q_s\mathbf{q}^\mathrm{T}\mathbf{p}-q_s\mathbf{q}^\mathrm{T}\mathbf{p}-\mathbf{q}^\mathrm{T}(\mathbf{q}\times\mathbf{p})\end{array}\right.\right] \\ &\left.=\left[\begin{array}{c}q_s^2\mathbf{p}-2q_s\mathbf{q}\times\mathbf{p}+\mathbf{q}\mathbf{q}^\mathrm{T}\mathbf{p}-\left(\left(1-q_s^2\mathbf{I}_{3\times3}\right)-\mathbf{q}\mathbf{q}^\mathrm{T}\right)\mathbf{p}\\-\mathbf{q}^\mathrm{T}\lfloor\mathbf{q}\times\rfloor\mathbf{p}\end{array}\right.\right] \\ &\left.=\left[\begin{array}{c}\left(2q_s^2-1\right)\mathbf{I}_{3\times3}-2q_s\left\lfloor\mathbf{q}_v\times\right\rfloor+2\mathbf{q}_v\mathbf{q}_v^\mathrm{T}\\0\end{array}\right.\right]\left[\begin{array}{c}^{G}\mathbf{p}_v\\0\end{array}\right] \end{aligned} Lpˉ​​=GL​qˉ​⊗Gpˉ​⊗GL​qˉ​−1=[qs​I3×3​−⌊qv​×⌋−qvT​​qv​qs​​][pv​0​]⊗LG​qˉ​−1=[qs​pv​−qv​×pv​−qvT​pv​​]⊗[−qv​qs​​]=[qs2​p−qs​q×p+qqTp+qs​p×q−(q×p)×q+qs​qTp−qs​qTp−qT(q×p)​]=[qs2​p−2qs​q×p+qqTp−((1−qs2​I3×3​)−qqT)p−qT⌊q×⌋p​]=[(2qs2​−1)I3×3​−2qs​⌊qv​×⌋+2qv​qvT​0​][Gpv​0​]​
  得到了旋转矩阵和四元数转换,即矩阵左上角
G L C ( q ˉ ) = ( 2 q s 2 − 1 ) I 3 × 3 − 2 q s ⌊ q v × ⌋ + 2 q v q v T _G^L\mathbf{C}(\bar{q})=\left(2q_s^2-1\right)\mathbf{I}_{3\times3}-2q_s\lfloor\mathbf{q}_v\times\rfloor+2\mathbf{q}_v\mathbf{q}_v^\mathrm{T} GL​C(qˉ​)=(2qs2​−1)I3×3​−2qs​⌊qv​×⌋+2qv​qvT​

/*	把JPL四元数转换为旋转矩阵* @brief Convert a quaternion to the corresponding rotation matrix* @note 公式参见论文"Indirect Kalman Filter for 3D Attitude Estimation: Equation (62).*	实际上论文中还有一种形式这里没给出,参考公式(77)*/
inline Eigen::Matrix3d quaternionToRotation(const Eigen::Vector4d& q) {const Eigen::Vector3d& q_vec = q.block(0, 0, 3, 1);		// qvconst double& q4 = q(3);		// qsEigen::Matrix3d R =(2*q4*q4-1)*Eigen::Matrix3d::Identity() -2*q4*skewSymmetric(q_vec) + 2*q_vec*q_vec.transpose();return R;
}

  当JPL四元数对应转角很小时,可以近似为:
δ q ˉ = [ δ q v δ q s ] = [ n ^ sin ⁡ ( δ θ / 2 ) cos ⁡ ( δ θ / 2 ) ] ≈ [ 1 2 δ θ 1 ] \begin{aligned} \delta\bar{q}& \left.=\left[\begin{array}{c}\delta\mathbf{q}_v\\\delta q_s\end{array}\right.\right] \\ &\left.=\left[\begin{array}{c}\hat{\mathbf{n}}\sin(\delta\theta/2)\\\cos(\delta\theta/2)\end{array}\right.\right] \\ &\left.\approx\left[\begin{array}{c}\frac{1}{2}\delta\boldsymbol{\theta}\\1\end{array}\right.\right] \end{aligned} δqˉ​​=[δqv​δqs​​]=[n^sin(δθ/2)cos(δθ/2)​]≈[21​δθ1​]​
​  对应的旋转矩阵可以近似为
G L C ( δ q ˉ ) ≈ I 3 × 3 − ⌊ δ θ × ⌋ {}_G^L\mathbf{C}(\delta\bar{q})\approx\mathbf{I}_{3\times3}-\lfloor\delta\boldsymbol{\theta}\times\rfloor GL​C(δqˉ​)≈I3×3​−⌊δθ×⌋

论文Indirect Kalman Filter for 3D Attitude Estimation之3.2 Kalman Filter Update,下面公式是在卡尔曼滤波更新使用的!本质上是把一个旋转小量θ转为相应的四元数,注意θ=2q

在这里插入图片描述

/* 将四元数的向量部分(虚部)转换为完整的四元数* @brief Convert the vector part of a quaternion to a full quaternion.* @note 这个函数对于delta quaternion*    which is usually a 3x1 vector to a full quaternion.*/
inline Eigen::Vector4d smallAngleQuaternion(const Eigen::Vector3d& dtheta) 
{Eigen::Vector3d dq = dtheta / 2.0;		// 0.5*δθEigen::Vector4d q;						// 四元数qdouble dq_square_norm = dq.squaredNorm();	// 计算向量模的平方if (dq_square_norm <= 1) {		// 如果这个向量的模的平方小于1   小角度旋转q.head<3>() = dq;q(3) = std::sqrt(1-dq_square_norm);} else {q.head<3>() = dq;q(3) = 1;q = q / std::sqrt(1+dq_square_norm);	// 归一化,都是用单位四元数来表示旋转的   大角度旋转}return q;
}// 说下这里的原理:对于一个单位四元数q=cos(θ/2)+nsin(θ/2),如果说虚部模长很大,那么实部就会很小,意味着角度θ很大!
// 但是这里是判断一个旋转向量的模长,旋转向量的模长就是角度,模长越大,说明旋转越大;模长越小,旋转越小。

③ 欧拉角:利用②中推导结果,代入角轴,即可得到下面公式
G L C = cos ⁡ ( θ ) ⋅ I 3 × 3 − sin ⁡ ( θ ) ⌊ k ^ × ⌋ + ( 1 − cos ⁡ ( θ ) ) k ^ k ^ T = ( 2 cos ⁡ 2 ( θ / 2 ) − 1 ) ⋅ I 3 × 3 − 2 cos ⁡ ( θ / 2 ) sin ⁡ ( θ / 2 ) ⌊ k ^ × ⌋ + 2 sin ⁡ 2 ( θ / 2 ) k ^ k ^ T \begin{array}{rcl}^L_G\mathbf{C}&=&\cos(\theta)\cdot\mathbf{I}_{3\times3}-\sin(\theta)\lfloor\hat{\mathbf{k}}\times\rfloor+(1-\cos(\theta))\mathbf{\hat{k}}\mathbf{\hat{k}}^\mathrm{T}\\&=&\left(2\cos^2(\theta/2)-1\right)\cdot\mathbf{I}_{3\times3}-2\cos(\theta/2)\sin(\theta/2)\lfloor\hat{\mathbf{k}}\times\rfloor+2\sin^2(\theta/2)\mathbf{\hat{k}}\mathbf{\hat{k}}^\mathrm{T}\end{array} GL​C​==​cos(θ)⋅I3×3​−sin(θ)⌊k^×⌋+(1−cos(θ))k^k^T(2cos2(θ/2)−1)⋅I3×3​−2cos(θ/2)sin(θ/2)⌊k^×⌋+2sin2(θ/2)k^k^T​
  这个公式和罗德里格斯公式非常相似,只是角度取了负号!这是因为JPL四元数对应的是左手系,而罗德里格斯公式对应右手系。所以,不同于常见的指数映射,这里多了负号!

G L C ( q ˉ ) = exp ⁡ ( − ⌊ k ^ × ⌋ θ ) _G^L\mathbf{C}(\bar{q})=\exp\left(-\lfloor\hat{\mathbf{k}}\times\rfloor\theta\right) GL​C(qˉ​)=exp(−⌊k^×⌋θ)

④ 旋转矩阵转四元数

/** The function follows the*    conversion in "Indirect Kalman Filter for 3D Attitude Estimation, Equation (78).*/
inline Eigen::Vector4d rotationToQuaternion(const Eigen::Matrix3d& R) 
{Eigen::Vector4d score;score(0) = R(0, 0);score(1) = R(1, 1);score(2) = R(2, 2);score(3) = R.trace();int max_row = 0, max_col = 0;score.maxCoeff(&max_row, &max_col);Eigen::Vector4d q = Eigen::Vector4d::Zero();if (max_row == 0) {q(0) = std::sqrt(1+2*R(0, 0)-R.trace()) / 2.0;q(1) = (R(0, 1)+R(1, 0)) / (4*q(0));q(2) = (R(0, 2)+R(2, 0)) / (4*q(0));q(3) = (R(1, 2)-R(2, 1)) / (4*q(0));} else if (max_row == 1) {q(1) = std::sqrt(1+2*R(1, 1)-R.trace()) / 2.0;q(0) = (R(0, 1)+R(1, 0)) / (4*q(1));q(2) = (R(1, 2)+R(2, 1)) / (4*q(1));q(3) = (R(2, 0)-R(0, 2)) / (4*q(1));} else if (max_row == 2) {q(2) = std::sqrt(1+2*R(2, 2)-R.trace()) / 2.0;q(0) = (R(0, 2)+R(2, 0)) / (4*q(2));q(1) = (R(1, 2)+R(2, 1)) / (4*q(2));q(3) = (R(0, 1)-R(1, 0)) / (4*q(2));} else {q(3) = std::sqrt(1+R.trace()) / 2.0;q(0) = (R(1, 2)-R(2, 1)) / (4*q(3));q(1) = (R(2, 0)-R(0, 2)) / (4*q(3));q(2) = (R(0, 1)-R(1, 0)) / (4*q(3));}if (q(3) < 0) q = -q;quaternionNormalize(q);return q;
}

2.6 JPL四元数导数

  论文中写道,When the local coordinate frame {L} is moving with respect to the global reference frame {G}, we can compute the rate of change or the derivative of the corresponding quaternion describing their relationship. 当局部坐标系相较于世界系有移动,我们可以计算q关于时间的导数。----这种扰动只能是左扰动!

第一步:微分

在这里插入图片描述

第二步:引入中间极小量

在这里插入图片描述

第三步:推导

在这里插入图片描述

2.7 JPL四元数积分

  积分主要有0阶和一阶积分两种,MSCKF中采用了0阶积分

2.7.1 0阶积分

  欧拉法,认为Δt时间内角速度保持不变
ω ˉ = ω ( t k ) \bar{\boldsymbol{\omega}}={\omega}(t_k) ωˉ=ω(tk​)

∣ ω ^ ∣ > 1 0 − 5 时: G q ^ ( t + Δ t ) = ( cos ⁡ ( ∣ ω ^ ∣ 2 Δ t ) ⋅ I 4 × 4 + 1 ∣ ω ^ ∣ sin ⁡ ( ∣ ω ^ ∣ 2 Δ t ) ⋅ Ω ( ω ^ ) ) G q ^ ( t ) ∣ ω ^ ∣ ≤ 1 0 − 5 时: G q ^ ( t + Δ t ) = ( I 4 × 4 − Δ t 2 Ω ( ω ^ ) ) G q ^ ( t ) \begin{aligned}&|\hat{\omega}|>10^{-5}\text{ 时:}_G\hat{q}(t+\Delta t)=\left(\cos\left(\frac{|\hat{\omega}|}2\Delta t\right)\cdot I_{4\times4}+\frac1{|\hat{\omega}|}\sin\left(\frac{|\hat{\omega}|}2\Delta t\right)\cdot\Omega(\hat{\omega})\right)_G\hat{q}(t)\\&|\hat{\omega}|\leq10^{-5}\text{ 时:}_G\hat{q}(t+\Delta t)=\left(I_{4\times4}-\frac{\Delta t}2\Omega(\hat{\omega})\right)_G\hat{q}(t)\end{aligned} ​∣ω^∣>10−5 时:G​q^​(t+Δt)=(cos(2∣ω^∣​Δt)⋅I4×4​+∣ω^∣1​sin(2∣ω^∣​Δt)⋅Ω(ω^))G​q^​(t)∣ω^∣≤10−5 时:G​q^​(t+Δt)=(I4×4​−2Δt​Ω(ω^))G​q^​(t)​

2.7.2 1阶积分

  角速度取两个时刻的均值,具体见论文
ω ˉ = ω ( t k + 1 ) + ω ( t k ) 2 \bar{\boldsymbol{\omega}}=\frac{\boldsymbol{\omega}(t_{k+1})+\boldsymbol{\omega}(t_k)}2 ωˉ=2ω(tk+1​)+ω(tk​)​

3 JPL与Hamilton的区别

① 论文Quaternion kinematics for the error-state Kalman filter是Hamilton四元数

② 论文Indirect Kalman Filter for 3D Attitude Estimation是JPL四元数

  现在定义一个四元数 q = q 1 i + q 2 j + q 3 k + q 0 = q v + q S q=q_1i+q_2j+q_3k+q_0=q_v+q_S q=q1​i+q2​j+q3​k+q0​=qv​+qS​,下面对比其作为不同四元数的一个区别。

  定义local表示局部坐标系,global表示世界坐标系

3.1 转换方向

  转换方向的不同,使其扰动更新分别对应左扰动和右扰动。

  • JPL:global-to-local 世界坐标系 --> 局部坐标系

X l = q ⊗ X g ⊗ q − 1 , X l = R g l X g X_l=q\otimes X_g\otimes q^{-1}\text{,}X_l=R_g^lX_g Xl​=q⊗Xg​⊗q−1,Xl​=Rgl​Xg​

  • Hamilton:local-to-global 局部坐标系 --> 世界坐标系

X g = q ⊗ X l ⊗ q − 1 , X g = R l g X l X_g=q\otimes X_l\otimes q^{-1},X_g=R_l^gX_l Xg​=q⊗Xl​⊗q−1,Xg​=Rlg​Xl​

  所以JPL形式四元数得到的旋转矩阵 和 Hamilton形式四元数得到的旋转矩阵互为转置!表示了相反的旋转!
  还有一点,上面也提到了q和-q表示了相同的旋转,只是方向相反

3.2 四元数与旋转向量的转换

  • JPL:

q = [ k ^ sin ⁡ θ 2 cos ⁡ θ 2 ] ⇒ R g l = exp ⁡ ( − [ k ^ ] × θ ) q=\begin{bmatrix}\hat{k}\sin\frac\theta2\\\cos\frac\theta2\end{bmatrix}\Rightarrow R_g^l=\exp\left(-[\hat{k}]_\times\theta\right) q=[k^sin2θ​cos2θ​​]⇒Rgl​=exp(−[k^]×​θ)

  • Hamilton:

q = [ cos ⁡ θ 2 k ^ sin ⁡ θ 2 ] ⇒ R l g = exp ⁡ ( [ k ^ ] × θ ) q=\begin{bmatrix}\cos\frac\theta2\\\hat{k}\sin\frac\theta2\end{bmatrix}\Rightarrow R_l^g=\exp([\hat{k}]_\times\theta) q=[cos2θ​k^sin2θ​​]⇒Rlg​=exp([k^]×​θ)

R g l = R l g T = e x p ( [ k ^ ] × θ ) T = e x p ( [ k ^ ] × θ ) − 1 = e x p ( − [ k ^ ] × θ ) \begin{aligned} R_{g}^{l}& ={R_l^{g}}^T \\ & =exp{\left([\hat{k}]_\times\theta\right)}^T \\ &=exp{([\hat{k}]_\times\theta)}^{-1} \\ &=exp\left(-[\hat{k}]_\times\theta\right) \end{aligned} Rgl​​=Rlg​T=exp([k^]×​θ)T=exp([k^]×​θ)−1=exp(−[k^]×​θ)​

  一样的旋转角度,但轴是相反的,本文一开始的两个坐标系图也能看出来

3.3 四元数与旋转矩阵的转换

  • JPL:

R g l = ( 2 q s 2 − 1 ) I 3 × 3 − 2 q s ⌊ q v × ⌋ + 2 q v q v T R_g^l=\left(2q_s^2-1\right)\mathbf{I}_{3\times3}-2q_s\lfloor\mathbf{q}_\mathbf{v}\times\rfloor+2\mathbf{q}_\mathbf{v}\mathbf{q}_\mathbf{v}^\mathrm{T} Rgl​=(2qs2​−1)I3×3​−2qs​⌊qv​×⌋+2qv​qvT​

  • Hamilton:

R l g = ( q s 2 − q v ⊤ q v ) I + 2 q v q v ⊤ + 2 q s [ q v ] x R_l^g=\left(q_s^2-\mathbf{q}_v^\top\mathbf{q}_v\right)\mathbf{I}+2\mathbf{q}_v\mathbf{q}_v^\top+2q_s[\mathbf{q}_v]_\mathbf{x} Rlg​=(qs2​−qv⊤​qv​)I+2qv​qv⊤​+2qs​[qv​]x​

3.4 四元数的乘法

  • JPL:

q 1 ⊗ q 2 = L ( q 1 ) q 2 = q 0 I + [ − q × q − q ⊤ 0 ] = R ( q 2 ) q 1 = q 0 I + [ q × q − q ⊤ 0 ] \begin{aligned}q_1\otimes q_2&=L\left(q_1\right)q_2=q_0I+\begin{bmatrix}-q_\times&q\\-q^\top&0\end{bmatrix}\\&=R\left(q_2\right)q_1=q_0I+\begin{bmatrix}q_\times&q\\-q^\top&0\end{bmatrix}\end{aligned} q1​⊗q2​​=L(q1​)q2​=q0​I+[−q×​−q⊤​q0​]=R(q2​)q1​=q0​I+[q×​−q⊤​q0​]​

  • Hamilton:

在这里插入图片描述

3.5 四元数的导数

  • JPL: Ω ( w ) \Omega(w) Ω(w)见2.4

q ˙ g l = 1 2 Ω ( w ) ⋅ q = 1 2 [ w 0 ] ⊗ q = 1 2 [ − w × w − w ⊤ 0 ] ⋅ q \dot q_g^l=\frac12\Omega(w)\cdot q=\frac12{\begin{bmatrix}w\\0\end{bmatrix}}\otimes q=\frac12{\begin{bmatrix}-w\times&w\\-w^\top&0\end{bmatrix}}\cdot q q˙​gl​=21​Ω(w)⋅q=21​[w0​]⊗q=21​[−w×−w⊤​w0​]⋅q

  • Hamilton:

q ˙ l g = 1 2 Ω ( w ) ⋅ q = 1 2 q ⊗ [ 0 w ] = 1 2 [ 0 − w ⊤ w − w × ] ⋅ q \left.\dot q_l^g=\frac12\Omega(w)\cdot q=\frac12q\otimes\left[\begin{array}{c}0\\w\end{array}\right.\right]=\frac12\left[\begin{array}{cc}0&-w^\top\\w&-w_\times\end{array}\right]\cdot q q˙​lg​=21​Ω(w)⋅q=21​q⊗[0w​]=21​[0w​−w⊤−w×​​]⋅q

注意:JPL四元数对应的 Ω ( ω ) \Omega(\omega) Ω(ω)矩阵和Hamilton不同,上面2.4提到。上面两个导数的式子前半部分只是看起来相同!因为它们一个对应局部系,一个对应全局系,扰动分别对应左扰动和右扰动。

3.6 四元数的扰动

  • JPL:

δ R = I − [ θ ] × \delta R=I-[\theta]_\times δR=I−[θ]×​

  • Hamilton:

δ R = I + [ θ ] × \delta R=I+[\theta]_\times δR=I+[θ]×​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/news/711590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud搭建微服务之Consul服务注册与发现

1. Consul介绍 Consul是由HashiCorp公司使用Go语言开发的一款开源工具&#xff0c;主要用于实现分布式系统的服务发现和服务配置&#xff0c;其内置了服务注册与发现框架、分布式一致性协议实现、健康检查、Key-Value存储、多数据中心方案。Consul具有高可移植性&#xff0c;支…

Java多线程系列——Executor

目录 Executor框架概览 核心组件 1. 任务&#xff08;Task&#xff09; 2. 线程池&#xff08;ThreadPool&#xff09; 3. 任务调度 4. 任务执行与结果检索 使用案例 实际应用场景 总结 Java的多线程编程是Java语言提供的核心特性之一&#xff0c;允许开发者有效地管理…

【数仓】Hadoop软件安装及使用(集群配置)

一、环境准备 1、准备3台虚拟机 Hadoop131&#xff1a;192.168.56.131Hadoop132&#xff1a;192.168.56.132Hadoop133&#xff1a;192.168.56.133 本例系统版本 CentOS-7.8&#xff0c;已安装jdk1.8 2、hosts配置&#xff0c;关闭防火墙 vi /etc/hosts添加如下内容&#x…

ip获取+归属地实现

1.背景 现在的社交平台一般都需要展示用户的归属地,这个功能有下面二个主要功能点,接下来我们来介绍下具体实现。 IP 获取 IP 转归属地 2.ip获取 2.1 Http请求 对于controller的请求,我们只需要写个拦截器,将用户的ip设置进上下文即可,非常方便。 @Override public bo…

生成式AI设计模式:综合指南

原文地址&#xff1a;Generative AI Design Patterns: A Comprehensive Guide 使用大型语言模型 (LLM) 的参考架构模式和心理模型 2024 年 2 月 14 日 对人工智能模式的需求 我们在构建新事物时&#xff0c;都会依赖一些经过验证的方法、途径和模式。对于软件工程师来说&am…

物联网与智慧城市的融合:构建智能化、便捷化、绿色化的城市未来

一、引言 随着科技的飞速发展和城市化的不断推进&#xff0c;物联网技术正逐步渗透到城市的各个领域&#xff0c;成为推动智慧城市建设的核心力量。物联网与智慧城市的融合&#xff0c;不仅为城市治理提供了高效、智能的解决方案&#xff0c;也为市民的生活带来了前所未有的便…

如何在Node.js中使用定时器

在Node.js中使用定时器是一项常见且重要的任务&#xff0c;特别是在需要执行定时任务或者轮询操作的情况下。Node.js提供了多种方式来实现定时器功能&#xff0c;包括setTimeout、setInterval和setImmediate等方法。本篇博客将介绍如何在Node.js中使用这些定时器&#xff0c;并…

(数据结构)二叉树

8.二叉树 8.1概述 二叉树是一种基本的非线性数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个节点构成的有限集合。在二叉树中&#xff0c;每个节点最多有两个子节点&#xff0c;通常被称作左孩子&#xff08;left child&#xff09;和右孩子&#xff08;right c…

把python完全卸载干净

1.winR&#xff0c;输入control回车&#xff0c;点击程序和功能&#xff0c;在搜索框输入python&#xff0c;右键点击卸载 2、找到Python安装路径&#xff0c;把所有文件全部删除。 安装路径可以打开CMD输入&#xff1a;where python 3、强制删除Python.exe 打开cmd&#xff…

科技企业如何做到FTP数据安全保护

在数字化浪潮的推动下&#xff0c;科技企业的数据已成为推动创新、提升效率、增强竞争力的核心资源。数据的重要性不言而喻&#xff0c;它不仅包含了客户信息、市场分析、产品设计等关键信息&#xff0c;更是企业宝贵的资产。然而&#xff0c;随着数据量的激增&#xff0c;数据…

视觉AIGC识别——人脸伪造检测、误差特征 + 不可见水印

视觉AIGC识别——人脸伪造检测、误差特征 不可见水印 前言视觉AIGC识别【误差特征】DIRE for Diffusion-Generated Image Detection方法扩散模型的角色DIRE作为检测指标 实验结果泛化能力和抗扰动 人脸伪造监测&#xff08;Face Forgery Detection&#xff09;人脸伪造图生成 …

LabVIEW最佳传输系统设计

LabVIEW最佳传输系统设计 介绍了基于LabVIEW软件开发的最佳基带传输系统和最佳带通传输系统的设计。通过软件仿真实现了脉冲成形滤波器和匹配滤波器的设计&#xff0c;证明了系统在消除码间干扰和抗噪声方面的优异性能。此设计不仅激发了学生的学习兴趣&#xff0c;还有助于提…

智能家居控制系统(51单片机)

smart_home_control_system 51单片机课设&#xff0c;智能家居控制系统 使用及转载请标明出处&#xff08;最好点个赞及star哈哈&#xff09; Github地址&#xff0c;带有PPT及流程图 Gitee码云地址&#xff0c;带有PPT及流程图 ​ 以STC89C52为主控芯片&#xff0c;以矩阵键…

Java必须掌握的继承的概述

Java的继承是面向对象编程中的一个核心概念&#xff0c;它允许一个类继承另一个类的属性和方法。这不仅有助于代码的重用&#xff0c;还使得代码的管理和维护变得更加容易。在准备大厂面试时&#xff0c;理解继承的各个方面是非常重要的。以下是一些关于Java继承的概述和可能出…

Linux基本指令(上)

在Linux中&#xff0c;将文件夹称为目录&#xff0c;后面的内容都与目录相关。 1. ls指令 语法&#xff1a; ls [选项][目录或文件] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息。 常用选项 …

MySQL的索引和B+tree结构

目录 0.关于索引的常见面试题 1.什么是索引&#xff1f; 索引的优缺点 2.索引的数据结构&#xff0c;为什么InnoDb引擎使用Btree作为索引的数据结构&#xff1f; 分析怎样的索引才是好的 二插搜索树 红黑树 B-Tree BTree 哈希 为什么 InnoDB 存储引擎选择使用 Btree 索…

iTOP-3588开发板快速测试手册Android12系统功能测试

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

mac 配置faas 全局二进制命令

FaaS&#xff08;即功能即服务-Function as a Services&#xff09;是一种云计算服务&#xff0c;允许客户执行代码来响应事件&#xff0c;而无需管理通常与构建和启动微服务应用程序相关的复杂基础架构 在互联网上托管软件应用程序通常需要配置和管理虚拟服务器或物理服务器&…

洛谷题单_递推与递归

P1255 数楼梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) //不满分做法&#xff1a;没有高精度 #include <bits/stdc.h> using namespace std; const int N5006; int dp[N];//dp[i]表示到第i节楼梯有dp[i]中方案 int main(){int n;cin>>n;dp[1]1;dp[0]1;for(i…

MySQL(基础篇)——多表查询

一.多表关系 一对多(多对一) 多对多一对一 1.一对多(多对一) a.案例&#xff1a;部门与员工的关系 b.关系&#xff1a;一个部门对应多个员工&#xff0c;一个员工对应一个部门 c.实现&#xff1a;在多的一方建立外键&#xff0c;指向一的一方的主键 2.多对多 a.案…