旋转矩阵与四元数、欧拉角的关系,以及如何通过四元数解算欧拉角,一篇文章讲清楚

旋转矩阵

所谓旋转,是指一个坐标系到另一个坐标系的变换。一个坐标系,对应着一种描述世界的“尺度”和“角度”,这里我们描述的对象为向量(vector)。

假定存在目标向量 α \alpha α α \alpha α客观存在,客观静止。此时我想要去描述这个向量,那么我可以选定一个参考系(坐标系),以此为基准去描述该向量。假设此时有两个参考系W(大地坐标系)和B(机体坐标系),在W下 α \alpha α k w = ( x 0 , y 0 , z 0 ) k_w=(x0,y0,z0) kw=(x0,y0,z0),而在B下 α \alpha α k b = ( x 1 , y 1 , z 1 ) k_b=(x1,y1,z1) kb=(x1,y1,z1),那么这两个向量其实描述的是一个东西,只是参考系不同。

由于W和B之间存在一个相对位置关系,因此不难理解kw和kb之间也存在着一个“必然”的联系,而这个“联系”就是所谓的“旋转矩阵”。存在这样一个关系:
k b = C w b ∗ k w k_b=C_w^b * k_w kb=Cwbkw
C w b C_w^b Cwb便是“W坐标系到B坐标系”的旋转变化矩阵, C w b C_w^b Cwb只跟W和B的相对位置关系有关,反映了W到B的一个“变化”,可以把它理解为一个“动作”。

那么具体拆解, C w b C_w^b Cwb是一个3*3的矩阵 ∣ a b c d e f g h i ∣ \left|\begin{matrix} a & b & c \\ d & e & f \\ g & h & i \end{matrix} \right| adgbehcfi ,如果更具象一点理解它,该矩阵的每一列分别代表了W坐标系xyz三轴在B系的投影,比如说,原先 X w X_w Xw在W系下描述为(1,0,0),而 X w X_w Xw(仍如刚才所说,向量客观静止不变)在B系下的描述就为(a,d,g)。

事实上,正如刚才所说, C w b C_w^b Cwb只跟W和B的相对位置关系有关,因此,对于任何一个向量,关于其在W和B下的描述,都存在上述的变换关系。

而想要将向量从B系的描述转为W系的描述,自然也存在一个 C b w C_b^w Cbw,而 C w b C_w^b Cwb C b w C_b^w Cbw又“恰巧”存在这样一个关系:
C b w = ( C w b ) T C_b^w = (C_w^b)^T Cbw=(Cwb)T

欧拉角

欧拉角在姿态的描述非常的常见,那么它与刚才的旋转矩阵又有什么样的关系呢?还记得刚才提过,旋转矩阵是描述W到B的“动作”,那么这个“动作”的具体分解其实就是欧拉角。

W到B的动作过程中,我们肯定希望动作的过程“有序”,“规范”,而不是“稀里糊涂”就过去了,这样显然更利于我们的理解和描述。自然而然的,我们想到W先绕某个轴旋转若干度,再绕某个轴旋转若干度。。。最后与B重合。这就与我们的欧拉角很接近了。

一般我们如下图建立坐标系,机头方向为X,机翼方向为Y,上下为Z。

在这里插入图片描述

默认地,称绕Z轴旋转的角为偏航角(yaw, ψ \psi ψ),绕Y轴旋转的为俯仰角(pitch, θ \theta θ),绕X轴旋转的角为横滚角(roll, ϕ \phi ϕ)。建系的同时也规定了旋转的正方向,即:
从原点向轴的正方向看,顺时针为该轴旋转的正方向 从原点向轴的正方向看,顺时针为该轴旋转的正方向 从原点向轴的正方向看,顺时针为该轴旋转的正方向

那么假定W和B现在都确定了,我现在想要用欧拉角来描述W到B的变换,那么这个“描述”与什么有关呢?假设我有以下两次描述:

第一次:
W先绕Z轴旋转yaw度,然后绕Y轴(旋转后的Y轴)旋转pitch度,最后绕X轴旋转roll度,到达B
第二次:
W先绕X轴旋转roll度,再绕Y轴旋转pitch度,最后绕Z轴旋转yaw度,到达B

W和B都是固定的,即“起点”和“终点”都是确定的,那么两次的(yaw,pitch,roll)对应相等吗?答案显然是否定的,也就是说,尽管描述的是同一个“动作”,欧拉角的大小与旋转顺序有关。

第一次的旋转顺序是 “Z-Y-X” 而第二次是 “X-Y-Z”。

而在航模有关的领域中,我们一般习惯用“Z-Y-X”的顺序,姿态模拟常用的软件“匿名四轴上位机”的协议也是默认这个顺序。因此,接下来讲的欧拉角默认都是这个顺序

那么,欧拉角与我们的旋转矩阵又有什么关系呢?

W系经过“Z(yaw)-Y(pitch)-X(roll)”这一旋转过程到达B,过程中实际还经历两个坐标系,分别记为1系和2系
W ⟶ C w 1 y a w 1 ⟶ C 1 2 p i t c h 2 ⟶ C 2 b r o l l B W\underset{yaw}{\overset{C_w^1}{\longrightarrow}}1\underset{pitch}{\overset{C_1^2}{\longrightarrow}}2\underset{roll}{\overset{C_2^b}{\longrightarrow}}B WyawCw11pitchC122rollC2bB
那么假设有一个向量 α w \alpha_w αw(始终静止),描述于W系下,经过 C w 1 C_w^1 Cw1的变换到达 α 1 \alpha_1 α1(以1系为参考描述的),也就是左乘一个 C w 1 C_w^1 Cw1,那么如何求 C w 1 C_w^1 Cw1呢?记得在旋转矩阵那一节中笔者提到过这样一句话:
该矩阵的每一列分别代表了 W 坐标系 x y z 三轴在 B 系的投影 该矩阵的每一列分别代表了W坐标系xyz三轴在B系的投影 该矩阵的每一列分别代表了W坐标系xyz三轴在B系的投影
这句话是我们推导欧拉角到旋转矩阵的关键。

试想,W系三轴(xyz)在1系中的投影是什么,不难知道(画个草图即可看出),是:
∣ cos ⁡ ψ sin ⁡ ψ 0 − sin ⁡ ψ cos ⁡ ψ 0 0 0 1 ∣ \left|\begin{matrix} \cos\psi & \sin\psi & 0 \\ -\sin\psi & \cos\psi & 0 \\ 0 & 0 & 1 \end{matrix} \right| cosψsinψ0sinψcosψ0001
这个便是 C w 1 C_w^1 Cw1,同理可得 C 1 2 C_1^2 C12 C 2 b C_2^b C2b,于是有:
α b = C 2 b C 1 2 C w 1 α w \alpha_b=C_2^b C_1^2 C_w^1 \alpha_w αb=C2bC12Cw1αw
等式右侧是左结合的,因此要从右往左去理解。那么不难发现,运用结合律其实 C w b = C 2 b C 1 2 C w 1 C_w^b=C_2^b C_1^2 C_w^1 Cwb=C2bC12Cw1,见下图:

在这里插入图片描述

那么至此,欧拉角便和旋转矩阵建立了联系,二者相互转换。

内旋和外旋

这里顺便提一下外旋内旋的概念,其实很简单,第一次旋转后到达1系后,下一次旋转时所说的是1系的轴还是最初W系的“轴”,若是指1系的轴,则为内旋;若是从始至终都是W系的“轴”,则为外旋。文中所指皆默认内旋。

关于死锁

使用欧拉角描述存在这样一个bug,即万向节死锁(Gimbal Lock),这里需要明确一点,死锁只存在于内旋的情况中。

那么什么叫死锁?同样还是以yaw-pitch-roll的顺序,假定pitch的值(第二个旋转角)为±90度,那么会发现,等到roll旋转时,彼时的x轴跟最开始的z轴重合,也就是说,这时的roll角,与开始的yaw角,表示的是同一个“自由度”。这时的roll角转动效果完全可以“转移”到一开始的yaw角,无非就是yaw开始时多转一点或者少转一点。3个自由度变成了2个自由度,丢失了一个自由度,这便是死锁。

下图是一个普通的欧拉旋转,不是死锁,可以看着理解(该图是Z-Y-Z的顺序,注意区分):

在这里插入图片描述

四元数

由于欧拉角存在“死锁”的bug,因此引入四元数这个概念,可以消除bug,除此之外,四元数还具有很多优越性。四元数有关的知识,证明较为复杂,本文不做非常深入的分析,更多是认知性的结论与理解,达到使用的目的


轴角法

在讲四元数之前要先引入“轴角法”,如果说欧拉角是将变换分解为三个动作,那么轴角法便是“一步到位”。试想任何一个旋转,无非就是明确:
旋转轴 η ,旋转角度 α 旋转轴 \eta,旋转角度 \alpha 旋转轴η,旋转角度α
那么W到B的旋转,是不是可以找到这样的一组 ( η , α ) (\eta,\alpha) (η,α),描述该旋转?

答案是肯定的,而且,这样的一组 ( η , α ) (\eta,\alpha) (η,α)是存在且唯一的。

用这样的 ( η , α ) (\eta,\alpha) (η,α)去描述变换就叫“轴角法”。


那么回到我们的四元数,顾名思义,四元数有4个信息量, q = ( q 0 , q 1 , q 2 , q 3 ) q=(q0,q1,q2,q3) q=(q0,q1,q2,q3),具象上的理解:
q = 1 个实数 + 1 个向量 q=1个实数+1个向量 q=1个实数+1个向量
因此四元数还可以表示成 q = ( θ , υ ) q=(\theta,\upsilon) q=(θ,υ) q 0 q0 q0就是这个实数, q 1 , q 2 , q 3 q1,q2,q3 q1,q2,q3便是向量的三个维度。

对于一个纯向量,用四元数表示时其 q 0 = 0 q0=0 q0=0,余下三个维度正常,这样的四元数我们称为纯四元数。一般来说,要描述的对象(向量)都是一个纯四元数,描述的动作都是一个非纯四元数。

那么如何将轴角法构造成一个四元数呢?这里直接给出结论:
q = ( cos ⁡ α 2 , η sin ⁡ α 2 ) q=(\cos\frac{\alpha}{2},\eta\sin\frac{\alpha}{2}) q=(cos2α,ηsin2α)
且这里进一步地规定, η \eta η是一个单位向量。

那么有 q q q是一个单位四元数(模长为1),那么假设有一个向量 υ \upsilon υ,经过轴角 ( η , α ) (\eta,\alpha) (η,α)变换为 v ′ v' v,那么变换关系为:
v ′ = q ∗ v ∗ q − 1 v'=q*v*q^-1 v=qvq1
注意,这里的乘法是四元数特有的乘法“Graßmann积”


Graßmann积

假设有四元数 k 1 = ( a , α ) , k 2 = ( b , β ) k1=(a,\alpha),k2=(b,\beta) k1=(a,α),k2=(b,β),那么他们的Graßmann积为:
k 1 ∗ k 2 = ( a b − α β , a β + b α + α × β ) k1*k2=(ab-\alpha\beta,a\beta+b\alpha+\alpha\times\beta) k1k2=(abαβ,aβ+bα+α×β)


q − 1 q^-1 q1 q q q的逆,即 q ∗ q − 1 = 1 q*q^-1=1 qq1=1,由于 q q q是单位四元数, q − 1 = q ∗ ( q 的共轭 , 实数部分不变,向量部分取反 ) q^-1=q^*(q的共轭,实数部分不变,向量部分取反) q1=q(q的共轭,实数部分不变,向量部分取反)

由此,四元数 q q q可以视作一个变换(w系到b系的变换),那么 q q q与旋转矩阵又有什么联系呢?这里直接给出结论:
C w b = ∣ 1 − 2 q 2 2 − 2 q 3 2 2 ( q 1 q 2 + q 0 q 3 ) 2 ( q 1 q 3 − q 0 q 2 ) 2 ( q 1 q 2 − q 0 q 3 ) 1 − 2 q 1 2 − 2 q 3 2 2 ( q 2 q 3 + q 0 q 1 ) 2 ( q 1 q 3 + q 0 q 2 ) 2 ( q 2 q 3 − q 0 q 1 ) 1 − 2 q 1 2 − 2 q 2 2 ∣ C_w^b=\left|\begin{matrix} 1-2q_2^2-2q_3^2 & 2(q_1q_2+q_0q_3) & 2(q_1q_3-q_0q_2) \\ 2(q_1q_2-q_0q_3) & 1-2q_1^2-2q_3^2 & 2(q_2q_3+q_0q_1) \\ 2(q_1q_3+q_0q_2) & 2(q_2q_3-q_0q_1) & 1-2q_1^2-2q_2^2 \end{matrix} \right| Cwb= 12q222q322(q1q2q0q3)2(q1q3+q0q2)2(q1q2+q0q3)12q122q322(q2q3q0q1)2(q1q3q0q2)2(q2q3+q0q1)12q122q22

结合欧拉角那节的结论,

C w b = ∣ cos ⁡ θ cos ⁡ ψ cos ⁡ θ sin ⁡ ψ − sin ⁡ θ sin ⁡ ϕ sin ⁡ θ cos ⁡ ψ − cos ⁡ ϕ sin ⁡ ψ sin ⁡ ϕ sin ⁡ θ sin ⁡ ψ + cos ⁡ ϕ cos ⁡ ψ sin ⁡ ϕ cos ⁡ θ cos ⁡ ϕ sin ⁡ θ cos ⁡ ψ + sin ⁡ ϕ sin ⁡ ψ cos ⁡ ϕ sin ⁡ θ sin ⁡ ψ − sin ⁡ ϕ cos ⁡ ψ cos ⁡ ϕ cos ⁡ θ ∣ C_w^b=\left|\begin{matrix} \cos\theta\cos\psi & \cos\theta\sin\psi & -\sin\theta \\ \sin\phi\sin\theta\cos\psi-\cos\phi\sin\psi & \sin\phi\sin\theta\sin\psi+\cos\phi\cos\psi & \sin\phi\cos\theta \\ \cos\phi\sin\theta\cos\psi+\sin\phi\sin\psi &\cos\phi\sin\theta\sin\psi-\sin\phi\cos\psi & \cos\phi\cos\theta \end{matrix} \right| Cwb= cosθcosψsinϕsinθcosψcosϕsinψcosϕsinθcosψ+sinϕsinψcosθsinψsinϕsinθsinψ+cosϕcosψcosϕsinθsinψsinϕcosψsinθsinϕcosθcosϕcosθ

在W和B确定时,转换关系确定, C w b C_w^b Cwb自然也是确定且唯一的,因此这两个 C w b C_w^b Cwb矩阵完全相等,对应的元素也相等。

也就是说,当知道四元数时,我们可以完全地解出这个姿态矩阵 C w b C_w^b Cwb,解出矩阵的目的往往是为了去解算欧拉角,这里很显然,我们可以用解反三角函数的方法。

由于两个矩阵的对应元素相等,对号入座,因此有:
ψ = a t a n 2 ( 2 ( q 1 q 2 + q 0 q 3 ) , 1 − 2 q 2 2 − 2 q 3 2 ) θ = a r c s i n ( 2 ( q 0 q 2 − q 1 q 3 ) ) ϕ = a t a n 2 ( 2 ( q 2 q 3 + q 0 q 1 ) , 1 − 2 q 1 2 − 2 q 2 2 ) \psi=atan2(2(q1q2+q0q3),1-2q2^2-2q3^2)\\ \theta=arcsin(2(q0q2-q1q3))\\ \phi=atan2(2(q2q3+q0q1),1-2q1^2-2q2^2) ψ=atan2(2(q1q2+q0q3),12q222q32)θ=arcsin(2(q0q2q1q3))ϕ=atan2(2(q2q3+q0q1),12q122q22)


关于atan

关于函数“ a t a n atan atan”,某些朋友可能比较陌生,其实跟“ a r c t a n arctan arctan”是类似的含义,就是值域会扩大一些,后者的值域只有-90~90,前者可以到-180~180。因为前者将分子分母拆开输入,保留了分子分母符号的信息。


那么至于如何更新四元数,请移步《GY-86传感器的校准及使用》

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值