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+q1i+q2j+q3k
十四讲上的四元数是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=[q1q2q3q0]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=[q0q1q2q3]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+q1i+q2j+q3k)(p0+p1i+p2j+p3k)=q0p0−q1p1−q2p2−q3p3+(q0p1+q1p0−q2p3+q3p2)i+(q0p2+q2p0−q3p1+q1p3)j+(q0p3+q3p0−q1p2+q2p1)k= q0p1+q3p2−q2p3+q1p0−q3p1+q0p2+q1p3+q2p0q2p1−q1p2+q0p3+q3p0−q1p1−q2p2−q3p3+q0p0
= [ 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−q3q2−q1q3q0−q1−q2−q2q1q0−q3q1q2q3q0 p1p2p3p0
/* @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−q30q1q2−q10
所以,四元数乘法可以简化为下面的式子,通过下表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−q3q2−q1q3q0−q1−q2−q2q1q0−q3q1q2q3q0 p1p2p3p0 qˉ⊗pˉ=L(qˉ)pˉ=[qsI3×3−⌊qv×⌋−qvTqvqs][pvps]
同理,我们可以互换四元数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ˉ= p0p3−p2−p1−p3p0p1−p2p2−p1p0−p3p1p2p3p0 q1q2q3q0
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ˉ==[psI3×3+⌊pv×⌋−pvTpvps][qvqs]
结合上面两个式子,可以得到
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=[0001]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=[−qvqs]=[−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−q30q1q2−q10
/* 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ωz0−ωx−ωy−ωyωx0−ωzωxωyωz0 =[−⌊ω×⌋−ω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×301×303×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−ωx0−ωzωy−ωyωz0−ωx−ωz−ωyωx0
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ˉ=[pv0]
使用以下两种不同坐标系中表示的向量之间的关系
① 旋转矩阵
L p = G L C G p {}^L\mathbf{p}={}_G^L\mathbf{C}^G\mathbf{p} Lp=GLCGp
② 四元数(不同类型的四元数对旋转的表示都一样,即 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ˉ=GLqˉ⊗Gpˉ⊗GLqˉ−1=[qsI3×3−⌊qv×⌋−qvTqvqs][pv0]⊗LGqˉ−1=[qspv−qv×pv−qvTpv]⊗[−qvqs]=[qs2p−qsq×p+qqTp+qsp×q−(q×p)×q+qsqTp−qsqTp−qT(q×p)]=[qs2p−2qsq×p+qqTp−((1−qs2I3×3)−qqT)p−qT⌊q×⌋p]=[(2qs2−1)I3×3−2qs⌊qv×⌋+2qvqvT0][Gpv0]
得到了旋转矩阵和四元数转换,即矩阵左上角
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} GLC(qˉ)=(2qs2−1)I3×3−2qs⌊qv×⌋+2qvqvT
/* 把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 GLC(δ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} GLC==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) GLC(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 时:Gq^(t+Δt)=(cos(2∣ω^∣Δt)⋅I4×4+∣ω^∣1sin(2∣ω^∣Δt)⋅Ω(ω^))Gq^(t)∣ω^∣≤10−5 时:Gq^(t+Δt)=(I4×4−2ΔtΩ(ω^))Gq^(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=q1i+q2j+q3k+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=RglXg
- 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=RlgXl
所以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=RlgT=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×⌋+2qvqvT
- 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+2qvqv⊤+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=q0I+[−q×−q⊤q0]=R(q2)q1=q0I+[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=21q⊗[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+[θ]×