【学习笔记】空间坐标系旋转与四元数

news2024/11/23 23:55:02

前言

  最近在学惯性器件,想着先把理论知识脉络打通,于是便开始学习空间坐标系旋转和四元数,正好结合刚刚结课的课程《机器人控制技术》,记录一下学习心得。

旋转矩阵和齐次变换矩阵部分主要参考自教材 《机器人学导论》 中的第2章 【有需要的可以去z-library上免费下载】

1 平面坐标系旋转

  推导空间坐标系旋转之前,不妨先看一下平面坐标系的旋转。
  如下图所示,存在一个向量 v v v,绕原点逆时针旋转(一般平面上的旋转都是往角度增大的方向,即逆时针方向旋转) θ \theta θ角度,得到向量 v ′ v' v,求向量 v v v v ′ v' v的旋转矩阵。【图片来源】
在这里插入图片描述

  假定向量 v v v的模长为 r r r,初始角度为 ϕ \phi ϕ,则 v v v的坐标为 ( r c o s ϕ , r s i n ϕ ) (rcos\phi, rsin\phi) (rcosϕ,rsinϕ),逆时针旋转 θ \theta θ角度后,得到 v ′ v' v,其坐标变为 ( r c o s ( θ + ϕ ) , r s i n ( θ + ϕ ) ) (rcos(\theta+\phi), rsin(\theta+\phi)) (rcos(θ+ϕ),rsin(θ+ϕ)),展开得到:
[ x v ’ y v ’ ] = [ r cos ⁡ ϕ cos ⁡ θ − r sin ⁡ ϕ sin ⁡ θ r cos ⁡ ϕ sin ⁡ θ + r sin ⁡ ϕ cos ⁡ θ ] = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ r cos ⁡ ϕ r sin ⁡ ϕ ] = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] [ x v y v ] \left[ \begin{array}{c} x_{v’}\\ y_{v’}\\ \end{array} \right] =\left[ \begin{array}{c} r\cos \phi \cos \theta -r\sin \phi \sin \theta\\ r\cos \phi \sin \theta +r\sin \phi \cos \theta\\ \end{array} \right] =\left[ \begin{matrix} \cos \theta& -\sin \theta\\ \sin \theta& \cos \theta\\ \end{matrix} \right] \left[ \begin{array}{c} r\cos \phi\\ r\sin \phi\\ \end{array} \right] =\left[ \begin{matrix} \cos \theta& -\sin \theta\\ \sin \theta& \cos \theta\\ \end{matrix} \right] \left[ \begin{array}{c} x_v\\ y_v\\ \end{array} \right] [xvyv]=[rcosϕcosθrsinϕsinθrcosϕsinθ+rsinϕcosθ]=[cosθsinθsinθcosθ][rcosϕrsinϕ]=[cosθsinθsinθcosθ][xvyv]

故,矩阵 [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] \left[ \begin{matrix} \cos \theta& -\sin \theta\\ \sin \theta& \cos \theta\\ \end{matrix} \right] [cosθsinθsinθcosθ]即为旋转矩阵。

记住这个表达式,尤其是正负号,后面要考。

  当然,上面讨论的是向量的旋转,如果把这个向量看作坐标系的一个轴,那么这个旋转矩阵也能应用到坐标系变换当中。比如已知一个点在A坐标系下的xy坐标,求该点在B坐标系下的xy坐标,就可以左乘一个旋转矩阵,从而得到新坐标系下的xy坐标。

2 空间坐标系旋转

  了解了平面坐标系旋转,再来看看空间坐标系的旋转。

2.1 旋转矩阵的推导

  参考上面的方法,即在一个固定坐标系中表示出发生旋转的坐标系前后的坐标,从而求出其旋转矩阵,我们在此基础上应用投影法来推导空间坐标系的旋转矩阵。
  如下图所示,有两个坐标系{A}和{B},其中{B}相对于{A}发生了旋转,现在在{B}中有一个矢量 B P ^BP BP(左上标代表“基于xx坐标系”),问该矢量在{A}中的坐标是多少?即求 A P ^AP AP
在这里插入图片描述
  基于上面平面坐标系旋转的例子类推,我们不难猜出, P P P矢量在{A}和{B}下的坐标 A P , B P ^AP, ^BP AP,BP之间存在一个旋转矩阵的关系:
A P = B A R        B P ^AP=_B^AR\,\,^{\,\, B}P AP=BARBP

那怎么来求这个旋转矩阵 B A R _B^AR BAR呢?一般采用的是投影法
B A R = [ A X ^ B     A Y ^ B     A Z ^ B ] = [ X ^ B ⋅ X ^ A Y ^ B ⋅ X ^ A Z ^ B ⋅ X ^ A X ^ B ⋅ Y ^ A Y ^ B ⋅ Y ^ A Z ^ B ⋅ Y ^ A X ^ B ⋅ Z ^ A Y ^ B ⋅ Z ^ A Z ^ B ⋅ Z ^ A ] _{B}^{A}R=\left[ ^A\hat{X}_B\,\,^A\hat{Y}_B\,\,^A\hat{Z}_B \right] =\left[ \begin{matrix} \hat{X}_B\cdot \hat{X}_A& \hat{Y}_B\cdot \hat{X}_A& \hat{Z}_B\cdot \hat{X}_A\\ \hat{X}_B\cdot \hat{Y}_A& \hat{Y}_B\cdot \hat{Y}_A& \hat{Z}_B\cdot \hat{Y}_A\\ \hat{X}_B\cdot \hat{Z}_A& \hat{Y}_B\cdot \hat{Z}_A& \hat{Z}_B\cdot \hat{Z}_A\\ \end{matrix} \right] BAR=[AX^BAY^BAZ^B]=X^BX^AX^BY^AX^BZ^AY^BX^AY^BY^AY^BZ^AZ^BX^AZ^BY^AZ^BZ^A

其中, B A R _{B}^{A}R BAR描述了{B}相对于{A}的旋转(左下标相对于左上标的旋转),即在{A}中描述{B}的姿态。

从这个角度来理解上面的等式 A P = B A R        B P ^AP=_B^AR\,\,^{\,\, B}P AP=BARBP :等号两边是等价的,左边是矢量在{A}中的表示,等式右边由于 B P ^BP BP是在{B}中的表示,所以要左乘以一个{B}相对于{A}的旋转矩阵,将这个旋转给“抵消”。

为方便记忆,可以把左上标视为分子,左下标视为分母,然后利用分数乘法中的相消原则,来书写表达式,这个方式在多个旋转矩阵相乘时更加有用。

此外, [ A X ^ B     A Y ^ B     A Z ^ B ] \left[ ^A\hat{X}_B\,\,^A\hat{Y}_B\,\,^A\hat{Z}_B \right] [AX^BAY^BAZ^B]分别表示 {B}中三个主轴的单位矢量(含有“帽号”表示单位矢量)在{A}中三个主轴的投影,都是列向量。后面展开的矩阵,每一个元素都是两个单位矢量的点乘,其中每一列{B}中的向量保持不变,每一行{A}中的向量保持不变。

需要注意的是,向量乘积的前提是基于同一个坐标系,因此这里的 X ^ B \hat{X}_B X^B都是在坐标系A中的描述,如果在坐标系B中描述就直接是 [ 1 , 0 , 0 ] [1,0,0] [1,0,0]

2.2 旋转矩阵的性质

  旋转本身就是可逆的,既然有{B}相对于{A}的旋转矩阵 B A R _B^AR BAR,那必然也有{A}相对于{B}的旋转矩阵 A B R _A^BR ABR,即
B P = A B R        A P ^BP=_A^BR\,\,^{\,\, A}P BP=ABRAP
再根据上面的表达式:
A P = B A R        B P ^AP=_B^AR\,\,^{\,\, B}P AP=BARBP
两边同时左乘 A B R _A^BR ABR,得到
A B R     A P = A B R     B A R    B P = B P _{A}^{B}R\,\,^AP=_{A}^{B}R\,\,_{B}^{A}R^{\,\, B}P=^BP ABRAP=ABRBARBP=BP
A B R     B A R = I _{A}^{B}R\,\,_{B}^{A}R=I ABRBAR=I,即 A B R =   B A R − 1 _{A}^{B}R=\,_{B}^{A}R^{-1} ABR=BAR1

  此外,根据上面的 B A R _B^AR BAR的推导,同样可以得出{A}相对于{B}发生旋转时的旋转矩阵 A B R _A^BR ABR
A B R = [ B X ^ A     B Y ^ A     B Z ^ A ] = [ A X ^ B T A Y ^ B T A Y ^ B T ] = B A R T _{A}^{B}R=\left[ ^B\hat{X}_A\,\,^B\hat{Y}_A\,\,^B\hat{Z}_A \right] =\left[ \begin{array}{c} {^A\hat{X}_B}^T\\ {^A\hat{Y}_B}^T\\ {^A\hat{Y}_B}^T\\ \end{array} \right] ={_{B}^{A}R}^T ABR=[BX^ABY^ABZ^A]=AX^BTAY^BTAY^BT=BART

  联立上面表达式,可以得出: B A R − 1 = B A R T _{B}^{A}R^{-1} ={_{B}^{A}R}^T BAR1=BART,因此,可以得出,旋转矩阵为一个正交矩阵,同时还是一个标准正交矩阵,即其行列式恒为+1(非标准正交矩阵行列式为-1).

3 齐次变化矩阵*

  以上关于空间旋转的叙述,可以发现其实都含有一个前提:坐标原点不变,但在实际的机器人控制过程中,机构的运动并不是单独的旋转,还包含平移运动,所以一般描述位姿变换,常采用4*4的齐次变换矩阵。【如果只想看旋转部分,这节可以跳过

3.1 坐标系平移

  首先来看坐标系平移。和旋转要保持坐标原点不变的前提一样,讨论坐标系平移时,也要保证姿态一样,即不发生旋转。
  坐标系{B}相对于坐标系{A}发生了平移,一般只需要描述{B}原点相对于{A}的位置即可:
A P B o r g = [ A p x A p y A p z ] ^AP_{Borg} =\left[ \begin{array}{c} ^Ap_x\\ ^Ap_y\\ ^Ap_z\\ \end{array} \right] APBorg=ApxApyApz
这里,同样采用了左上标的符号来表示“相对”, o r g org org下标表示origin,即原点。

3.2 齐次变换矩阵

  以上讨论的都是单独的平移和旋转,因此都要满足一定的前提条件,那能不能把这两者给结合起来呢?答案肯定是可以的。
[ A P 1 ] = [ B A R A P B o r g 0 0  0 1 ] [ B P 1 ] \left[ \begin{array}{c} ^AP\\ 1\\ \end{array} \right] =\left[ \begin{matrix} _{B}^{A}R& ^AP_{Borg}\\ \text{0 0 }0& 1\\ \end{matrix} \right] \left[ \begin{array}{c} ^BP\\ 1\\ \end{array} \right] [AP1]=[BAR0 0 0APBorg1][BP1]

通过增加0和1,巧妙地将旋转矩阵和平移向量结合到一个4*4的矩阵当中,这个矩阵称为齐次变换矩阵,用 B A T _B^AT BAT表示,即
[ A P 1 ] = B A T [ B P 1 ] \left[ \begin{array}{c} ^AP\\ 1\\ \end{array} \right] =_{B}^{A}T\left[ \begin{array}{c} ^BP\\ 1\\ \end{array} \right] [AP1]=BAT[BP1]

如果要计算多次变换,只需要把多个齐次变换矩阵依次相乘即可。

3.3 平移和旋转算子

  所谓算子,即能够单独进行某一种特定运算的表达式,相当于是齐次变换矩阵的一种特殊情况。

  • 平移算子
    对于两个坐标系 P 1 P_1 P1 P 2 P_2 P2,满足这样的平移关系 A P 2 = A P 1 + A Q ^AP_2=^AP_1+^AQ AP2=AP1+AQ,将其用齐次变换矩阵对应的算子表示,即 A P 2 = D Q ( q ) A P 1 ^AP_2=D_Q\left( q \right) ^AP_1 AP2=DQ(q)AP1,则:
    D Q ( q ) = [ 1 0 0 A Q x 0 1 0 A Q y 0 0 1 A Q z 0 0 0 1 ] D_Q\left( q \right) =\left[ \begin{matrix} 1& 0& 0& ^AQ_x\\ 0& 1& 0& ^AQ_y\\ 0& 0& 1& ^AQ_z\\ 0& 0& 0& 1\\ \end{matrix} \right] DQ(q)=100001000010AQxAQyAQz1
  • 绕z轴旋转算子
    对于两个坐标系 P 1 P_1 P1 P 2 P_2 P2,满足这样的旋转关系 A P 2 = R z ( θ )     A P 1 ^AP_2=R_z(\theta)\,\,^AP_1 AP2=Rz(θ)AP1,如下图所示。
    在这里插入图片描述
    那么其对应的齐次变换矩阵算子 T z ( θ ) T_z(\theta) Tz(θ)
    T z ( θ ) = [ cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 0 0 0 0 1 ] T_z\left( \theta \right) =\left[ \begin{matrix} \cos \theta& -\sin \theta& 0& 0\\ \sin \theta& \cos \theta& 0& 0\\ 0& 0& 1& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] Tz(θ)=cosθsinθ00sinθcosθ0000100001

这里可以发现,其中使用到的表达式正好是前面二维平面旋转对应的表达式。

  • 绕x轴旋转算子
    对于两个坐标系 P 1 P_1 P1 P 2 P_2 P2,满足这样的旋转关系 A P 2 = R x ( θ )     A P 1 ^AP_2=R_x(\theta)\,\,^AP_1 AP2=Rx(θ)AP1,即绕x轴逆时针旋转 θ \theta θ角度。空间想象一下,和上面各个坐标系对应一下(X指向纸面外;Y代替X;Z代替Y),可以推出齐次变换算子 T x ( θ ) T_x(\theta) Tx(θ)
    T x ( θ ) = [ 1 0 0 0 0 cos ⁡ θ − sin ⁡ θ 0 0 sin ⁡ θ cos ⁡ θ 0 0 0 0 1 ] T_x\left( \theta \right) =\left[ \begin{matrix} 1& 0& 0& 0\\ 0& \cos \theta& -\sin \theta& 0\\ 0& \sin \theta& \cos \theta& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] Tx(θ)=10000cosθsinθ00sinθcosθ00001

  • 绕y轴旋转算子
    对于两个坐标系 P 1 P_1 P1 P 2 P_2 P2,满足这样的旋转关系 A P 2 = R y ( θ )     A P 1 ^AP_2=R_y(\theta)\,\,^AP_1 AP2=Ry(θ)AP1,即绕y轴逆时针旋转 θ \theta θ角度。空间想象一下,绕z轴旋转的情况对应一下(Y指向纸面外;X代替Y;Z代替X),这里有点特殊,不能直接套用上面的样式,需要计算一下,可以得到齐次变换算子 T y ( θ ) T_y(\theta) Ty(θ)
    T y ( θ ) = [ cos ⁡ θ 0 sin ⁡ θ 0 0 1 0 0 − sin ⁡ θ 0 cos ⁡ θ 0 0 0 0 1 ] T_y\left( \theta \right) =\left[ \begin{matrix} \cos \theta& 0& \sin \theta& 0\\ 0& 1& 0& 0\\ -\sin \theta& 0& \cos \theta& 0\\ 0& 0& 0& 1\\ \end{matrix} \right] Ty(θ)=cosθ0sinθ00100sinθ0cosθ00001

4 固定角和欧拉角

  旋转矩阵虽然直观易懂,且对于公式的推导具有很大的便利,但是它也存在一个很大的问题,那就是描述一个角度需要9个变量,这在进行大量旋转运算时是很耗费性能的。但是可以发现旋转矩阵的9个变量并不是独立,而是存在6个约束条件(比如秩为1等),因此实际的变量个数为3,那能不能找到3个参数来描述空间中的旋转呢?
  最直观的想法就是将空间旋转转换到矢量绕坐标系三个轴的旋转,但是这里存在一个难点,那就是空间中的旋转是不可交换的,即先绕x轴旋转再绕y轴旋转并不等价于先绕y轴旋转再绕x轴旋转,其本质原因在于矩阵相乘并不满足交换律。因此,在寻找这三个参数时,也需要约定旋转的先后顺序。这里介绍两种比较常用的表达方式:X-Y-Z固定角Z-Y-X欧拉角

4.1 X-Y-Z固定角

   首先将坐标系{B}和一个已知的参考坐标系{A}重合,先将{B}绕 X ^ A \hat{X}_A X^A旋转 γ \gamma γ角,再绕 Y ^ A \hat{Y}_A Y^A旋转 β \beta β角,最后绕 Z ^ A \hat{Z}_A Z^A旋转 α \alpha α
  以上每一次旋转都是绕固定的坐标系A的轴,即所谓“固定”。
  根据前面总结的原则,每进行一次旋转,旋转后的坐标都要左乘一个旋转矩阵,才能得到旋转前坐标系中的坐标。因此可以推导出按照X-Y-Z旋转固定角的旋转矩阵:
在这里插入图片描述
其中 c α c\alpha cα c o s α cos\alpha cosα的缩写, s α s\alpha sα s i n α sin\alpha sinα的缩写,等等。将矩阵相乘,得到:

在这里插入图片描述
这相当于已知绕各个固定轴的旋转角,计算出其对应的旋转矩阵。那么它的逆问题就变成了已知这样一个旋转矩阵,怎么求出其对应的绕各个固定轴的旋转角,即 α , β , γ \alpha, \beta, \gamma α,β,γ
  令
在这里插入图片描述
故可以根据正余弦之间的关系求出三个旋转角:
在这里插入图片描述
其中 A t a n 2 Atan2 Atan2函数叫双反正切函数,需要传入两个参数:正弦值和余弦值,其表达式为 A t a n 2 ( s i n α , c o s α ) Atan2(sin\alpha, cos\alpha) Atan2(sinα,cosα),它会根据正余弦的正负来确定角度,因此它的函数值范围不再是-90° ~ 90°, 而是-180° ~ 180°。

4.2 Z-Y-X欧拉角

  首先将坐标系{B}和一个已知的参考坐标系{A}重合,先将{B}绕 Z ^ B \hat{Z}_B Z^B旋转 α \alpha α角,再绕 Y ^ B \hat{Y}_B Y^B旋转 β \beta β角,最后绕 X ^ B \hat{X}_B X^B旋转 γ \gamma γ
  以上每一次都是绕运动的坐标系{B}的轴旋转而不是绕固定的坐标系{A}的轴旋转,这样的三个一组的旋转称为 欧拉角。注意这里每一次旋转的轴取决于上一次的旋转。{B}初始与{A}重合,不妨假定{B}第一次旋转后得到{B’},第二次旋转得到{B’'},第三次旋转得到最终姿态{B},故{B}相对于{A}的旋转矩阵为中间坐标系对应的旋转矩阵相乘:
B A R = B ′ A R     B ′ ′ B ′ R     B B ′ ′ R _{B}^{A}R=_{B'}^{A}R\,\,_{B''}^{B'}R\,\,_{B}^{B''}R BAR=BARBBRBBR
代入旋转算子,可以得到:
在这里插入图片描述
把相乘计算出来,可以得到:
在这里插入图片描述

惊奇地发现,这个结果和上面固定角旋转得到的结果的一样的!因此可以得到一个结论:三次绕固定轴旋转的最终姿态和以相反顺序绕运动坐标系的轴转动的姿态相同。因此,如果要求出其对应的欧拉角,也可以套用上面总结的公式。

4.3 欧拉角到底指什么?

  在很多不太专业的博客中,关于欧拉角上来就是Yaw,Pitch,Roll,都没有搞清楚欧拉角是怎么定义的,是绕哪个轴在转动。
  通过对比不同领域的文献,我发现关于欧拉角的定义似乎有所差别,比如在一些文献当中,是不区分固定角和欧拉角的,绕固定轴和绕运动轴的区别称为外旋和内旋。因此,为了和上面保持一致,这里就以Z-Y-X绕运动轴旋转的角度称为欧拉角,一般用Yaw,Pitch,Roll表示。
  在讨论旋转时,首先明确一下坐标系,一般来说,会有一个世界的参考坐标系,常用右手系东北天坐标系,即“东-X,北-Y,天-Z”,如下图所示。
在这里插入图片描述
而在讨论物体姿态时,初始位置一般和参考坐标系对齐,即“前面为Y,右边为X,上面为Z”(想象一架飞机平放在你的眼前)这样直观的认识。而在讨论欧拉角转动方向时,按照“右手定则”: 坐标轴正方向为拇指所指方向,四指所指方向为转动正方向

  • 偏航角Yaw:绕Z轴转动,从X到Y为正方向(机头从右往左水平转)
    请添加图片描述

  • 俯仰角Pitch:绕X轴转动,从Y到Z为正方向(飞机从下往上抬头)
    请添加图片描述

  • 横滚角Roll:绕Y轴转动,从Z到X为正方向(飞机从左往右翻滚)
    请添加图片描述

以上图片来自参考链接

4.4 用欧拉角或固定角的弊端

  再仔细看看上面那个求固定角的表达式。
在这里插入图片描述
会发现一个问题,那就是当 β = 90 ° \beta=90\degree β=90°时, α , γ \alpha, \gamma α,γ是解不出来的,也可以将其代入到展开的矩阵当中:
B A R X Y Z ( γ , β , α ) = [ 0 c α s γ − s α c γ c α c γ + s α s γ 0 s α s γ + c α c γ s α c γ − c α s γ − 1 0 0 ] _{B}^{A}R_{XYZ}\left( \gamma ,\beta ,\alpha \right) =\left[ \begin{matrix} 0& c\alpha s\gamma -s\alpha c\gamma& c\alpha c\gamma +s\alpha s\gamma\\ 0& s\alpha s\gamma +c\alpha c\gamma& s\alpha c\gamma -c\alpha s\gamma\\ -1& 0& 0\\ \end{matrix} \right] BARXYZ(γ,β,α)=001cαsγsαcγsαsγ+cαcγ0cαcγ+sαsγsαcγcαsγ0
这只能求出 α + γ \alpha+\gamma α+γ,在一些特定场合,可以指定某个角度为多少,然后求出另一个角度,如指定 α = 0 \alpha=0 α=0

  这个问题一般称为万向节死锁(Gimbal Lock),这也是用欧拉角(固定角)表示旋转最大的问题,由此也引出了下文的四元数

5 四元数

  对于如何理解四元数,有一种公认的比较好的方式,那就是从复数角度去理解。这里提供一个学习链接,是中文翻译版的,文中也附了英文原版链接。个人建议先详细阅读一遍。

  上面的教程关于四元数旋转部分讲得不够明确,这里简单总结一下。
  用四元数来描述旋转,一般是 p 1 p_1 p1矢量绕 p 2 p_2 p2矢量转动 θ \theta θ角度” 这样的形式,同时,由于 p 1 p_1 p1 p 2 p_2 p2都是实际三维空间中的矢量,所以都是纯四元数,其对应的四元数分别是 q 1 = ( 0,  v ⃗ 1 ) q_1=\left( \text{0, }\vec{v}_1 \right) q1=(0, v 1) q 2 = ( 0,  v ⃗ 2 ) q_2=\left( \text{0, }\vec{v}_2 \right) q2=(0, v 2)

q = ( cos ⁡ θ 2 , sin ⁡ θ 2 v ⃗ 2 ) q=\left( \cos \frac{\theta}{2}, \sin \frac{\theta}{2}\vec{v}_2 \right) q=(cos2θ,sin2θv 2)

注意,这里的角度是需要旋转角度的一半,同样,其旋转的正方向也要符合右手定则。

p 1 p_1 p1旋转后的矢量 p 1 ′ p_{1}^{'} p1等于
p 1 ′ = q p 1 q ∗ p_{1}^{'}=qp_1q^* p1=qp1q
其中, q ∗ q^* q q q q的共轭四元数,其表达式如下所示。
q ∗ = ( cos ⁡ θ 2 , − sin ⁡ θ 2 v ⃗ 2 ) q^*=\left( \cos \frac{\theta}{2}, -\sin \frac{\theta}{2}\vec{v}_2 \right) q=(cos2θ,sin2θv 2)

参考链接——还有一些代码实现值得一看
四元数与欧拉角之间的转换

总结

  本文参考了教材《机器人学导论》,并借鉴了当前比较流行的教程,总结了旋转矩阵,欧拉角,四元数等的基本概念和使用,也介绍了他们各自的优缺点和转换方式,清晰易懂。

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

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

相关文章

SD NAND 的 SDIO在STM32上的应用详解(中篇)

四.SDIO功能框图(重点) SDIO包含2个部分: ● SDIO适配器模块:实现所有MMC/SD/SD I/O卡的相关功能,如时钟的产生、命令和数据的传送。 ● AHB总线接口:操作SDIO适配器模块中的寄存器(由STM32控制SDIO外设),并产生中断和…

四种区块链底层技术形态的对比解读

新世纪以来,互联网技术快速发展,催生了以平台经济为典型的各种新业态、新模式,深刻影响和改变了人类社会的生产方式、生活方式和社会治理方式。然而在推动经济和社会发展的同时,基于数据点对点传输建立的互联网也越来越多地暴露出…

可以作为艺术作品欣赏的CT三维重建技术。

什么是CT三维重建技术:简而言之就是通过螺旋CT自带的计算机软件,对扫描获得的数据进行后处理,以达到辅助医生对病变和周围组织,及其与血管的关系进行分析和显示的目的,它极大地提高了影像诊断的直观性,准确…

国际学校妈妈哭诉IB太难:中国孩子都不知道怎么答题?

听别人说考国际学校的IB体系相对简单直到我看到IB试题才知道其实IB一点都不容易特别对于中国学生有大量写论文的部分来看看IB的真题有些学生真的很难下笔不知道怎么答题啊!商科生物 题目都是非常考验综合能力的,学生需要掌握很多知识点并融会贯通&#x…

大数据学习:使用Vim编辑器

文章目录一、安装Vim编辑器二、切换三种工作模式1、命令模式2、输入模式3、末行模式三、案例演示1、将第一行内容复制粘贴到第二行之后2、删除第二行内容四、末行模式中基本操作1、案例演示任务一:显示行号任务二:取消行号任务三:存盘退出&am…

【教程】Derby数据库安装与使用

前言 环境配置只是开始,代码上的创作才是灵魂。 JDK版本:1.8.0_341 Derby版本:10.14.2.0 一、Derby安装 1. 打开 cmd 键盘按下 Windows R 打开本地 cmd (命令提示符)或 windows powershell 。 2. 查询 jdk 版本 输…

基于ARM架构openEuler系统通过qemu模拟器自动安装启动ARM架构的openEuler虚拟机

【原文链接】基于ARM架构openEuler系统通过qemu模拟器自动安装启动ARM架构的openEuler虚拟机 文章目录一、基础准备工作二、自动创建基于dhcp自动获取ip地址的openEuler虚拟机三、自动创建配置静态IP地址的openEuler虚拟一、基础准备工作 (1)下载ARM架构…

听话的苹果-第11届蓝桥杯Scratch选拔赛真题精选

[导读]:超平老师计划推出Scratch蓝桥杯真题解析100讲,这是超平老师解读Scratch蓝桥真题系列的第96讲。 蓝桥杯选拔赛每一届都要举行4~5次,和省赛、国赛相比,题目要简单不少,再加上篇幅有限,因此我精挑细选…

三车道交通流元胞自动机研究(matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

RK3288-开机电流声-SPK

开机的时候明显听到爆炸电流声 然后关闭开机铃声后发现触摸的第一下有爆炸电流声 然后思路就是去掉电流声 然后我的方法是开机让使能脚为低,开机之后等开机铃声触发掉爆炸电流声后在使能, spk_con_gpio=<&gpio7 15 GPIO_ACTIVE_HIGH>; DTS匹配上先置低电平 UBOO…

毕业设计 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录0 前言课题背景分析方法与过程初步分析&#xff1a;总体流程&#xff1a;1.数据探索分析2.数据预处理3.构建模型总结最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业…

了解Docker 依赖的linux内核技术

深入理解SR-IOV和IO虚拟化 一文了解Linux上TCP的几个内核参数调优 一文剖析Linux内核中内存管理 分析linux启动内核源码 一文剖析Linux内核中内存管理 NamespaceCgroupUnionFS docker 的实现&#xff0c;主要依赖 linux 的 namespace、cgroup 和 unionFS 三种技术实现&#xf…

【学习笔记】Python+request+Unittest接口测试入门

PythonrequestUnittest接口测试入门 接口测试流程 1.需求分析&#xff08;产品经理的需求文档&#xff09; 2.接口文档解析&#xff08;开发编写的接口API文档&#xff09; 3.设计接口测试用例&#xff08;编写Excel表格形式的用例&#xff09; 4.准备接口测试脚本&#xff1…

使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dashboard页面

文章目录使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dashboard页面具体实现代码展示主展示页面懒加载组件组件加载时展示的组件dashboard菜单组件具体的图表组件Demo演示使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dash…

线段树模板(Java)

线段树一、线段树概念二、线段树模板1.建树2. 单点修改3.区间查询4.完整代码及测试一、线段树概念 线段树是一种二叉搜索树&#xff0c;与区间树相似&#xff0c;它将一个区间划分成一些单元区间&#xff0c;每个单元区间对应线段树中的一个叶结点。它的主要优势是对于区间求和…

PacBio HiFi 测序动植物基因组项目真实案例测评

HiFi Reads全称High fidelity reads, 是PacBio公司基于Sequel II平台产出的兼具长读长和高准确度的测序序列&#xff0c;该测序模式&#xff08;CCS测序模式&#xff09;一经问世&#xff0c;备受广大组学科研用户关注——其超长读长完美规避了二代测序short reads的天生不足&a…

【密码加密原则三】

目录 1 密码加密原则&#xff08;续&#xff09; 1.1 盐值的优化 1.2 Mybatis中的占位符 1 密码加密原则&#xff08;续&#xff09; 1.1 盐值的优化 为了进一步保障密码安全&#xff0c;可以考虑使用随机的盐值&#xff0c;但是&#xff0c;需要注意&#xff0c;随机的盐…

Java高效率复习-MySQL下篇[MySQL]

前言 本文章的语言描述会比上篇多一些 数据库的创建修改与删除 标识符命名规则 数据库名、表名不得超过30个字符&#xff0c;变量限制为29个必须只能包含A-Z&#xff0c;a-z&#xff0c;0-9&#xff0c;_等63个字符数据库名、表名、字段名等对象名中间不要包含空格同一个My…

生产环境 Nginx后端服务大量TIME-WAIT的解决

netstat -n | awk /^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]} ss -s netstat -nat |awk {print $6}|sort|uniq -c|sort -rn 统计TIME_WAIT 连接的本地地址 netstat -an | grep TIME_WAIT | awk {print $4} | sort | uniq -c | sort -n -k1 尝试抓取 tcp 包 tcpd…

工业CT之三维重建技术

目前&#xff0c;国内现有的工业CT设备绝大多数是基于线阵探测器的断层扫描技术。 该技术主要是通过观察二维图像去发现单层断面上的损伤部位&#xff0c;至于能准确地确定损伤部位的空间位置、大小、几何形状等&#xff0c;仅通过观察二维切片图像是很难实现的。 这个时候就需…