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+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ˉ =q2+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} q1搞混,它们描述相反的旋转

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)=q0p0q1p1q2p2q3p3+(q0p1+q1p0q2p3+q3p2)i+(q0p2+q2p0q3p1+q1p3)j+(q0p3+q3p0q1p2+q2p1)k= q0p1+q3p2q2p3+q1p0q3p1+q0p2+q1p3+q2p0q2p1q1p2+q0p3+q3p0q1p1q2p2q3p3+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] = q0q3q2q1q3q0q1q2q2q1q0q3q1q2q3q0 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×= 0q3q2q30q1q2q10

  所以,四元数乘法可以简化为下面的式子,通过下表sv来区分四元数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ˉ= q0q3q2q1q3q0q1q2q2q1q0q3q1q2q3q0 p1p2p3p0 qˉpˉ=L(qˉ)pˉ=[qsI3×3qv×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ˉ= p0p3p2p1p3p0p1p2p2p1p0p3p1p2p3p0 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ˉ0qˉ=qˉ

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

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

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×= 0q3q2q30q1q2q10

/*	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×baTb×=ω×T=b×a=bTa×

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×3a×(b×c)=b(aTc)c(aTb)a×b×+abT=b×a×+baT⌊(a×b)×=baTabT(=(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)×=Ra×RTR(a×b)=(Ra)×(Rb)

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

参考:论文Indirect Kalman Filter for 3D Attitude Estimation1.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ω]=[ω2I3×301×303×1ω2]=ω2I4×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Ω(ω)=ω4I4×4=ω4Ω(ω)=ω6I4×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 Estimation1.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=qpq1.

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×3qv×qvTqvqs][pv0]LGqˉ1=[qspvqv×pvqvTpv][qvqs]=[qs2pqsq×p+qqTp+qsp×q(q×p)×q+qsqTpqsqTpqT(q×p)]=[qs2p2qsq×p+qqTp((1qs2I3×3)qqT)pqTq×p]=[(2qs21)I3×32qsqv×+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ˉ)=(2qs21)I3×32qsqv×+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 Estimation3.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×3sin(θ)k^×+(1cos(θ))k^k^T(2cos2(θ/2)1)I3×32cos(θ/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} ω^>105 :Gq^(t+Δt)=(cos(2ω^Δt)I4×4+ω^1sin(2ω^Δt)Ω(ω^))Gq^(t)ω^105 :Gq^(t+Δt)=(I4×42Δ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 filterHamilton四元数

② 论文Indirect Kalman Filter for 3D Attitude EstimationJPL四元数

  现在定义一个四元数 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=qXgq1,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=qXlq1,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=(2qs21)I3×32qsqv×+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=(qs2qvqv)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} q1q2=L(q1)q2=q0I+[q×qq0]=R(q2)q1=q0I+[q×qq0]

  • 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×ww0]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[0www×]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.mzph.cn/news/711590.shtml

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

相关文章

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

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

生成式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;并…

把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;以矩阵键…

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&…

洛谷题单_递推与递归

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.案…

Elasticsearch入门-环境安装ES和Kibana以及ES-Head可视化插件和浏览器插件es-client

Elasticsearch入门-环境安装ES和Kibana 安装 ES Windows安装ESHead安装浏览器插件 es-clientKibana 安装 安装es,安装header 安装kibana&#xff0c;安装多种分词器ik… 安装 ES Windows安装 ① 下载压缩包并解压官网链接&#xff1a;https://www.elastic.co/cn/downloads/ela…

canvas坐标系统 webgl坐标系统 uv纹理坐标系统 原点

一、canvas原点在左上角&#xff0c;x轴正方向向右&#xff0c;y轴正方向向下&#xff0c;一个点对应一个像素 二、webgl原点在正中间&#xff0c;x轴正方向向右&#xff0c;y轴正方向向上&#xff0c;数据显示范围在[-1,1]之间&#xff0c;超过此范围不显示数据 三、uv原点在左…

如何用ChatGPT+GEE+ENVI+Python进行高光谱,多光谱成像遥感数据处理?

原文链接&#xff1a;如何用ChatGPTGEEENVIPython进行高光谱&#xff0c;多光谱成像遥感数据处理&#xff1f; 第一&#xff1a;遥感科学 从摄影侦察到卫星图像 遥感的基本原理 遥感的典型应用 第二&#xff1a;ChatGPT ChatGPT可以做什么&#xff1f; ChatGPT演示使用 …

工厂模式:没你想像的那么难

工厂模式 工厂模式是一种创建型设计模式&#xff0c;它允许创建对象而无需指定将要创建的对象的具体类。它通过将对象的创建委托给一个单独的方法或类来完成&#xff0c;从而隐藏了对象的实例化逻辑。这样可以提高代码的灵活性&#xff0c;减少了代码中的重复和耦合。 在工厂…

2021年下半年教师资格证考试《高中信息技术》题

4.使用某转码软件对一段时长为2分钟的AVI视频进行转码&#xff0c;转码后的视频信息如图4所示&#xff0c;计算存储该视频文件所需的空间大小为&#xff08;C &#xff09;。 A18MB B36MB C60MB D512MB 6.某21位二进制代码100101011010011110101&#xff0c;已知该代码由3个…