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

这篇具有很好参考价值的文章主要介绍了【学习笔记】空间坐标系旋转与四元数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

0 前言

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

旋转矩阵和齐次变换矩阵部分主要参考自教材 《机器人学导论》 中的第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坐标系下的x,y坐标,求该点在B坐标系下的x,y坐标,就可以左乘一个旋转矩阵,从而得到新坐标系下的x,y坐标。

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}^{A}R^{\,\,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[ \begin{matrix} ^A\hat{X}_B& ^A\hat{Y}_B& ^A\hat{Z}_B\\ \end{matrix} \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}^{A}R^{\,\,B}P AP=BARBP :等号两边是等价的,左边是矢量在旋转前坐标系{A}中的表示,等式右边由于 B P ^BP BP是在旋转后坐标系{B}中的表示,所以要左乘一个{B}相对于{A}的旋转矩阵,将这个旋转给 “抵消”

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

  此外, [ A X ^ B A Y ^ B A Z ^ B ] \left[ \begin{matrix} ^A\hat{X}_B& ^A\hat{Y}_B& ^A\hat{Z}_B\\ \end{matrix} \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=^{B}P 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).

2.3 旋转矩阵的两种含义【重点!】 //2023.2.26

  最近因为项目需要,重新阅读这篇博客时,发现一个问题,那就是对于多个旋转矩阵相乘的情况,始终不是很明白,在一个同学的帮助下,找到一篇写得非常好的博客,让我对旋转矩阵的乘法有了一个更深的理解。

  • 旋转矩阵及左右乘的意义,看这一篇就够了

  旋转矩阵其实有两重含义,分别是 坐标变换旋转向量 。在上面提到的《机器人学导论》教材中也提到了这样一句话:
【学习笔记】空间坐标系旋转与四元数
即坐标变换和旋转向量虽然都是对应同一个旋转矩阵,但其理解的含义还是有很大差别的,尤其是有多次旋转操作时。

  • 坐标变换
    所谓坐标变换,是指一个向量在不同坐标系下有不同的坐标表示,需要在已知旋转矩阵 和 向量在旋转后坐标系中的坐标表示,来求该向量在旋转前坐标系中的坐标表示。 此时 A P = B A R    B P ^AP=_B^AR^{\,\, B}P AP=BARBP中的 B A R _B^AR BAR可以理解为一种“回退”或者“撤销”,所以如果发生了多次旋转,那么应该以旋转后的最终状态为起点,从最近一次旋转开始,依次左乘一个旋转变换矩阵;那如果以旋转前的初始状态为起点,从最早的一次旋转开始,依次右乘对应的旋转变换矩阵。这样才能“抵消”旋转产生的影响,求出向量在旋转前坐标系中的坐标表示。

  • 旋转向量
    所谓旋转向量,是指坐标系不动的情况下旋转向量,已知向量旋转前的坐标表示和旋转矩阵,求出向量旋转后的坐标表示。那么如果向量发生多次旋转,应该是按照旋转顺序依次左乘对应的旋转矩阵

这里可能会不太能理解,但是没关系,可以先看后面的固定角和欧拉角部分。

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 Q = [ q x q y q z ] T ^AQ=\left[ \begin{matrix} q_x& q_y& q_z\\ \end{matrix} \right] ^T AQ=[qxqyqz]T 将其用齐次变换矩阵对应的算子表示,即 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 q x 0 1 0 q y 0 0 1 q z 0 0 0 1 ] D_Q\left( q \right) =\left[ \begin{matrix} 1& 0& 0& q_x\\ 0& 1& 0& q_y\\ 0& 0& 1& q_z\\ 0& 0& 0& 1\\ \end{matrix} \right] DQ(q)= 100001000010qxqyqz1
  • 绕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=BARB′′BRBB′′R
代入旋转算子,可以得到:
【学习笔记】空间坐标系旋转与四元数
把相乘计算出来,可以得到:
【学习笔记】空间坐标系旋转与四元数

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

  如果不理解上面固定角和欧拉角的区别,建议再次阅读2.3章节。
  对于固定角,可以按照旋转向量的角度来理解。即存在一个向量绕一个固定的坐标系的三个轴发生了三次旋转,因此应该从右往左看,依次左乘,相当于依次旋转这个向量。
  对于欧拉角,可以按照坐标变换的角度来理解。即假定有一个向量方向始终没变,但是坐标系相对于原坐标系发生了三次旋转,而且是已知旋转后的坐标系中该向量的坐标,要求该向量在原坐标系中的坐标表示。因此应该以最终的一次旋转为起点,依次左乘对应的旋转算子。


  上面的这种情况可以概括为:左乘旋转矩阵绕固定坐标系旋转,右乘旋转矩阵绕自身坐标系旋转。 注意这里的左乘和右乘是指多个矩阵之间的关系,而不是矩阵和坐标向量之间的关系,后者固定是左乘。

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)

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

总结

  本文参考了教材《机器人学导论》,并借鉴了当前比较流行的教程,总结了旋转矩阵,欧拉角,四元数等的基本概念和使用,也介绍了他们各自的优缺点和转换方式,清晰易懂。文章来源地址https://www.toymoban.com/news/detail-429048.html

到了这里,关于【学习笔记】空间坐标系旋转与四元数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • matplotlib 齐次坐标系 绘制旋转 3D 立体

    齐次坐标系描述了刚体的坐标系、位置,而且还提供了一套相对旋转、相对移动、绝对旋转、绝对移动的方法,用来绘制旋转的 3D 立体是再好不过的选择 将笛卡尔坐标系的三个轴记为 ,将任意的齐次坐标系记为 我们使用这样一个矩阵来描述 坐标系与 坐标系之间的关系:

    2024年02月09日
    浏览(40)
  • 【UnityShader入门精要学习笔记】第四章(1)坐标系

    本系列为作者学习UnityShader入门精要而作的笔记,内容将包括: 书本中句子照抄 + 个人批注 项目源码 一堆新手会犯的错误 潜在的太监断更,有始无终 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 (该系列笔记中大多数都会复习前文的知识,特别是前文知识非

    2024年01月20日
    浏览(42)
  • 无人机中的坐标系、旋转矩阵与相机姿态计算

    球坐标系 球坐标系是三维坐标系中的一种,在无人机中一般使用球坐标系来表示相机姿态,相机姿态的坐标是相对于无人机的,而无人机的飞行姿态则是相对于大地坐标系的。这里我们使用的相机是2自由度的相机,即可以水平 ϕ phi ϕ 和垂直 θ theta θ 两个方向转动,其中

    2024年02月12日
    浏览(40)
  • 2D坐标系下的点的转换矩阵(平移、缩放、旋转、错切)

    1. 平移 (Translation) 在2D空间中,我们经常需要将一个点平移到另一个位置。假设空间中的一点 P ( x , y ) P(x,y) P ( x , y ) ;将其向 x , y x, y x , y 方向分别平移 t x t_x t x ​ , t y t_y t y ​ , 假设平移后点的坐标为 ( x ′ , y ′ ) (x\\\',y\\\') ( x ′ , y ′ ) ,则上述点的平移操作可以归纳为

    2024年02月15日
    浏览(39)
  • ENVI为遥感影像设置空间坐标系的方法

      本文介绍基于 ENVI 软件,对 不含有任何地理参考信息 的栅格遥感影像添加 地理坐标系 或 投影坐标系 等 地理参考信息 的方法。   我们先来看一下本文需要实现的需求。现有以下两景遥感影像,其位于不同的空间位置;但由于二者均不含任何地理参考信息,导致其在

    2024年03月13日
    浏览(42)
  • 空间直角坐标系(XYZ)转经纬度(BLH)

    本章首先介绍空间直角坐标系与大地坐标系,然后列出XYZ转换BLH的公式,最后基于C语言完成该部分代码设计。   参考书籍: 董大男,陈俊平,王解先等,GNSS高精度定位原理,科学出版社 黄丁发,熊永良,周乐韬等,GPS卫星导航定位技术与方法,科学出版社。   空间直角坐

    2023年04月15日
    浏览(42)
  • 坐标转换-使用geotools读取和转换地理空间表的坐标系(sqlserver、postgresql)

    业务上通过GIS软件将空间数据导入到数据库时,因为不同的数据来源和软件设置,可能导入到数据库的空间表坐标系是各种各样的。 如果要把数据库空间表发布到geoserver并且统一坐标系,只是在geoserver单纯的设置坐标系只是改了定义并没有实际执行坐标转换,所以需要在数据

    2024年02月14日
    浏览(48)
  • 3Dslicer医学图像三维坐标系(xyz,RAS,IJK)差异,转换,旋转,平面角

    目录 World coordinate system世界坐标系xyz Anatomical coordinate system解剖学坐标系(LPS/RAS/RAI) Image coordinate system图像坐标系ijk Image transformation图像转换 三维坐标变换 A.旋转矩阵和旋转向量 B.欧拉角 C.四元数​编辑 计算平面角Angle Planes插件 参考链接 处理医学图像和应用程序时的问题之一

    2024年01月17日
    浏览(156)
  • 用ArcGIS模型构建器生成、导出Python转换空间坐标系的代码

      本文介绍在 ArcMap 软件中,通过创建 模型构建器 ( ModelBuilder ),导出 地理坐标系 与 投影坐标系 之间相互 转换 的 Python 代码的方法。   在 GIS 领域中,矢量、栅格图层的投影转换是一个经常遇见的问题;而由于地理坐标系与投影坐标系各自都分别具有很多不同的种

    2024年01月18日
    浏览(47)
  • Unity学习——坐标系

      在Unity中所有物体都处于坐标系中,了解坐标系的基本内容十分有必要。这篇文章就简单介绍一下Unity中关于坐标系的相关内容   Unity中共包含四类坐标系:     1)世界坐标系(全局坐标系)     2)本地坐标系(局部坐标系)     3)屏幕坐标系     4)视

    2024年02月01日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包