欧拉角与旋转矩阵

1. 欧拉角

在这里插入图片描述

1.1欧拉角的表示

我们想描述刚体在现实世界的旋转时,可以用旋转矩阵、旋转向量,四元数等来表示,虽然它们能描述旋转,但对我们人类是非常不直观的。很难说,给你一个旋转矩阵R或者四元数q,我们能想象出他是怎么旋转的。

欧拉角就可以很直观的展现这种旋转的过程。因为他把整个旋转过程分解成了绕指定坐标轴顺序的三次旋转。当然,由于分解方式有许多种,所以欧拉角也存在着不同的定义方法。

①绕轴顺序, 比如按ZYX顺序来转如下图。
在这里插入图片描述
当然,也有别的顺序,比如XYZ,ZXY,XZY等。
②围绕的轴的类型,是绕固定轴还是绕自身轴,上面那个例子就是绕自身轴转的,下面给出一个绕固定轴转的欧拉角情况。
可以看到下面每次的旋转都绕黑色实线构成的坐标系转动。
在这里插入图片描述

1.2内旋和外旋

有了1.1的介绍,知道了欧拉角的表示有两个条件,一个是绕轴顺序,一个是绕的轴是不是固定轴,那么就有了内旋和外旋的概念。

①每次旋转是绕固定轴(一个固定参考系,比如世界坐标系)旋转,称为外旋。
②每次旋转是绕自身旋转之后的轴旋转,称为内旋。

人们对概念的理解很容易,最容易忽视的点就是我们通过欧拉角来进行旋转矩阵的计算的时候,用公式怎么表示这两种旋转方式:
下面我们用公式来表示上面两个图的表示情况:
在这里插入图片描述
解析:首先旋转顺序是ZYX,其次是绕自身轴旋转的,这种情况就叫做内旋。
注意:内旋是右乘
在这里插入图片描述
我们按照ZYX的顺序从左到右依次相乘。
在这里插入图片描述
解析:首先旋转顺序是XYZ,其次是绕固定轴旋转的,这种情况就叫做外。
注意:内旋是左乘
在这里插入图片描述
我们按照XYZ的顺序从右到左依次相乘。
值得注意的是在旋转相同的角度的情况下不同的旋转顺序得到的姿态是不一样的。这个你可以自己去验证。
但是上面的例子得出来的旋转矩阵是一样的,这说明了绕ZYX顺序的内旋方式和绕XYZ的外旋方式,得到的姿态一样的,也就是他俩等价

1.3 欧拉角的缺点

欧拉角的缺点就是万向锁问题。
在这里插入图片描述
上方为 ZYX 角定义。下方为 pitch=90 度时,第三次旋转与第一次滚转角相同,使得系统丢失了一个自由度。也就是说第一次旋转和第三次旋转虽说是绕各自不同的轴转动的,但实际上他绕的就是同一个轴。按照欧拉角的思想,只用两个角就可以表示出来啊,就是想让除了绕Z轴之外的两个轴,其中一个先转180°,然后再只调整一个轴就好了。
关于万向锁的理解这里有一篇博客,可以参考一下。

2 欧拉角到旋转矩阵的表示

假设绕XYZ三个轴旋转的角度分别为α , β , γ,则三次旋转的旋转矩阵计算方法如下:
在这里插入图片描述
把这个套到1.2节的公式中就可以了。

3 值得注意的点

一般情况下,每一个领域有自己默认的欧拉角定义,也就是24种的其中之一。比如经典力学中使用zxz,量子力学使用的是zyz,航空航天使用zyx/zxy。所以在跨行业或者跨模块协作的时候,一定要问清楚对方是哪一种欧拉角。

为什么不同专业选用的欧拉角不同呢?一个是传统,另一重要的原因是不同的转序和不同的轴对应的万向节死锁的位置是不一样的,因此每个专业都想把万向节死锁的位置安排在自己最不常用的位置。但是,无论哪一种欧拉角都是避免不了万向节死锁的。

欧拉角不可以做连续旋转的计算。
假设我们对物体进行一次欧拉角描述的旋转,三个欧拉角分别是(a1,a2,a3),之后我们再进行一次旋转,三个欧拉角描述是(b1,b2,b3),那么我们能否只用一次旋转(使用欧拉角描述(c1,c2,c3))来达到这两次旋转相同的效果呢?事实上这样是非常困难的,我们不能够仅仅使用(a1+b1,a2+b2,a3+b3)来得到这三个角度。一般来说我们会将欧拉角转换成旋转矩阵或者是四元数来进行连续旋转的叠加计算,之后再转换回欧拉角。但是这样做的次数多了可能会引入很大的误差导致旋转结果出错。因此比较好的方案是直接使用旋转矩阵或四元数来计算这类问题。

4. 非常感谢您的阅读!

5 期待您加入

也非常期待您能关注我的微信公众号–“过千帆”,里面不仅有技术文章还有我的读书分享,希望您在那里也有收获。我们一起进步。

### 将欧拉角转换为旋转矩阵 在计算机图形学和机器人技术中,为了表示三维空间中的物体姿态,通常会采用欧拉角来描述绕三个轴的旋转角度。当需要将这些角度转化为更易于处理的形式时,则可以构建对应的旋转矩阵。 对于标准顺序ZYX(即先沿Z轴转ψ度、再沿着新的Y轴转动θ度最后围绕新坐标系下的X轴旋转向量φ),其组合后的总变换可由下面公式给出: \[ R = R_x(\phi) \cdot R_y(\theta)\cdot R_z(\psi) \] 其中各个分量具体表达如下[^1]: - 绕 Z 轴旋转的角度 ψ 对应于 \(R_z\) 的定义为: \[ R_{z}=\begin{bmatrix} cos\psi & -sin\psi&0\\ sin\psi &cos\psi&0 \\ 0&0&1 \end{bmatrix} \] - 接着按照更新后的 Y' 轴方向做 θ 度偏航运动形成 \(R_y\) : \[ R_{y}= \begin{bmatrix} cos\theta & 0 & sin\theta\\ 0 & 1 & 0\\ -sin\theta & 0 & cos\theta \end{bmatrix} \] - 最终依据最新的 X'' 坐标轴完成 φ 角倾斜动作得到 \(R_x\) : \[ R_{x}= \begin{bmatrix} 1 & 0 & 0\\ 0 & cos\varphi & -sin\varphi\\ 0 & sin\varphi & cos\varphi \end{bmatrix} \] 通过依次相乘上述单轴旋转矩阵即可获得完整的旋转效果。值得注意的是,在实际应用过程中可能会遇到不同的约定方式,比如XYZ或其他序列;因此实现前应当确认所使用的惯例是什么样的[^2]。 Python代码示例如下所示: ```python import numpy as np def euler_to_rotation_matrix(phi, theta, psi): """ Convert Euler angles (in radians) into a rotation matrix. Args: phi(float): Rotation around the x-axis. theta(float): Rotation around the y'-axis after rotating by phi. psi(float): Rotation around the z''-axis after rotating by both previous rotations. Returns: ndarray: A 3x3 rotation matrix representing these three consecutive rotations. """ # Define individual axis rotation matrices based on input parameters Rx = np.array([[1, 0, 0], [0, np.cos(phi), -np.sin(phi)], [0, np.sin(phi), np.cos(phi)]]) Ry = np.array([[np.cos(theta), 0, np.sin(theta)], [0, 1, 0], [-np.sin(theta), 0, np.cos(theta)]]) Rz = np.array([[np.cos(psi), -np.sin(psi), 0], [np.sin(psi), np.cos(psi), 0], [ 0, 0, 1]]) # Multiply them together according to Tait-Bryan convention (zyx) return Rz @ Ry @ Rx ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

宛如新生

转发即鼓励,打赏价更高!哈哈。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值